about summary refs log tree commit diff
path: root/src/comp/middle
diff options
context:
space:
mode:
authorMarijn Haverbeke <marijnh@gmail.com>2011-09-28 10:41:19 +0200
committerMarijn Haverbeke <marijnh@gmail.com>2011-09-28 10:41:19 +0200
commit16d5aaa96217555f4cba76e03b60ca7d1aaad935 (patch)
tree9f97930c668ee0275d2c041e3f2257ad82792463 /src/comp/middle
parente3626c940524c49d51d586b13375f64a52d44666 (diff)
downloadrust-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.rs9
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 {