From 9626e2f71f86dd710c810b3c92cb8c84ecde6364 Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Mon, 19 Sep 2011 17:04:04 -0700 Subject: [PATCH] Register tuple cleanups after the tuple is built Issue #936 --- src/comp/middle/trans.rs | 4 +++- src/test/run-fail/unwind-tup.rs | 9 +++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 src/test/run-fail/unwind-tup.rs diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs index fa56780e8db..ac45840a81f 100644 --- a/src/comp/middle/trans.rs +++ b/src/comp/middle/trans.rs @@ -3939,7 +3939,6 @@ fn trans_tup(cx: @block_ctxt, elts: [@ast::expr], id: ast::node_id) -> let tup_res = alloc_ty(bcx, t); let tup_val = tup_res.val; bcx = tup_res.bcx; - add_clean_temp(cx, tup_val, t); let i: int = 0; for e in elts { let e_ty = ty::expr_ty(cx.fcx.lcx.ccx.tcx, e); @@ -3951,6 +3950,9 @@ fn trans_tup(cx: @block_ctxt, elts: [@ast::expr], id: ast::node_id) -> bcx = move_val_if_temp(dst_res.bcx, INIT, dst_res.val, src, e_ty); i += 1; } + + // Only register the cleanups after the tuple is built + add_clean_temp(cx, tup_val, t); ret rslt(bcx, tup_val); } diff --git a/src/test/run-fail/unwind-tup.rs b/src/test/run-fail/unwind-tup.rs new file mode 100644 index 00000000000..6562c5ded27 --- /dev/null +++ b/src/test/run-fail/unwind-tup.rs @@ -0,0 +1,9 @@ +// error-pattern:fail + +fn fold_local() -> @[int]{ + fail; +} + +fn main() { + let lss = (fold_local(), 0); +}