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(); +}