about summary refs log tree commit diff
path: root/src/rustc
diff options
context:
space:
mode:
authorPatrick Walton <pcwalton@mimiga.net>2012-07-31 17:31:24 -0700
committerPatrick Walton <pcwalton@mimiga.net>2012-07-31 17:33:20 -0700
commitc88933d714f12be6bdca80cc9583a1e5670cfc62 (patch)
tree8d17f1dc5cec7892ff7cc71bb4b5cf0d3a883f1b /src/rustc
parentc4bb8f8aafd25b9d5e68481af7088ab9e47c1e29 (diff)
downloadrust-c88933d714f12be6bdca80cc9583a1e5670cfc62.tar.gz
rust-c88933d714f12be6bdca80cc9583a1e5670cfc62.zip
rustc: Implement unary move. Closes #917.
Diffstat (limited to 'src/rustc')
-rw-r--r--src/rustc/middle/borrowck/categorization.rs3
-rw-r--r--src/rustc/middle/liveness.rs11
-rw-r--r--src/rustc/middle/trans/base.rs2
-rw-r--r--src/rustc/middle/trans/type_use.rs2
-rw-r--r--src/rustc/middle/typeck/check.rs2
5 files changed, 14 insertions, 6 deletions
diff --git a/src/rustc/middle/borrowck/categorization.rs b/src/rustc/middle/borrowck/categorization.rs
index 6f5b5d139d3..36b35dbbdbc 100644
--- a/src/rustc/middle/borrowck/categorization.rs
+++ b/src/rustc/middle/borrowck/categorization.rs
@@ -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);
           }
         }
diff --git a/src/rustc/middle/liveness.rs b/src/rustc/middle/liveness.rs
index e7d88b9b2b8..8a65a1b0567 100644
--- a/src/rustc/middle/liveness.rs
+++ b/src/rustc/middle/liveness.rs
@@ -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);
 
diff --git a/src/rustc/middle/trans/base.rs b/src/rustc/middle/trans/base.rs
index 2e5d5051a79..96e7c74f25d 100644
--- a/src/rustc/middle/trans/base.rs
+++ b/src/rustc/middle/trans/base.rs
@@ -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);
             }
diff --git a/src/rustc/middle/trans/type_use.rs b/src/rustc/middle/trans/type_use.rs
index 6bb19724afe..8ab6fbfc6eb 100644
--- a/src/rustc/middle/trans/type_use.rs
+++ b/src/rustc/middle/trans/type_use.rs
@@ -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, _) {
diff --git a/src/rustc/middle/typeck/check.rs b/src/rustc/middle/typeck/check.rs
index 1f589a1b960..db9084cbad1 100644
--- a/src/rustc/middle/typeck/check.rs
+++ b/src/rustc/middle/typeck/check.rs
@@ -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));
       }