aboutsummaryrefslogtreecommitdiff
path: root/src/comp
diff options
context:
space:
mode:
authorPatrick Walton <[email protected]>2011-03-17 11:23:17 -0700
committerPatrick Walton <[email protected]>2011-03-17 11:23:17 -0700
commitbc51842d4f4e9772ac7caf8f04ff00725b291e53 (patch)
treee7ba5a2a9605afb88cd8dd1908c79bb5a76056ca /src/comp
parentAdd an option.is_none() method (diff)
downloadrust-bc51842d4f4e9772ac7caf8f04ff00725b291e53.tar.xz
rust-bc51842d4f4e9772ac7caf8f04ff00725b291e53.zip
rustc: Don't go over inner functions' locals during the writeback phase of typechecking
Diffstat (limited to 'src/comp')
-rw-r--r--src/comp/middle/typeck.rs27
1 files changed, 22 insertions, 5 deletions
diff --git a/src/comp/middle/typeck.rs b/src/comp/middle/typeck.rs
index 6668c208..12226d70 100644
--- a/src/comp/middle/typeck.rs
+++ b/src/comp/middle/typeck.rs
@@ -1437,8 +1437,10 @@ fn demand_block(&@fn_ctxt fcx, @ty.t expected, &ast.block bloc) -> ast.block {
// Writeback: the phase that writes inferred types back into the AST.
-fn writeback_local(&@fn_ctxt fcx, &span sp, @ast.local local)
+fn writeback_local(&option.t[@fn_ctxt] env, &span sp, @ast.local local)
-> @ast.decl {
+ auto fcx = option.get[@fn_ctxt](env);
+
if (!fcx.locals.contains_key(local.id)) {
fcx.ccx.sess.span_err(sp, "unable to determine type of local: "
+ local.ident);
@@ -1452,10 +1454,25 @@ fn writeback_local(&@fn_ctxt fcx, &span sp, @ast.local local)
}
fn writeback(&@fn_ctxt fcx, &ast.block block) -> ast.block {
- auto fld = fold.new_identity_fold[@fn_ctxt]();
- auto f = writeback_local;
- fld = @rec(fold_decl_local = f with *fld);
- ret fold.fold_block[@fn_ctxt](fcx, fld, block);
+ fn update_env_for_item(&option.t[@fn_ctxt] env, @ast.item i)
+ -> option.t[@fn_ctxt] {
+ ret none[@fn_ctxt];
+ }
+ fn keep_going(&option.t[@fn_ctxt] env) -> bool {
+ ret !option.is_none[@fn_ctxt](env);
+ }
+
+ auto fld = fold.new_identity_fold[option.t[@fn_ctxt]]();
+ auto wbl = writeback_local;
+ auto uefi = update_env_for_item;
+ auto kg = keep_going;
+ fld = @rec(
+ fold_decl_local = wbl,
+ update_env_for_item = uefi,
+ keep_going = kg
+ with *fld
+ );
+ ret fold.fold_block[option.t[@fn_ctxt]](some[@fn_ctxt](fcx), fld, block);
}
// AST fragment checking