From fbfd8552ab1cd4931e1f4afd9c480dfb35c99da8 Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Sun, 15 May 2011 01:51:31 -0400 Subject: [PATCH] Return a better result from blocks. Closes issue #377 Blocks return in a copy of the result of their ending expression, not the direct result of the ending expression, as that may be a local variable which gets zeroed by drop_slot. --- src/comp/middle/trans.rs | 3 +++ src/test/run-pass/expr-block-slot.rs | 19 +++++++++++++++++++ 2 files changed, 22 insertions(+) create mode 100644 src/test/run-pass/expr-block-slot.rs diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs index 600bf7e9e219..ad315df2dbff 100644 --- a/src/comp/middle/trans.rs +++ b/src/comp/middle/trans.rs @@ -6252,6 +6252,9 @@ 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)]; + + r = res(bcx, load_if_immediate(bcx, + res_alloca.val, r_ty)); } } } diff --git a/src/test/run-pass/expr-block-slot.rs b/src/test/run-pass/expr-block-slot.rs new file mode 100644 index 000000000000..4a196f060726 --- /dev/null +++ b/src/test/run-pass/expr-block-slot.rs @@ -0,0 +1,19 @@ +// xfail-stage0 + +// Regression test for issue #377 + +fn main() { + auto a = { + auto b = tup(3); + b + }; + + assert a._0 == 3; + + auto c = { + auto d = rec(v=3); + d + }; + + assert c.v == 3; +}