Remove <- operator from the compiler

Yield an obsolete syntax error on things like "let foo <- bar;"
and "foo <- bar;" r=brson

Progress on #3466
This commit is contained in:
Tim Chevalier 2012-10-23 11:28:20 -07:00
parent 48c8d1fecd
commit 087cbb55d0
19 changed files with 53 additions and 132 deletions

View file

@ -20,7 +20,8 @@ use obsolete::{
ObsoleteLowerCaseKindBounds, ObsoleteLet,
ObsoleteFieldTerminator, ObsoleteStructCtor,
ObsoleteWith, ObsoleteClassMethod, ObsoleteClassTraits,
ObsoleteModeInFnType, ObsoleteByMutRefMode
ObsoleteModeInFnType, ObsoleteByMutRefMode,
ObsoleteMoveInit, ObsoleteBinaryMove,
};
use ast::{_mod, add, arg, arm, attribute,
bind_by_ref, bind_by_implicit_ref, bind_by_value, bind_by_move,
@ -35,11 +36,11 @@ use ast::{_mod, add, arg, arm, attribute,
expr_call, expr_cast, expr_copy, expr_do_body, expr_fail,
expr_field, expr_fn, expr_fn_block, expr_if, expr_index,
expr_lit, expr_log, expr_loop, expr_loop_body, expr_mac,
expr_move, expr_path, expr_rec, expr_repeat, expr_ret, expr_swap,
expr_path, expr_rec, expr_repeat, expr_ret, expr_swap,
expr_struct, expr_tup, expr_unary, expr_unary_move, expr_vec,
expr_vstore, expr_while, extern_fn, field, fn_decl, foreign_item,
foreign_item_const, foreign_item_fn, foreign_mod, ident,
impure_fn, infer, inherited, init_assign, init_move, initializer,
impure_fn, infer, inherited,
item, item_, item_class, item_const, item_enum, item_fn,
item_foreign_mod, item_impl, item_mac, item_mod, item_trait,
item_ty, lit, lit_, lit_bool, lit_float, lit_int,
@ -1473,9 +1474,13 @@ impl Parser {
expr_assign_op(aop, lhs, rhs));
}
token::LARROW => {
self.bump();
let rhs = self.parse_expr();
return self.mk_expr(lo, rhs.span.hi, expr_move(lhs, rhs));
self.obsolete(copy self.span, ObsoleteBinaryMove);
// Bogus value (but it's an error)
self.bump(); // <-
self.bump(); // rhs
self.bump(); // ;
return self.mk_expr(lo, self.span.hi,
expr_break(None));
}
token::DARROW => {
self.bump();
@ -1745,23 +1750,18 @@ impl Parser {
return e;
}
fn parse_initializer() -> Option<initializer> {
fn parse_initializer() -> Option<@expr> {
match self.token {
token::EQ => {
self.bump();
return Some({op: init_assign, expr: self.parse_expr()});
return Some(self.parse_expr());
}
token::LARROW => {
self.bump();
return Some({op: init_move, expr: self.parse_expr()});
self.obsolete(copy self.span, ObsoleteMoveInit);
self.bump();
self.bump();
return None;
}
// Now that the the channel is the first argument to receive,
// combining it with an initializer doesn't really make sense.
// case (token::RECV) {
// self.bump();
// return Some(rec(op = init_recv,
// expr = self.parse_expr()));
// }
_ => {
return None;
}