rustc: Implement unary move. Closes #917.

This commit is contained in:
Patrick Walton
2012-07-31 17:31:24 -07:00
parent c4bb8f8aaf
commit c88933d714
15 changed files with 48 additions and 24 deletions

View File

@@ -181,7 +181,8 @@ impl public_methods for borrowck_ctxt {
ast::expr_new(*) | ast::expr_binary(*) | ast::expr_while(*) |
ast::expr_block(*) | ast::expr_loop(*) | ast::expr_alt(*) |
ast::expr_lit(*) | ast::expr_break | ast::expr_mac(*) |
ast::expr_again | ast::expr_rec(*) | ast::expr_struct(*) {
ast::expr_again | ast::expr_rec(*) | ast::expr_struct(*) |
ast::expr_unary_move(*) {
ret self.cat_rvalue(expr, expr_ty);
}
}

View File

@@ -470,8 +470,8 @@ fn visit_expr(expr: @expr, &&self: @ir_maps, vt: vt<@ir_maps>) {
expr_loop_body(*) | expr_do_body(*) | expr_cast(*) |
expr_unary(*) | expr_fail(*) |
expr_break | expr_again | expr_lit(_) | expr_ret(*) |
expr_block(*) | expr_move(*) | expr_assign(*) | expr_swap(*) |
expr_assign_op(*) | expr_mac(*) | expr_struct(*) {
expr_block(*) | expr_move(*) | expr_unary_move(*) | expr_assign(*) |
expr_swap(*) | expr_assign_op(*) | expr_mac(*) | expr_struct(*) => {
visit::visit_expr(expr, self, vt);
}
}
@@ -1104,6 +1104,7 @@ class liveness {
expr_assert(e) |
expr_addr_of(_, e) |
expr_copy(e) |
expr_unary_move(e) |
expr_loop_body(e) |
expr_do_body(e) |
expr_cast(e, _) |
@@ -1430,6 +1431,12 @@ fn check_expr(expr: @expr, &&self: @liveness, vt: vt<@liveness>) {
visit::visit_expr(expr, self, vt);
}
expr_unary_move(r) {
self.check_move_from_expr(r, vt);
visit::visit_expr(expr, self, vt);
}
expr_assign_op(_, l, _) {
self.check_lvalue(l, vt);

View File

@@ -3682,7 +3682,7 @@ fn trans_expr(bcx: block, e: @ast::expr, dest: dest) -> block {
ast::expr_do_body(blk) {
ret trans_expr(bcx, blk, dest);
}
ast::expr_copy(a) {
ast::expr_copy(a) | ast::expr_unary_move(a) {
if !expr_is_lval(bcx, a) {
ret trans_expr(bcx, a, dest);
}

View File

@@ -158,7 +158,7 @@ fn mark_for_expr(cx: ctx, e: @expr) {
expr_rec(_, _) | expr_struct(*) | expr_tup(_) |
expr_unary(box(_), _) | expr_unary(uniq(_), _) |
expr_binary(add, _, _) |
expr_copy(_) | expr_move(_, _) {
expr_copy(_) | expr_move(_, _) | expr_unary_move(_) {
node_type_needs(cx, use_repr, e.id);
}
expr_cast(base, _) {

View File

@@ -1416,7 +1416,7 @@ fn check_expr_with_unifier(fcx: @fn_ctxt,
bot = check_expr_with(fcx, e, ty::mk_bool(tcx));
fcx.write_nil(id);
}
ast::expr_copy(a) {
ast::expr_copy(a) | ast::expr_unary_move(a) {
bot = check_expr(fcx, a, expected);
fcx.write_ty(id, fcx.expr_ty(a));
}