From 879a952a372f917031857b56c5cc485f5d34b811 Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Tue, 17 May 2011 22:52:18 -0400 Subject: [PATCH] rustc: Find the correct outer scope in trans_block --- src/comp/middle/trans.rs | 6 +++++- src/test/run-pass/expr-block-ref.rs | 5 +++++ src/test/run-pass/expr-elseif-ref2.rs | 13 +++++++++++++ 3 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 src/test/run-pass/expr-block-ref.rs create mode 100644 src/test/run-pass/expr-elseif-ref2.rs diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs index 809f52713be8..819f4a22d3eb 100644 --- a/src/comp/middle/trans.rs +++ b/src/comp/middle/trans.rs @@ -6171,6 +6171,9 @@ fn trans_block(&@block_ctxt cx, &ast::block b) -> result { alt (b.node.expr) { case (some[@ast::expr](?e)) { + // Hold onto the context for this scope since we'll need it to + // find the outer scope + auto scope_bcx = bcx; r = trans_expr(bcx, e); bcx = r.bcx; @@ -6212,7 +6215,8 @@ fn trans_block(&@block_ctxt cx, &ast::block b) -> result { auto cleanup = bind drop_hoisted_ty(_, res_alloca.val, r_ty); - find_outer_scope_cx(bcx).cleanups += [clean(cleanup)]; + auto outer_scope_cx = find_outer_scope_cx(scope_bcx); + outer_scope_cx.cleanups += [clean(cleanup)]; r = res(bcx, load_if_immediate(bcx, res_alloca.val, r_ty)); diff --git a/src/test/run-pass/expr-block-ref.rs b/src/test/run-pass/expr-block-ref.rs new file mode 100644 index 000000000000..e65c682198c2 --- /dev/null +++ b/src/test/run-pass/expr-block-ref.rs @@ -0,0 +1,5 @@ +// xfail-stage0 + +fn main() { + auto x = {{[10]}}; +} diff --git a/src/test/run-pass/expr-elseif-ref2.rs b/src/test/run-pass/expr-elseif-ref2.rs new file mode 100644 index 000000000000..329b2a3255bd --- /dev/null +++ b/src/test/run-pass/expr-elseif-ref2.rs @@ -0,0 +1,13 @@ +// xfail-stage0 +// xfail-stage1 +// xfail-stage2 + +fn main() { + auto x = if (false) { + [0u] + } else if (true) { + [10u] + } else { + [0u] + }; +}