From 440e637edfc58f50365f658e28c86ae51c1327b2 Mon Sep 17 00:00:00 2001 From: Graydon Hoare Date: Wed, 8 Dec 2010 16:43:59 -0800 Subject: Fix boxed returns harder. Un-XFAIL output-slot-variants.rs. --- src/comp/middle/trans.rs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) (limited to 'src/comp') diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs index ef0e7143..08e98aba 100644 --- a/src/comp/middle/trans.rs +++ b/src/comp/middle/trans.rs @@ -1608,6 +1608,11 @@ impure fn trans_ret(@block_ctxt cx, &option.t[@ast.expr] e) -> result { case (some[@ast.expr](?x)) { auto t = typeck.expr_ty(x); r = trans_expr(cx, x); + + // A return is an implicit copy into a newborn anonymous + // 'return value' in the caller frame. + r.bcx = incr_all_refcnts(r.bcx, r.val, t).bcx; + if (typeck.type_is_structural(t)) { // We usually treat structurals by-pointer; in particular, // trans_expr will have given us a structure pointer. But in @@ -1615,12 +1620,6 @@ impure fn trans_ret(@block_ctxt cx, &option.t[@ast.expr] e) -> result { // value here (which makes sense; the frame is going away!) r.val = r.bcx.build.Load(r.val); } - if (typeck.type_is_boxed(t)) { - // A return is an implicit ++ on the refcount on any boxed - // value, as it is being newly referenced as the anonymous - // 'return value' from the function, in the caller frame. - r.bcx = incr_refcnt(r.bcx, r.val).bcx; - } } case (_) { /* fall through */ } } -- cgit v1.2.3