diff options
| author | Brian Anderson <banderson@mozilla.com> | 2011-09-20 17:46:49 -0700 |
|---|---|---|
| committer | Brian Anderson <banderson@mozilla.com> | 2011-09-20 17:51:17 -0700 |
| commit | 7ae251789ccd0a647e5abfc8085a8bd42359de65 (patch) | |
| tree | 29da75623f0fe7806b17f4e203878ce78180d664 | |
| parent | 865dcb663da2d0534d508346cbe1df5dc66f3ad6 (diff) | |
| download | rust-7ae251789ccd0a647e5abfc8085a8bd42359de65.tar.gz rust-7ae251789ccd0a647e5abfc8085a8bd42359de65.zip | |
Make creation of unique boxes work again
Issue #409
| -rw-r--r-- | src/comp/middle/trans.rs | 15 | ||||
| -rw-r--r-- | src/test/run-pass/unique-create.rs | 7 | ||||
| -rw-r--r-- | src/test/run-pass/unique-init.rs | 3 |
3 files changed, 22 insertions, 3 deletions
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs index 271b77585b6..697f6d9e05c 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 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 00000000000..c46cf29ba5d --- /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 00000000000..54f173fcd71 --- /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 |
