]> git.lizzy.rs Git - rust.git/commitdiff
Resolve loop collection expressions in the right scope
authorMarijn Haverbeke <marijnh@gmail.com>
Tue, 26 Jul 2011 13:50:15 +0000 (15:50 +0200)
committerMarijn Haverbeke <marijnh@gmail.com>
Tue, 26 Jul 2011 13:52:59 +0000 (15:52 +0200)
Closes #745

src/comp/middle/resolve.rs
src/comp/syntax/visit.rs
src/test/run-pass/loop-scope.rs [new file with mode: 0644]

index 9691a55b8554b7c1893c8b8aa8f616ff179a0d78..14dcb923d50e6a1c2f7ca1c1d4024658f8047efb 100644 (file)
@@ -372,15 +372,19 @@ fn visit_arm_with_scope(&ast::arm a, &scopes sc, &vt[scopes] v) {
 }
 
 fn visit_expr_with_scope(&@ast::expr x, &scopes sc, &vt[scopes] v) {
-    auto new_sc =
-        alt (x.node) {
-            ast::expr_for(?d, _, _) | ast::expr_for_each(?d, _, _) {
-                cons[scope](scope_loop(d), @sc)
-            }
-            ast::expr_fn(?f) { cons(scope_fn(f.decl, ~[]), @sc) }
-            _ { sc }
-        };
-    visit::visit_expr(x, new_sc, v);
+    alt (x.node) {
+      ast::expr_for(?decl, ?coll, ?blk) |
+      ast::expr_for_each(?decl, ?coll, ?blk) {
+        auto new_sc = cons[scope](scope_loop(decl), @sc);
+        v.visit_expr(coll, sc, v);
+        v.visit_local(decl, new_sc, v);
+        v.visit_block(blk, new_sc, v);
+      }
+      ast::expr_fn(?f) {
+        visit::visit_expr(x, cons(scope_fn(f.decl, ~[]), @sc), v);
+      }
+      _ { visit::visit_expr(x, sc, v); }
+    };
 }
 
 fn follow_import(&env e, &scopes sc, &ident[] path, &span sp)
@@ -1380,7 +1384,7 @@ fn check_expr(&@env e, &@ast::expr ex, &() x, &vt[()] v) {
     alt ex.node {
       ast::expr_rec(?fields, _) {
         fn field_name(&ast::field f) -> ident { ret f.node.ident; }
-        ensure_unique(*e, ex.span, fields, field_name, "field name");
+        ensure_unique(*e, ex.span, fields, field_name, "field");
       }
       _ {}
     }
@@ -1391,7 +1395,7 @@ fn check_ty(&@env e, &@ast::ty ty, &() x, &vt[()] v) {
     alt ty.node {
       ast::ty_rec(?fields) {
         fn field_name(&ast::ty_field f) -> ident { ret f.node.ident; }
-        ensure_unique(*e, ty.span, fields, field_name, "field name");
+        ensure_unique(*e, ty.span, fields, field_name, "field");
       }
       _ {}
     }
index 1820631011d873c48319f3bf5c35a06ed7f5b0a6..306394e8799580ddf755d661f3344e43cb9db2ac 100644 (file)
@@ -322,12 +322,7 @@ fn visit_expr[E](&@expr ex, &E e, &vt[E] v) {
             v.visit_expr(x, e, v);
             v.visit_block(b, e, v);
         }
-        case (expr_for(?dcl, ?x, ?b)) {
-            v.visit_local(dcl, e, v);
-            v.visit_expr(x, e, v);
-            v.visit_block(b, e, v);
-        }
-        case (expr_for_each(?dcl, ?x, ?b)) {
+        expr_for(?dcl, ?x, ?b) | expr_for_each(?dcl, ?x, ?b) {
             v.visit_local(dcl, e, v);
             v.visit_expr(x, e, v);
             v.visit_block(b, e, v);
diff --git a/src/test/run-pass/loop-scope.rs b/src/test/run-pass/loop-scope.rs
new file mode 100644 (file)
index 0000000..0a7c155
--- /dev/null
@@ -0,0 +1,6 @@
+fn main() {
+    auto x = ~[10, 20, 30];
+    auto sum = 0;
+    for (auto x in x) { sum += x; }
+    assert sum == 60;
+}