about summary refs log tree commit diff
path: root/src/libsyntax
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/libsyntax
parentc4bb8f8aafd25b9d5e68481af7088ab9e47c1e29 (diff)
rustc: Implement unary move. Closes #917.
Diffstat (limited to 'src/libsyntax')
-rw-r--r--src/libsyntax/ast.rs1
-rw-r--r--src/libsyntax/fold.rs1
-rw-r--r--src/libsyntax/parse/parser.rs16
-rw-r--r--src/libsyntax/parse/token.rs2
-rw-r--r--src/libsyntax/print/pprust.rs1
-rw-r--r--src/libsyntax/visit.rs1
6 files changed, 15 insertions, 7 deletions
diff --git a/src/libsyntax/ast.rs b/src/libsyntax/ast.rs
index 6e56e5ca65a..8c2b6dc3490 100644
--- a/src/libsyntax/ast.rs
+++ b/src/libsyntax/ast.rs
@@ -322,6 +322,7 @@ enum expr_ {
 
     expr_copy(@expr),
     expr_move(@expr, @expr),
+    expr_unary_move(@expr),
     expr_assign(@expr, @expr),
     expr_swap(@expr, @expr),
     expr_assign_op(binop, @expr, @expr),
diff --git a/src/libsyntax/fold.rs b/src/libsyntax/fold.rs
index dd051564cf4..5e533f3f494 100644
--- a/src/libsyntax/fold.rs
+++ b/src/libsyntax/fold.rs
@@ -454,6 +454,7 @@ fn noop_fold_expr(e: expr_, fld: ast_fold) -> expr_ {
             expr_move(fld.fold_expr(el), fld.fold_expr(er))
           }
           expr_copy(e) { expr_copy(fld.fold_expr(e)) }
+          expr_unary_move(e) { expr_unary_move(fld.fold_expr(e)) }
           expr_assign(el, er) {
             expr_assign(fld.fold_expr(el), fld.fold_expr(er))
           }
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs
index 28ad7173be8..aaafbf0ef24 100644
--- a/src/libsyntax/parse/parser.rs
+++ b/src/libsyntax/parse/parser.rs
@@ -31,12 +31,12 @@ import ast::{_mod, add, alt_check, alt_exhaustive, arg, arm, attribute,
              expr_index, expr_lit, expr_log, expr_loop,
              expr_loop_body, expr_mac, expr_move, expr_new, expr_path,
              expr_rec, expr_ret, expr_swap, expr_struct, expr_tup, expr_unary,
-             expr_vec, expr_vstore, expr_while, extern_fn, field, fn_decl,
-             foreign_item, foreign_item_fn, foreign_mod, ident, impure_fn,
-             infer, init_assign, init_move, initializer, instance_var, 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,
+             expr_unary_move, expr_vec, expr_vstore, expr_while, extern_fn,
+             field, fn_decl, foreign_item, foreign_item_fn, foreign_mod,
+             ident, impure_fn, infer, init_assign, init_move, initializer,
+             instance_var, 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,
              lit_int_unsuffixed, lit_nil, lit_str, lit_uint, local, m_const,
              m_imm, m_mutbl, mac_, mac_aq, mac_ellipsis,
              mac_invoc, mac_invoc_tt, mac_var, matcher, match_nonterminal,
@@ -854,6 +854,10 @@ class parser {
             let e = self.parse_expr();
             ex = expr_copy(e);
             hi = e.span.hi;
+        } else if self.eat_keyword(~"move") {
+            let e = self.parse_expr();
+            ex = expr_unary_move(e);
+            hi = e.span.hi;
         } else if self.token == token::MOD_SEP ||
             is_ident(self.token) && !self.is_keyword(~"true") &&
             !self.is_keyword(~"false") {
diff --git a/src/libsyntax/parse/token.rs b/src/libsyntax/parse/token.rs
index e4386ab140f..1d4e67c5d14 100644
--- a/src/libsyntax/parse/token.rs
+++ b/src/libsyntax/parse/token.rs
@@ -327,7 +327,7 @@ fn restricted_keyword_table() -> hashmap<~str, ()> {
         ~"fail", ~"false", ~"fn", ~"for",
         ~"if", ~"iface", ~"impl", ~"import",
         ~"let", ~"log", ~"loop",
-        ~"match", ~"mod", ~"module", ~"mut",
+        ~"match", ~"mod", ~"module", ~"move", ~"mut",
         ~"new",
         ~"owned",
         ~"pure",
diff --git a/src/libsyntax/print/pprust.rs b/src/libsyntax/print/pprust.rs
index 3292831c32f..41e795fd436 100644
--- a/src/libsyntax/print/pprust.rs
+++ b/src/libsyntax/print/pprust.rs
@@ -1100,6 +1100,7 @@ fn print_expr(s: ps, &&expr: @ast::expr) {
         print_block(s, blk);
       }
       ast::expr_copy(e) { word_space(s, ~"copy"); print_expr(s, e); }
+      ast::expr_unary_move(e) { word_space(s, ~"move"); print_expr(s, e); }
       ast::expr_move(lhs, rhs) {
         print_expr(s, lhs);
         space(s.s);
diff --git a/src/libsyntax/visit.rs b/src/libsyntax/visit.rs
index a542ca574ac..050d7e58120 100644
--- a/src/libsyntax/visit.rs
+++ b/src/libsyntax/visit.rs
@@ -408,6 +408,7 @@ fn visit_expr<E>(ex: @expr, e: E, v: vt<E>) {
       expr_block(b) { v.visit_block(b, e, v); }
       expr_assign(a, b) { v.visit_expr(b, e, v); v.visit_expr(a, e, v); }
       expr_copy(a) { v.visit_expr(a, e, v); }
+      expr_unary_move(a) { v.visit_expr(a, e, v); }
       expr_move(a, b) { v.visit_expr(b, e, v); v.visit_expr(a, e, v); }
       expr_swap(a, b) { v.visit_expr(a, e, v); v.visit_expr(b, e, v); }
       expr_assign_op(_, a, b) {