about summary refs log tree commit diff
path: root/src/comp
diff options
context:
space:
mode:
authorMichael Sullivan <sully@msully.net>2011-06-28 17:24:59 -0700
committerGraydon Hoare <graydon@mozilla.com>2011-06-28 17:28:06 -0700
commitb944d8d72e234d14b5147cc210e2cc5ea345d1eb (patch)
treedaeaf56fc11c17d795e4f743c035046b07cd60a7 /src/comp
parentd79330de26b325747dedf3f04b7fdb0194029015 (diff)
downloadrust-b944d8d72e234d14b5147cc210e2cc5ea345d1eb.tar.gz
rust-b944d8d72e234d14b5147cc210e2cc5ea345d1eb.zip
Require that both sides of a swap be lvals.
Diffstat (limited to 'src/comp')
-rw-r--r--src/comp/middle/alias.rs17
1 files changed, 12 insertions, 5 deletions
diff --git a/src/comp/middle/alias.rs b/src/comp/middle/alias.rs
index 6f2c4ea837b..ade60d68c99 100644
--- a/src/comp/middle/alias.rs
+++ b/src/comp/middle/alias.rs
@@ -111,6 +111,10 @@ fn visit_expr(@ctx cx, &@ast::expr ex, &scope sc, &vt[scope] v) {
             check_var(*cx, ex, pt, ex.id, false, sc);
             handled = false;
         }
+        case (ast::expr_swap(?lhs, ?rhs)) {
+            check_lval(cx, lhs, sc, v);
+            check_lval(cx, rhs, sc, v);
+        }
         case (ast::expr_move(?dest, ?src)) {
             check_assign(cx, dest, src, sc, v);
         }
@@ -376,11 +380,7 @@ fn check_var(&ctx cx, &@ast::expr ex, &ast::path p, ast::node_id id,
     }
 }
 
-
-// FIXME does not catch assigning to immutable object fields yet
-fn check_assign(&@ctx cx, &@ast::expr dest, &@ast::expr src, &scope sc,
-                &vt[scope] v) {
-    visit_expr(cx, src, sc, v);
+fn check_lval(&@ctx cx, &@ast::expr dest, &scope sc, &vt[scope] v) {
     alt (dest.node) {
         case (ast::expr_path(?p)) {
             auto dnum = ast::def_id_of_def(cx.tcx.def_map.get(dest.id))._1;
@@ -418,6 +418,13 @@ fn check_assign(&@ctx cx, &@ast::expr dest, &@ast::expr src, &scope sc,
     }
 }
 
+fn check_assign(&@ctx cx, &@ast::expr dest, &@ast::expr src, &scope sc,
+                &vt[scope] v) {
+    visit_expr(cx, src, sc, v);
+    check_lval(cx, dest, sc, v);
+}
+
+
 fn is_immutable_alias(&@ctx cx, &scope sc, node_id dnum) -> bool {
     alt (cx.local_map.find(dnum)) {
         case (some(arg(ast::alias(false)))) { ret true; }