about summary refs log tree commit diff
diff options
context:
space:
mode:
authorGraydon Hoare <graydon@mozilla.com>2011-02-15 12:20:30 -0800
committerGraydon Hoare <graydon@mozilla.com>2011-02-15 12:20:30 -0800
commit9ae89bd404803be6b820189d8e0480b3395d05ee (patch)
treebc9fb10220f1d2275f02731a866cf9a177abef3d
parent2bba49a9feed613c2f018d5aa751df3c7a49a3d6 (diff)
Add _mutable unop.
-rw-r--r--src/comp/front/ast.rs1
-rw-r--r--src/comp/front/parser.rs7
-rw-r--r--src/comp/middle/trans.rs3
-rw-r--r--src/comp/middle/typeck.rs3
4 files changed, 14 insertions, 0 deletions
diff --git a/src/comp/front/ast.rs b/src/comp/front/ast.rs
index 520f5557bbd..03ccc216e2e 100644
--- a/src/comp/front/ast.rs
+++ b/src/comp/front/ast.rs
@@ -106,6 +106,7 @@ tag unop {
     bitnot;
     not;
     neg;
+    _mutable;
 }
 
 tag mode {
diff --git a/src/comp/front/parser.rs b/src/comp/front/parser.rs
index 085255a41ca..8acc8897254 100644
--- a/src/comp/front/parser.rs
+++ b/src/comp/front/parser.rs
@@ -811,6 +811,13 @@ impure fn parse_prefix_expr(parser p) -> @ast.expr {
             ex = ast.expr_unary(ast.box, e, ast.ann_none);
         }
 
+        case (token.MUTABLE) {
+            p.bump();
+            auto e = parse_prefix_expr(p);
+            hi = e.span;
+            ex = ast.expr_unary(ast._mutable, e, ast.ann_none);
+        }
+
         case (_) {
             ret parse_dot_or_call_expr(p);
         }
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs
index c4e5c9c4f33..72a4fe5ca98 100644
--- a/src/comp/middle/trans.rs
+++ b/src/comp/middle/trans.rs
@@ -1834,6 +1834,9 @@ fn trans_unary(@block_ctxt cx, ast.unop op,
             }
             ret res(sub.bcx, val);
         }
+        case (ast._mutable) {
+            ret trans_expr(cx, e);
+        }
     }
     fail;
 }
diff --git a/src/comp/middle/typeck.rs b/src/comp/middle/typeck.rs
index a062f79d4d0..e1b8d464cf5 100644
--- a/src/comp/middle/typeck.rs
+++ b/src/comp/middle/typeck.rs
@@ -1229,6 +1229,9 @@ fn check_expr(&@fn_ctxt fcx, @ast.expr expr) -> @ast.expr {
                         }
                     }
                 }
+                case (ast._mutable) {
+                    oper_t = @rec(mut=ast.mut with *oper_t);
+                }
                 case (_) { oper_t = strip_boxes(oper_t); }
             }
             ret @fold.respan[ast.expr_](expr.span,