Fix boxed returns harder. Un-XFAIL output-slot-variants.rs.

This commit is contained in:
Graydon Hoare 2010-12-08 16:43:59 -08:00
parent 652ae9f50e
commit 440e637edf
2 changed files with 6 additions and 6 deletions

View File

@ -542,6 +542,7 @@ TEST_XFAILS_SELF := $(filter-out \
large-records.rs \
lazy-init.rs \
multiline-comment.rs \
output-slot-variants.rs \
readalias.rs \
rec.rs \
rec-auto.rs \

View File

@ -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 */ }
}