From 4f7ecce7d1d4d4a66d1e0977e34d8887b6de8165 Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Sat, 24 Sep 2011 21:20:36 -0700 Subject: [PATCH] Support non-immediates in trans_uniq::copy_val Issue #409 --- src/comp/middle/trans_uniq.rs | 2 +- src/test/run-pass/generic-fn-unique.rs | 3 +-- src/test/run-pass/move-1-unique.rs | 1 - src/test/run-pass/move-3-unique.rs | 1 - src/test/run-pass/move-4-unique.rs | 1 - src/test/run-pass/unique-pat-2.rs | 2 ++ src/test/run-pass/unique-rec.rs | 6 ++++++ 7 files changed, 10 insertions(+), 6 deletions(-) create mode 100644 src/test/run-pass/unique-rec.rs diff --git a/src/comp/middle/trans_uniq.rs b/src/comp/middle/trans_uniq.rs index 0986a0c1265..5bae18731e7 100644 --- a/src/comp/middle/trans_uniq.rs +++ b/src/comp/middle/trans_uniq.rs @@ -97,7 +97,7 @@ fn copy_val(cx: @block_ctxt, dst: ValueRef, src: ValueRef, let {bcx, val: llptr} = alloc_uniq(cx, ty); Store(bcx, llptr, dst); - let src = Load(bcx, src); + let src = load_if_immediate(bcx, src, content_ty); let dst = llptr; let bcx = trans::copy_val(bcx, INIT, dst, src, content_ty); ret bcx; diff --git a/src/test/run-pass/generic-fn-unique.rs b/src/test/run-pass/generic-fn-unique.rs index f119df5d085..2b9e73a000b 100644 --- a/src/test/run-pass/generic-fn-unique.rs +++ b/src/test/run-pass/generic-fn-unique.rs @@ -1,5 +1,4 @@ -// xfail-test -fn f(x: ~T) -> ~T { ret x; } +fn f<@T>(x: ~T) -> ~T { ret x; } fn main() { let x = f(~3); log *x; } diff --git a/src/test/run-pass/move-1-unique.rs b/src/test/run-pass/move-1-unique.rs index 10ea3d3ddd1..27351a1f123 100644 --- a/src/test/run-pass/move-1-unique.rs +++ b/src/test/run-pass/move-1-unique.rs @@ -1,4 +1,3 @@ -// xfail-test fn test(x: bool, foo: ~{x: int, y: int, z: int}) -> int { let bar = foo; diff --git a/src/test/run-pass/move-3-unique.rs b/src/test/run-pass/move-3-unique.rs index 36637319d13..dd2c9ea0efb 100644 --- a/src/test/run-pass/move-3-unique.rs +++ b/src/test/run-pass/move-3-unique.rs @@ -1,4 +1,3 @@ -// xfail-test use std; import std::uint; diff --git a/src/test/run-pass/move-4-unique.rs b/src/test/run-pass/move-4-unique.rs index 8eab470242f..2e91a799e76 100644 --- a/src/test/run-pass/move-4-unique.rs +++ b/src/test/run-pass/move-4-unique.rs @@ -1,4 +1,3 @@ -// xfail-test use std; import std::uint; diff --git a/src/test/run-pass/unique-pat-2.rs b/src/test/run-pass/unique-pat-2.rs index 683699597aa..87b58a595d2 100644 --- a/src/test/run-pass/unique-pat-2.rs +++ b/src/test/run-pass/unique-pat-2.rs @@ -1,3 +1,5 @@ +// xfail-test + type foo = {a: int, b: uint}; tag bar { u(~foo); w(int); } diff --git a/src/test/run-pass/unique-rec.rs b/src/test/run-pass/unique-rec.rs new file mode 100644 index 00000000000..7e0d6ce1e35 --- /dev/null +++ b/src/test/run-pass/unique-rec.rs @@ -0,0 +1,6 @@ + +fn main() { + let x = ~{x: 1}; + let bar = x; + assert bar.x == 1; +}