diff options
| author | Marijn Haverbeke <marijnh@gmail.com> | 2011-09-28 10:41:19 +0200 |
|---|---|---|
| committer | Marijn Haverbeke <marijnh@gmail.com> | 2011-09-28 10:41:19 +0200 |
| commit | 16d5aaa96217555f4cba76e03b60ca7d1aaad935 (patch) | |
| tree | 9f97930c668ee0275d2c041e3f2257ad82792463 /src/comp/middle | |
| parent | e3626c940524c49d51d586b13375f64a52d44666 (diff) | |
| download | rust-16d5aaa96217555f4cba76e03b60ca7d1aaad935.tar.gz rust-16d5aaa96217555f4cba76e03b60ca7d1aaad935.zip | |
Wait with registering cleanups for locals until after the init code ran
Fixes a double-cleanup that was breaking unwind-tup.rs under valgrind.
Diffstat (limited to 'src/comp/middle')
| -rw-r--r-- | src/comp/middle/trans.rs | 9 |
1 files changed, 4 insertions, 5 deletions
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs index b9b0273d9cc..d31fd6cbf3c 100644 --- a/src/comp/middle/trans.rs +++ b/src/comp/middle/trans.rs @@ -4676,8 +4676,6 @@ fn trans_be(cx: @block_ctxt, e: @ast::expr) : ast_util::is_call_expr(e) -> fn init_local(bcx: @block_ctxt, local: @ast::local) -> @block_ctxt { let ty = node_id_type(bcx_ccx(bcx), local.node.id); let llptr = bcx.fcx.lllocals.get(local.node.id); - // Make a note to drop this slot on the way out. - add_clean(bcx, llptr, ty); if must_zero(bcx_ccx(bcx), local) { bcx = zero_alloca(bcx, llptr, ty); @@ -4698,9 +4696,10 @@ fn init_local(bcx: @block_ctxt, local: @ast::local) -> @block_ctxt { } _ { } } - bcx = - trans_alt::bind_irrefutable_pat(bcx, local.node.pat, llptr, - bcx.fcx.lllocals, false); + // Make a note to drop this slot on the way out. + add_clean(bcx, llptr, ty); + bcx = trans_alt::bind_irrefutable_pat(bcx, local.node.pat, llptr, + bcx.fcx.lllocals, false); ret bcx; fn must_zero(ccx: @crate_ctxt, local: @ast::local) -> bool { |
