Skip to content

Commit b52a184

Browse files
committed
---
yaml --- r: 6990 b: refs/heads/master c: bd6646e h: refs/heads/master v: v3
1 parent 78d5dec commit b52a184

File tree

3 files changed

+27
-4
lines changed

3 files changed

+27
-4
lines changed

[refs]

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
---
2-
refs/heads/master: 1c125d8829f38eadd62f4feef9b4f6b55b6aed7d
2+
refs/heads/master: bd6646e698c38564b8b324ec8cf30305db6a409a

trunk/src/comp/middle/last_use.rs

+18-3
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,13 @@ fn find_last_uses(c: @crate, def_map: resolve::def_map,
6363
ret mini_table;
6464
}
6565

66+
fn is_block(cx: ctx, id: node_id) -> bool {
67+
alt ty::struct(cx.tcx, ty::node_id_to_monotype(cx.tcx, id)) {
68+
ty::ty_fn({proto: proto_block., _}) { true }
69+
_ { false }
70+
}
71+
}
72+
6673
fn visit_expr(ex: @expr, cx: ctx, v: visit::vt<ctx>) {
6774
alt ex.node {
6875
expr_ret(oexpr) {
@@ -135,9 +142,8 @@ fn visit_expr(ex: @expr, cx: ctx, v: visit::vt<ctx>) {
135142
let arg_ts = ty::ty_fn_args(cx.tcx, ty::expr_ty(cx.tcx, f));
136143
for arg in args {
137144
alt arg.node {
138-
//NDM--register captured as uses
139-
expr_fn(_, _, _, captured) { fns += [arg]; }
140-
expr_fn_block(_, _) { fns += [arg]; }
145+
expr_fn(proto_block., _, _, _) { fns += [arg]; }
146+
expr_fn_block(_, _) when is_block(cx, arg.id) { fns += [arg]; }
141147
_ {
142148
alt arg_ts[i].mode {
143149
by_mut_ref. { clear_if_path(cx, arg, v, false); }
@@ -163,6 +169,15 @@ fn visit_fn(fk: visit::fn_kind, decl: fn_decl, body: blk,
163169
visit::visit_fn(fk, decl, body, sp, id, cx, v);
164170
});
165171
} else {
172+
alt cx.tcx.freevars.find(id) {
173+
some(vars) {
174+
for v in *vars {
175+
clear_in_current(cx, ast_util::def_id_of_def(v.def).node,
176+
false);
177+
}
178+
}
179+
_ {}
180+
}
166181
let old = nil;
167182
cx.blocks <-> old;
168183
visit::visit_fn(fk, decl, body, sp, id, cx, v);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
// Make sure #1399 stays fixed
2+
3+
fn main() {
4+
fn invoke(f: lambda()) { f(); }
5+
let k = ~22;
6+
let _u = {a: k};
7+
invoke {||log(error, k);}
8+
}

0 commit comments

Comments
 (0)