Skip to content

Commit 796e7a1

Browse files
msullivangraydon
authored andcommitted
---
yaml --- r: 2866 b: refs/heads/master c: 5e7bba3 h: refs/heads/master v: v3
1 parent a6ebf08 commit 796e7a1

File tree

10 files changed

+82
-1
lines changed

10 files changed

+82
-1
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
---
2-
refs/heads/master: 43342e9a66c81a9fe4516a498d18c7e1e0944476
2+
refs/heads/master: 5e7bba3d23c8b521df78302047452c9071832be1

trunk/src/comp/front/ast.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,7 @@ tag expr_ {
257257
expr_do_while(block, @expr, ann);
258258
expr_alt(@expr, vec[arm], ann);
259259
expr_block(block, ann);
260+
expr_move(@expr /* TODO: @expr|is_lval */, @expr, ann);
260261
expr_assign(@expr /* TODO: @expr|is_lval */, @expr, ann);
261262
expr_assign_op(binop, @expr /* TODO: @expr|is_lval */, @expr, ann);
262263
expr_send(@expr /* TODO: @expr|is_lval */, @expr, ann);

trunk/src/comp/front/parser.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1251,6 +1251,12 @@ fn parse_assign_expr(&parser p) -> @ast::expr {
12511251
ret @spanned(lo, rhs.span.hi,
12521252
ast::expr_assign_op(aop, lhs, rhs, p.get_ann()));
12531253
}
1254+
case (token::LARROW) {
1255+
p.bump();
1256+
auto rhs = parse_expr(p);
1257+
ret @spanned(lo, rhs.span.hi,
1258+
ast::expr_move(lhs, rhs, p.get_ann()));
1259+
}
12541260
case (token::SEND) {
12551261
p.bump();
12561262
auto rhs = parse_expr(p);

trunk/src/comp/middle/trans.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5500,6 +5500,18 @@ fn trans_expr_out(&@block_ctxt cx, &@ast::expr e, out_method output)
55005500
ret res(next_cx, sub.val);
55015501
}
55025502

5503+
case (ast::expr_move(?dst, ?src, ?ann)) {
5504+
auto lhs_res = trans_lval(cx, dst);
5505+
assert (lhs_res.is_mem);
5506+
*(lhs_res.res.bcx) = rec(sp=src.span with *(lhs_res.res.bcx));
5507+
auto rhs_res = trans_expr(lhs_res.res.bcx, src);
5508+
auto t = node_ann_type(cx.fcx.lcx.ccx, ann);
5509+
// FIXME: calculate copy init-ness in typestate.
5510+
// FIXME: do all of the special move stuff
5511+
ret copy_ty(rhs_res.bcx, DROP_EXISTING,
5512+
lhs_res.res.val, rhs_res.val, t);
5513+
}
5514+
55035515
case (ast::expr_assign(?dst, ?src, ?ann)) {
55045516
auto lhs_res = trans_lval(cx, dst);
55055517
assert (lhs_res.is_mem);

trunk/src/comp/middle/tstate/pre_post_conditions.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ import front::ast::expr_rec;
109109
import front::ast::expr_if;
110110
import front::ast::expr_binary;
111111
import front::ast::expr_unary;
112+
import front::ast::expr_move;
112113
import front::ast::expr_assign;
113114
import front::ast::expr_assign_op;
114115
import front::ast::expr_while;
@@ -362,6 +363,17 @@ fn find_pre_post_expr(&fn_ctxt fcx, @expr e) -> () {
362363
vec::plus_option[@expr](es, maybe_base);
363364
find_pre_post_exprs(fcx, es, a);
364365
}
366+
case (expr_move(?lhs, ?rhs, ?a)) {
367+
// FIXME: this needs to deinitialize the rhs
368+
alt (lhs.node) {
369+
case (expr_path(?p, ?a_lhs)) {
370+
gen_if_local(fcx, lhs, rhs, a, a_lhs);
371+
}
372+
case (_) {
373+
find_pre_post_exprs(fcx, [lhs, rhs], a);
374+
}
375+
}
376+
}
365377
case (expr_assign(?lhs, ?rhs, ?a)) {
366378
alt (lhs.node) {
367379
case (expr_path(?p, ?a_lhs)) {

trunk/src/comp/middle/tstate/states.rs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ import front::ast::expr_rec;
119119
import front::ast::expr_if;
120120
import front::ast::expr_binary;
121121
import front::ast::expr_unary;
122+
import front::ast::expr_move;
122123
import front::ast::expr_assign;
123124
import front::ast::expr_assign_op;
124125
import front::ast::expr_while;
@@ -329,6 +330,32 @@ fn find_pre_post_state_expr(&fn_ctxt fcx, &prestate pres, @expr e) -> bool {
329330
}
330331
ret changed;
331332
}
333+
case (expr_move(?lhs, ?rhs, ?a)) {
334+
// FIXME: this needs to deinitialize the rhs
335+
extend_prestate_ann(fcx.ccx, a, pres);
336+
337+
alt (lhs.node) {
338+
case (expr_path(?p, ?a_lhs)) {
339+
// assignment to local var
340+
changed = pure_exp(fcx.ccx, a_lhs, pres) || changed;
341+
changed = find_pre_post_state_expr(fcx, pres, rhs)
342+
|| changed;
343+
changed = extend_poststate_ann(fcx.ccx, a,
344+
expr_poststate(fcx.ccx, rhs)) || changed;
345+
changed = gen_if_local(fcx, a_lhs, a)|| changed;
346+
}
347+
case (_) {
348+
// assignment to something that must already have been init'd
349+
changed = find_pre_post_state_expr(fcx, pres, lhs)
350+
|| changed;
351+
changed = find_pre_post_state_expr(fcx,
352+
expr_poststate(fcx.ccx, lhs), rhs) || changed;
353+
changed = extend_poststate_ann(fcx.ccx, a,
354+
expr_poststate(fcx.ccx, rhs)) || changed;
355+
}
356+
}
357+
ret changed;
358+
}
332359
case (expr_assign(?lhs, ?rhs, ?a)) {
333360
extend_prestate_ann(fcx.ccx, a, pres);
334361

trunk/src/comp/middle/ty.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1767,6 +1767,7 @@ fn expr_ann(&@ast::expr e) -> ast::ann {
17671767
case (ast::expr_do_while(_,_,?a)) { ret a; }
17681768
case (ast::expr_alt(_,_,?a)) { ret a; }
17691769
case (ast::expr_block(_,?a)) { ret a; }
1770+
case (ast::expr_move(_,_,?a)) { ret a; }
17701771
case (ast::expr_assign(_,_,?a)) { ret a; }
17711772
case (ast::expr_assign_op(_,_,_,?a)) { ret a; }
17721773
case (ast::expr_send(_,_,?a)) { ret a; }

trunk/src/comp/middle/typeck.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1388,6 +1388,13 @@ mod pushdown {
13881388
write::ty_only_fixup(scx, ann.id, t);
13891389
pushdown_block(scx, t, bloc);
13901390
}
1391+
case (ast::expr_move(?lhs_0, ?rhs_0, ?ann)) {
1392+
auto t = demand::autoderef(scx, e.span, expected,
1393+
ann_to_type(scx.fcx.ccx.tcx.node_types, ann), adk);
1394+
pushdown_expr(scx, expected, lhs_0);
1395+
pushdown_expr(scx, expected, rhs_0);
1396+
write::ty_only_fixup(scx, ann.id, t);
1397+
}
13911398
case (ast::expr_assign(?lhs_0, ?rhs_0, ?ann)) {
13921399
auto t = demand::autoderef(scx, e.span, expected,
13931400
ann_to_type(scx.fcx.ccx.tcx.node_types, ann), adk);
@@ -2106,6 +2113,11 @@ fn check_expr(&@stmt_ctxt scx, &@ast::expr expr) {
21062113
write::nil_ty(scx.fcx.ccx.tcx, a.id);
21072114
}
21082115

2116+
case (ast::expr_move(?lhs, ?rhs, ?a)) {
2117+
require_impure(scx.fcx.ccx.tcx.sess, scx.fcx.purity, expr.span);
2118+
check_assignment(scx, lhs, rhs, a);
2119+
}
2120+
21092121
case (ast::expr_assign(?lhs, ?rhs, ?a)) {
21102122
require_impure(scx.fcx.ccx.tcx.sess, scx.fcx.purity, expr.span);
21112123
check_assignment(scx, lhs, rhs, a);

trunk/src/comp/middle/walk.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -394,6 +394,10 @@ fn walk_expr(&ast_visitor v, @ast::expr e) {
394394
walk_expr(v, a);
395395
walk_expr(v, b);
396396
}
397+
case (ast::expr_move(?a, ?b, _)) {
398+
walk_expr(v, a);
399+
walk_expr(v, b);
400+
}
397401
case (ast::expr_assign_op(_, ?a, ?b, _)) {
398402
walk_expr(v, a);
399403
walk_expr(v, b);

trunk/src/comp/pretty/pprust.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -690,6 +690,12 @@ fn print_expr(&ps s, &@ast::expr expr) {
690690
ibox(s.s, 0u);
691691
print_block(s, block);
692692
}
693+
case (ast::expr_move(?lhs,?rhs,_)) {
694+
print_expr(s, lhs);
695+
space(s.s);
696+
wrd1(s, "<-");
697+
print_expr(s, rhs);
698+
}
693699
case (ast::expr_assign(?lhs,?rhs,_)) {
694700
print_expr(s, lhs);
695701
space(s.s);

0 commit comments

Comments
 (0)