diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs index 85675e91577..06acf7ded06 100644 --- a/src/comp/middle/trans.rs +++ b/src/comp/middle/trans.rs @@ -5459,8 +5459,11 @@ fn trans_tag_variant(cx: @local_ctxt, tag_id: ast::node_id, let arg_ty = arg_tys[i].ty; let llargval; if ty::type_is_structural(cx.ccx.tcx, arg_ty) || - ty::type_has_dynamic_size(cx.ccx.tcx, arg_ty) || - ty::type_is_unique(cx.ccx.tcx, arg_ty) { + ty::type_has_dynamic_size(cx.ccx.tcx, arg_ty) || + (ty::type_is_unique(cx.ccx.tcx, arg_ty) + && !ty::type_is_unique_box(cx.ccx.tcx, arg_ty)) { + // FIXME: Why do we do this for other unique pointer types but not + // unique boxes? Something's not quite right. llargval = llargptr; } else { llargval = Load(bcx, llargptr); } bcx = copy_val(bcx, INIT, lldestptr, llargval, arg_ty); diff --git a/src/test/run-pass/unique-containing-tag.rs b/src/test/run-pass/unique-containing-tag.rs new file mode 100644 index 00000000000..9bc189cbea9 --- /dev/null +++ b/src/test/run-pass/unique-containing-tag.rs @@ -0,0 +1,19 @@ +fn main() { + tag t { t1(int); t2(int); } + + let x = ~t1(10); + + alt *x { + t1(a) { + assert a == 10; + } + _ { fail; } + } + + alt x { + ~t1(a) { + assert a == 10; + } + _ { fail; } + } +} \ No newline at end of file diff --git a/src/test/run-pass/unique-in-tag.rs b/src/test/run-pass/unique-in-tag.rs new file mode 100644 index 00000000000..0b364ae13b5 --- /dev/null +++ b/src/test/run-pass/unique-in-tag.rs @@ -0,0 +1,16 @@ +fn test1() { + tag bar { u(~int); w(int); } + + let x = u(~10); + assert alt x { + u(a) { + log_err a; + *a + } + _ { 66 } + } == 10; +} + +fn main() { + test1(); +} diff --git a/src/test/run-pass/unique-pat-2.rs b/src/test/run-pass/unique-pat-2.rs index 87b58a595d2..91a95ed3aee 100644 --- a/src/test/run-pass/unique-pat-2.rs +++ b/src/test/run-pass/unique-pat-2.rs @@ -1,4 +1,3 @@ -// xfail-test type foo = {a: int, b: uint}; tag bar { u(~foo); w(int); } diff --git a/src/test/run-pass/unique-pat-3.rs b/src/test/run-pass/unique-pat-3.rs new file mode 100644 index 00000000000..cd422fe9151 --- /dev/null +++ b/src/test/run-pass/unique-pat-3.rs @@ -0,0 +1,12 @@ + +tag bar { u(~int); w(int); } + +fn main() { + assert alt u(~10) { + u(a) { + log_err a; + *a + } + _ { 66 } + } == 10; +}