Skip to content

Commit 087cbb5

Browse files
committed
Remove <- operator from the compiler
Yield an obsolete syntax error on things like "let foo <- bar;" and "foo <- bar;" r=brson Progress on #3466
1 parent 48c8d1f commit 087cbb5

19 files changed

+53
-132
lines changed

src/libsyntax/ast.rs

Lines changed: 1 addition & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -640,40 +640,12 @@ enum stmt_ {
640640
stmt_semi(@expr, node_id),
641641
}
642642

643-
#[auto_serialize]
644-
#[auto_deserialize]
645-
enum init_op { init_assign, init_move, }
646-
647-
impl init_op : cmp::Eq {
648-
pure fn eq(other: &init_op) -> bool {
649-
match self {
650-
init_assign => {
651-
match (*other) {
652-
init_assign => true,
653-
_ => false
654-
}
655-
}
656-
init_move => {
657-
match (*other) {
658-
init_move => true,
659-
_ => false
660-
}
661-
}
662-
}
663-
}
664-
pure fn ne(other: &init_op) -> bool { !self.eq(other) }
665-
}
666-
667-
#[auto_serialize]
668-
#[auto_deserialize]
669-
type initializer = {op: init_op, expr: @expr};
670-
671643
// FIXME (pending discussion of #1697, #2178...): local should really be
672644
// a refinement on pat.
673645
#[auto_serialize]
674646
#[auto_deserialize]
675647
type local_ = {is_mutbl: bool, ty: @Ty, pat: @pat,
676-
init: Option<initializer>, id: node_id};
648+
init: Option<@expr>, id: node_id};
677649

678650
type local = spanned<local_>;
679651

@@ -749,7 +721,6 @@ enum expr_ {
749721
expr_block(blk),
750722

751723
expr_copy(@expr),
752-
expr_move(@expr, @expr),
753724
expr_unary_move(@expr),
754725
expr_assign(@expr, @expr),
755726
expr_swap(@expr, @expr),

src/libsyntax/fold.rs

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -460,9 +460,6 @@ fn noop_fold_expr(e: expr_, fld: ast_fold) -> expr_ {
460460
..**cap_item})})))
461461
}
462462
expr_block(blk) => expr_block(fld.fold_block(blk)),
463-
expr_move(el, er) => {
464-
expr_move(fld.fold_expr(el), fld.fold_expr(er))
465-
}
466463
expr_copy(e) => expr_copy(fld.fold_expr(e)),
467464
expr_unary_move(e) => expr_unary_move(fld.fold_expr(e)),
468465
expr_assign(el, er) => {
@@ -610,14 +607,7 @@ fn noop_fold_local(l: local_, fld: ast_fold) -> local_ {
610607
return {is_mutbl: l.is_mutbl,
611608
ty: fld.fold_ty(l.ty),
612609
pat: fld.fold_pat(l.pat),
613-
init:
614-
match l.init {
615-
option::None::<initializer> => l.init,
616-
option::Some::<initializer>(init) => {
617-
option::Some::<initializer>({op: init.op,
618-
expr: fld.fold_expr(init.expr)})
619-
}
620-
},
610+
init: l.init.map(|e| fld.fold_expr(*e)),
621611
id: fld.new_id(l.id)};
622612
}
623613

src/libsyntax/parse/classify.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ fn need_parens(expr: @ast::expr, outer_prec: uint) -> bool {
4343
ast::expr_cast(_, _) => parse::prec::as_prec < outer_prec,
4444
// This may be too conservative in some cases
4545
ast::expr_assign(_, _) => true,
46-
ast::expr_move(_, _) => true,
4746
ast::expr_swap(_, _) => true,
4847
ast::expr_assign_op(_, _, _) => true,
4948
ast::expr_ret(_) => true,
@@ -61,8 +60,7 @@ fn ends_in_lit_int(ex: @ast::expr) -> bool {
6160
_ => false
6261
},
6362
ast::expr_binary(_, _, sub) | ast::expr_unary(_, sub) |
64-
ast::expr_move(_, sub) | ast::expr_copy(sub) |
65-
ast::expr_assign(_, sub) |
63+
ast::expr_copy(sub) | ast::expr_assign(_, sub) |
6664
ast::expr_assign_op(_, _, sub) | ast::expr_swap(_, sub) |
6765
ast::expr_log(_, _, sub) | ast::expr_assert(sub) => {
6866
ends_in_lit_int(sub)

src/libsyntax/parse/obsolete.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ pub enum ObsoleteSyntax {
2525
ObsoleteModeInFnType,
2626
ObsoleteByMutRefMode,
2727
ObsoleteFixedLengthVec,
28+
ObsoleteMoveInit,
29+
ObsoleteBinaryMove
2830
}
2931

3032
impl ObsoleteSyntax : cmp::Eq {
@@ -104,6 +106,14 @@ impl Parser : ObsoleteReporter {
104106
"fixed-length vector",
105107
"Fixed-length types are now written `[T * N]`, and instances \
106108
are type-inferred"
109+
),
110+
ObsoleteMoveInit => (
111+
"initializer-by-move",
112+
"Write `let foo = move bar` instead"
113+
),
114+
ObsoleteBinaryMove => (
115+
"binary move",
116+
"Write `foo = move bar` instead"
107117
)
108118
};
109119

src/libsyntax/parse/parser.rs

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ use obsolete::{
2020
ObsoleteLowerCaseKindBounds, ObsoleteLet,
2121
ObsoleteFieldTerminator, ObsoleteStructCtor,
2222
ObsoleteWith, ObsoleteClassMethod, ObsoleteClassTraits,
23-
ObsoleteModeInFnType, ObsoleteByMutRefMode
23+
ObsoleteModeInFnType, ObsoleteByMutRefMode,
24+
ObsoleteMoveInit, ObsoleteBinaryMove,
2425
};
2526
use ast::{_mod, add, arg, arm, attribute,
2627
bind_by_ref, bind_by_implicit_ref, bind_by_value, bind_by_move,
@@ -35,11 +36,11 @@ use ast::{_mod, add, arg, arm, attribute,
3536
expr_call, expr_cast, expr_copy, expr_do_body, expr_fail,
3637
expr_field, expr_fn, expr_fn_block, expr_if, expr_index,
3738
expr_lit, expr_log, expr_loop, expr_loop_body, expr_mac,
38-
expr_move, expr_path, expr_rec, expr_repeat, expr_ret, expr_swap,
39+
expr_path, expr_rec, expr_repeat, expr_ret, expr_swap,
3940
expr_struct, expr_tup, expr_unary, expr_unary_move, expr_vec,
4041
expr_vstore, expr_while, extern_fn, field, fn_decl, foreign_item,
4142
foreign_item_const, foreign_item_fn, foreign_mod, ident,
42-
impure_fn, infer, inherited, init_assign, init_move, initializer,
43+
impure_fn, infer, inherited,
4344
item, item_, item_class, item_const, item_enum, item_fn,
4445
item_foreign_mod, item_impl, item_mac, item_mod, item_trait,
4546
item_ty, lit, lit_, lit_bool, lit_float, lit_int,
@@ -1473,9 +1474,13 @@ impl Parser {
14731474
expr_assign_op(aop, lhs, rhs));
14741475
}
14751476
token::LARROW => {
1476-
self.bump();
1477-
let rhs = self.parse_expr();
1478-
return self.mk_expr(lo, rhs.span.hi, expr_move(lhs, rhs));
1477+
self.obsolete(copy self.span, ObsoleteBinaryMove);
1478+
// Bogus value (but it's an error)
1479+
self.bump(); // <-
1480+
self.bump(); // rhs
1481+
self.bump(); // ;
1482+
return self.mk_expr(lo, self.span.hi,
1483+
expr_break(None));
14791484
}
14801485
token::DARROW => {
14811486
self.bump();
@@ -1745,23 +1750,18 @@ impl Parser {
17451750
return e;
17461751
}
17471752
1748-
fn parse_initializer() -> Option<initializer> {
1753+
fn parse_initializer() -> Option<@expr> {
17491754
match self.token {
17501755
token::EQ => {
17511756
self.bump();
1752-
return Some({op: init_assign, expr: self.parse_expr()});
1757+
return Some(self.parse_expr());
17531758
}
17541759
token::LARROW => {
1755-
self.bump();
1756-
return Some({op: init_move, expr: self.parse_expr()});
1760+
self.obsolete(copy self.span, ObsoleteMoveInit);
1761+
self.bump();
1762+
self.bump();
1763+
return None;
17571764
}
1758-
// Now that the the channel is the first argument to receive,
1759-
// combining it with an initializer doesn't really make sense.
1760-
// case (token::RECV) {
1761-
// self.bump();
1762-
// return Some(rec(op = init_recv,
1763-
// expr = self.parse_expr()));
1764-
// }
17651765
_ => {
17661766
return None;
17671767
}

src/libsyntax/print/pprust.rs

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1310,18 +1310,13 @@ fn print_expr(s: ps, &&expr: @ast::expr) {
13101310
print_block(s, blk);
13111311
}
13121312
ast::expr_copy(e) => { word_space(s, ~"copy"); print_expr(s, e); }
1313+
// shouldn't parenthesize unless it's needed
13131314
ast::expr_unary_move(e) => {
13141315
popen(s);
13151316
word_space(s, ~"move");
13161317
print_expr(s, e);
13171318
pclose(s);
13181319
}
1319-
ast::expr_move(lhs, rhs) => {
1320-
print_expr(s, lhs);
1321-
space(s.s);
1322-
word_space(s, ~"<-");
1323-
print_expr(s, rhs);
1324-
}
13251320
ast::expr_assign(lhs, rhs) => {
13261321
print_expr(s, lhs);
13271322
space(s.s);
@@ -1416,8 +1411,7 @@ fn print_expr_parens_if_not_bot(s: ps, ex: @ast::expr) {
14161411
let parens = match ex.node {
14171412
ast::expr_fail(_) | ast::expr_ret(_) |
14181413
ast::expr_binary(_, _, _) | ast::expr_unary(_, _) |
1419-
ast::expr_move(_, _) | ast::expr_copy(_) |
1420-
ast::expr_assign(_, _) |
1414+
ast::expr_copy(_) | ast::expr_assign(_, _) |
14211415
ast::expr_assign_op(_, _, _) | ast::expr_swap(_, _) |
14221416
ast::expr_log(_, _, _) | ast::expr_assert(_) |
14231417
ast::expr_call(_, _, true) |
@@ -1458,11 +1452,8 @@ fn print_decl(s: ps, decl: @ast::decl) {
14581452
match loc.node.init {
14591453
Some(init) => {
14601454
nbsp(s);
1461-
match init.op {
1462-
ast::init_assign => word_space(s, ~"="),
1463-
ast::init_move => word_space(s, ~"<-")
1464-
}
1465-
print_expr(s, init.expr);
1455+
word_space(s, ~"=");
1456+
print_expr(s, init);
14661457
}
14671458
_ => ()
14681459
}

src/libsyntax/visit.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ fn visit_local<E>(loc: @local, e: E, v: vt<E>) {
116116
v.visit_ty(loc.node.ty, e, v);
117117
match loc.node.init {
118118
None => (),
119-
Some(i) => v.visit_expr(i.expr, e, v)
119+
Some(ex) => v.visit_expr(ex, e, v)
120120
}
121121
}
122122

@@ -442,7 +442,6 @@ fn visit_expr<E>(ex: @expr, e: E, v: vt<E>) {
442442
expr_assign(a, b) => { v.visit_expr(b, e, v); v.visit_expr(a, e, v); }
443443
expr_copy(a) => v.visit_expr(a, e, v),
444444
expr_unary_move(a) => v.visit_expr(a, e, v),
445-
expr_move(a, b) => { v.visit_expr(b, e, v); v.visit_expr(a, e, v); }
446445
expr_swap(a, b) => { v.visit_expr(a, e, v); v.visit_expr(b, e, v); }
447446
expr_assign_op(_, a, b) => {
448447
v.visit_expr(b, e, v);

src/rustc/middle/borrowck/check_loans.rs

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -583,12 +583,6 @@ fn check_loans_in_fn(fk: visit::fn_kind, decl: ast::fn_decl, body: ast::blk,
583583
fn check_loans_in_local(local: @ast::local,
584584
&&self: check_loan_ctxt,
585585
vt: visit::vt<check_loan_ctxt>) {
586-
match local.node.init {
587-
Some({op: ast::init_move, expr: expr}) => {
588-
self.check_move_out(expr);
589-
}
590-
Some({op: ast::init_assign, _}) | None => {}
591-
}
592586
visit::visit_local(local, self, vt);
593587
}
594588

@@ -609,10 +603,6 @@ fn check_loans_in_expr(expr: @ast::expr,
609603
self.check_assignment(at_swap, l);
610604
self.check_assignment(at_swap, r);
611605
}
612-
ast::expr_move(dest, src) => {
613-
self.check_assignment(at_straight_up, dest);
614-
self.check_move_out(src);
615-
}
616606
ast::expr_unary_move(src) => {
617607
self.check_move_out(src);
618608
}

src/rustc/middle/kind.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -374,7 +374,7 @@ fn check_stmt(stmt: @stmt, cx: ctx, v: visit::vt<ctx>) {
374374
stmt_decl(@{node: decl_local(locals), _}, _) => {
375375
for locals.each |local| {
376376
match local.node.init {
377-
Some({op: init_assign, expr}) =>
377+
Some(expr) =>
378378
maybe_copy(cx, expr, Some(("initializer statement \
379379
takes its right-hand side by copy", ""))),
380380
_ => {}

src/rustc/middle/liveness.rs

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -552,7 +552,7 @@ fn visit_expr(expr: @expr, &&self: @IrMaps, vt: vt<@IrMaps>) {
552552
expr_loop_body(*) | expr_do_body(*) | expr_cast(*) |
553553
expr_unary(*) | expr_fail(*) |
554554
expr_break(_) | expr_again(_) | expr_lit(_) | expr_ret(*) |
555-
expr_block(*) | expr_move(*) | expr_unary_move(*) | expr_assign(*) |
555+
expr_block(*) | expr_unary_move(*) | expr_assign(*) |
556556
expr_swap(*) | expr_assign_op(*) | expr_mac(*) | expr_struct(*) |
557557
expr_repeat(*) => {
558558
visit::visit_expr(expr, self, vt);
@@ -1004,8 +1004,7 @@ impl Liveness {
10041004
// initialization, which is mildly more complex than checking
10051005
// once at the func header but otherwise equivalent.
10061006

1007-
let opt_init = local.node.init.map(|i| i.expr );
1008-
let succ = self.propagate_through_opt_expr(opt_init, succ);
1007+
let succ = self.propagate_through_opt_expr(local.node.init, succ);
10091008
self.define_bindings_in_pat(local.node.pat, succ)
10101009
}
10111010

@@ -1157,7 +1156,7 @@ impl Liveness {
11571156
}
11581157
}
11591158

1160-
expr_move(l, r) | expr_assign(l, r) => {
1159+
expr_assign(l, r) => {
11611160
// see comment on lvalues in
11621161
// propagate_through_lvalue_components()
11631162
let succ = self.write_lvalue(l, succ, ACC_WRITE);
@@ -1436,14 +1435,9 @@ impl Liveness {
14361435

14371436
fn check_local(local: @local, &&self: @Liveness, vt: vt<@Liveness>) {
14381437
match local.node.init {
1439-
Some({op: op, expr: expr}) => {
1438+
Some(_) => {
14401439

14411440
// Initializer:
1442-
1443-
match op {
1444-
init_move => self.check_move_from_expr(expr, vt),
1445-
init_assign => ()
1446-
}
14471441
self.warn_about_unused_or_dead_vars_in_pat(local.node.pat);
14481442
if !local.node.is_mutbl {
14491443
self.check_for_reassignments_in_pat(local.node.pat);
@@ -1511,13 +1505,6 @@ fn check_expr(expr: @expr, &&self: @Liveness, vt: vt<@Liveness>) {
15111505
visit::visit_expr(expr, self, vt);
15121506
}
15131507

1514-
expr_move(l, r) => {
1515-
self.check_lvalue(l, vt);
1516-
self.check_move_from_expr(r, vt);
1517-
1518-
visit::visit_expr(expr, self, vt);
1519-
}
1520-
15211508
expr_unary_move(r) => {
15221509
self.check_move_from_expr(r, vt);
15231510

src/rustc/middle/mem_categorization.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -482,7 +482,7 @@ impl &mem_categorization_ctxt {
482482
}
483483

484484
ast::expr_addr_of(*) | ast::expr_call(*) |
485-
ast::expr_swap(*) | ast::expr_move(*) | ast::expr_assign(*) |
485+
ast::expr_swap(*) | ast::expr_assign(*) |
486486
ast::expr_assign_op(*) | ast::expr_fn(*) | ast::expr_fn_block(*) |
487487
ast::expr_assert(*) | ast::expr_ret(*) |
488488
ast::expr_loop_body(*) | ast::expr_do_body(*) | ast::expr_unary(*) |

src/rustc/middle/resolve.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3982,7 +3982,7 @@ impl Resolver {
39823982
// Nothing to do.
39833983
}
39843984
Some(initializer) => {
3985-
self.resolve_expr(initializer.expr, visitor);
3985+
self.resolve_expr(initializer, visitor);
39863986
}
39873987
}
39883988

src/rustc/middle/trans/base.rs

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -960,7 +960,7 @@ fn init_local(bcx: block, local: @ast::local) -> block {
960960
// Handle let _ = e; just like e;
961961
match local.node.init {
962962
Some(init) => {
963-
return expr::trans_into(bcx, init.expr, expr::Ignore);
963+
return expr::trans_into(bcx, init, expr::Ignore);
964964
}
965965
None => { return bcx; }
966966
}
@@ -977,12 +977,7 @@ fn init_local(bcx: block, local: @ast::local) -> block {
977977
let mut bcx = bcx;
978978
match local.node.init {
979979
Some(init) => {
980-
if init.op == ast::init_assign || !bcx.expr_is_lval(init.expr) {
981-
bcx = expr::trans_into(bcx, init.expr, expr::SaveIn(llptr));
982-
} else { // This is a move from an lval, perform an actual move
983-
let init_datumblock = expr::trans_to_datum(bcx, init.expr);
984-
bcx = init_datumblock.move_to(datum::INIT, llptr);
985-
}
980+
bcx = expr::trans_into(bcx, init, expr::SaveIn(llptr));
986981
}
987982
_ => {
988983
zero_mem(bcx, llptr, ty);

src/rustc/middle/trans/expr.rs

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -438,11 +438,6 @@ fn trans_rvalue_stmt_unadjusted(bcx: block, expr: @ast::expr) -> block {
438438
let dst_datum = unpack_datum!(bcx, trans_lvalue(bcx, dst));
439439
return src_datum.store_to_datum(bcx, DROP_EXISTING, dst_datum);
440440
}
441-
ast::expr_move(dst, src) => {
442-
let src_datum = unpack_datum!(bcx, trans_to_datum(bcx, src));
443-
let dst_datum = unpack_datum!(bcx, trans_lvalue(bcx, dst));
444-
return src_datum.move_to_datum(bcx, DROP_EXISTING, dst_datum);
445-
}
446441
ast::expr_swap(dst, src) => {
447442
let dst_datum = unpack_datum!(bcx, trans_lvalue(bcx, dst));
448443
let src_datum = unpack_datum!(bcx, trans_lvalue(bcx, src));

0 commit comments

Comments
 (0)