1
Fork 0

Take move captures in account in mutability checker

Closes #1461
This commit is contained in:
Marijn Haverbeke 2012-02-22 13:35:17 +01:00
parent 8015e6d52b
commit 1e5266260a
3 changed files with 17 additions and 0 deletions

View file

@ -172,6 +172,16 @@ fn visit_expr(cx: @ctx, ex: @expr, &&e: (), v: visit::vt<()>) {
expr_assign(dest, src) | expr_assign_op(_, dest, src) {
check_lval(cx, dest, msg_assign);
}
expr_fn(_, _, _, cap) {
for moved in cap.moves {
let def = cx.tcx.def_map.get(moved.id);
alt is_immutable_def(cx, def) {
some(name) { mk_err(cx, moved.span, msg_move_out, moved.name); }
_ { }
}
cx.mutbl_map.insert(ast_util::def_id_of_def(def).node, ());
}
}
_ { }
}
visit::visit_expr(ex, e, v);

View file

@ -376,7 +376,9 @@ fn build_closure(bcx0: block,
env_vals += [env_move(lv.val, ty, lv.kind)];
}
capture::cap_drop {
assert lv.kind == owned;
bcx = drop_ty(bcx, lv.val, ty);
bcx = zero_alloca(bcx, lv.val, ty);
}
}
}

View file

@ -0,0 +1,5 @@
fn main() {
let x = ~1;
let lam_move = fn@[move x]() { };
lam_move();
}