From 2509a3dcae822c3a7f4fcb5d2884f255e7bac737 Mon Sep 17 00:00:00 2001 From: Marijn Haverbeke Date: Tue, 26 Jul 2011 15:50:15 +0200 Subject: [PATCH] Resolve loop collection expressions in the right scope Closes #745 --- src/comp/middle/resolve.rs | 26 +++++++++++++++----------- src/comp/syntax/visit.rs | 7 +------ src/test/run-pass/loop-scope.rs | 6 ++++++ 3 files changed, 22 insertions(+), 17 deletions(-) create mode 100644 src/test/run-pass/loop-scope.rs diff --git a/src/comp/middle/resolve.rs b/src/comp/middle/resolve.rs index 9691a55b8554..14dcb923d50e 100644 --- a/src/comp/middle/resolve.rs +++ b/src/comp/middle/resolve.rs @@ -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"); } _ {} } diff --git a/src/comp/syntax/visit.rs b/src/comp/syntax/visit.rs index 1820631011d8..306394e87995 100644 --- a/src/comp/syntax/visit.rs +++ b/src/comp/syntax/visit.rs @@ -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 index 000000000000..0a7c15591d8e --- /dev/null +++ b/src/test/run-pass/loop-scope.rs @@ -0,0 +1,6 @@ +fn main() { + auto x = ~[10, 20, 30]; + auto sum = 0; + for (auto x in x) { sum += x; } + assert sum == 60; +}