about summary refs log tree commit diff
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2011-09-20 17:46:49 -0700
committerBrian Anderson <banderson@mozilla.com>2011-09-20 17:51:17 -0700
commit7ae251789ccd0a647e5abfc8085a8bd42359de65 (patch)
tree29da75623f0fe7806b17f4e203878ce78180d664
parent865dcb663da2d0534d508346cbe1df5dc66f3ad6 (diff)
downloadrust-7ae251789ccd0a647e5abfc8085a8bd42359de65.tar.gz
rust-7ae251789ccd0a647e5abfc8085a8bd42359de65.zip
Make creation of unique boxes work again
Issue #409
-rw-r--r--src/comp/middle/trans.rs15
-rw-r--r--src/test/run-pass/unique-create.rs7
-rw-r--r--src/test/run-pass/unique-init.rs3
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