From 7ae251789ccd0a647e5abfc8085a8bd42359de65 Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Tue, 20 Sep 2011 17:46:49 -0700 Subject: [PATCH] Make creation of unique boxes work again Issue #409 --- src/comp/middle/trans.rs | 17 +++++++++++++---- src/test/run-pass/unique-create.rs | 7 +++++++ src/test/run-pass/unique-init.rs | 3 +++ 3 files changed, 23 insertions(+), 4 deletions(-) create mode 100644 src/test/run-pass/unique-create.rs create mode 100644 src/test/run-pass/unique-init.rs diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs index 271b77585b60..697f6d9e05c6 100644 --- a/src/comp/middle/trans.rs +++ b/src/comp/middle/trans.rs @@ -4246,7 +4246,9 @@ fn trans_expr_out(cx: @block_ctxt, e: @ast::expr, output: out_method) -> CondBr(cx, cond, then_cx.llbb, else_cx.llbb); ret rslt(join_branches(cx, [check_res, els]), C_nil()); } - ast::expr_uniq(contents) { ret trans_uniq(cx, contents); } + ast::expr_uniq(contents) { + ret trans_uniq(cx, contents, e.id); + } ast::expr_break. { ret trans_break(e.span, cx); } ast::expr_cont. { ret trans_cont(e.span, cx); } ast::expr_ret(ex) { ret trans_ret(cx, ex); } @@ -4488,7 +4490,8 @@ fn trans_put(in_cx: @block_ctxt, e: option::t<@ast::expr>) -> result { ret rslt(next_cx, C_nil()); } -fn trans_uniq(cx: @block_ctxt, contents: @ast::expr) -> result { +fn trans_uniq(cx: @block_ctxt, contents: @ast::expr, + node_id: ast::node_id) -> result { let bcx = cx; let contents_ty = ty::expr_ty(bcx_tcx(bcx), contents); @@ -4500,10 +4503,16 @@ fn trans_uniq(cx: @block_ctxt, contents: @ast::expr) -> result { r = trans_shared_malloc(bcx, llptrty, llsz); bcx = r.bcx; - let llptrptr = r.val; + let llptr = r.val; + + let uniq_ty = node_id_type(bcx_ccx(cx), node_id); + r = alloc_ty(bcx, uniq_ty); + let llptrptr = r.val; + bcx = r.bcx; + Store(bcx, llptr, llptrptr); - let llptr = Load(bcx, llptrptr); r = trans_expr_out(bcx, contents, save_in(llptr)); + add_clean_temp(r.bcx, llptrptr, uniq_ty); ret rslt(r.bcx, llptrptr); } diff --git a/src/test/run-pass/unique-create.rs b/src/test/run-pass/unique-create.rs new file mode 100644 index 000000000000..c46cf29ba5da --- /dev/null +++ b/src/test/run-pass/unique-create.rs @@ -0,0 +1,7 @@ +fn main() { + ~100; +} + +fn vec() { + [0]; +} \ No newline at end of file diff --git a/src/test/run-pass/unique-init.rs b/src/test/run-pass/unique-init.rs new file mode 100644 index 000000000000..54f173fcd716 --- /dev/null +++ b/src/test/run-pass/unique-init.rs @@ -0,0 +1,3 @@ +fn main() { + let i = ~100; +} \ No newline at end of file