From 1e5266260aad92973caeede3500f848c277f84e2 Mon Sep 17 00:00:00 2001 From: Marijn Haverbeke Date: Wed, 22 Feb 2012 13:35:17 +0100 Subject: [PATCH] Take move captures in account in mutability checker Closes #1461 --- src/comp/middle/mutbl.rs | 10 ++++++++++ src/comp/middle/trans/closure.rs | 2 ++ src/test/run-pass/unused-move-capture.rs | 5 +++++ 3 files changed, 17 insertions(+) create mode 100644 src/test/run-pass/unused-move-capture.rs diff --git a/src/comp/middle/mutbl.rs b/src/comp/middle/mutbl.rs index 7ba837f8231..b490387424d 100644 --- a/src/comp/middle/mutbl.rs +++ b/src/comp/middle/mutbl.rs @@ -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); diff --git a/src/comp/middle/trans/closure.rs b/src/comp/middle/trans/closure.rs index cde07aeedc4..3f7274deae4 100644 --- a/src/comp/middle/trans/closure.rs +++ b/src/comp/middle/trans/closure.rs @@ -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); } } } diff --git a/src/test/run-pass/unused-move-capture.rs b/src/test/run-pass/unused-move-capture.rs new file mode 100644 index 00000000000..d6fa0e533d5 --- /dev/null +++ b/src/test/run-pass/unused-move-capture.rs @@ -0,0 +1,5 @@ +fn main() { + let x = ~1; + let lam_move = fn@[move x]() { }; + lam_move(); +}