diff --git a/src/rustc/middle/trans/tvec.rs b/src/rustc/middle/trans/tvec.rs index 0b3b005503c..e41e8665cd8 100644 --- a/src/rustc/middle/trans/tvec.rs +++ b/src/rustc/middle/trans/tvec.rs @@ -102,6 +102,7 @@ fn trans_evec(bcx: block, args: [@ast::expr], let vec_ty = node_id_type(bcx, id); let unit_ty = ty::sequence_element_type(bcx.tcx(), vec_ty); let llunitty = type_of::type_of(ccx, unit_ty); + let unit_sz = llsize_of(ccx, llunitty); let mut {bcx, val, dataptr} = alt vst { @@ -122,8 +123,14 @@ fn trans_evec(bcx: block, args: [@ast::expr], let n = vec::len(args); let n = C_uint(ccx, n); let vp = base::arrayalloca(bcx, llunitty, n); - let v = C_struct([vp, n]); - {bcx: bcx, val: v, dataptr: vp} + let len = Mul(bcx, n, unit_sz); + + let p = base::alloca(bcx, T_struct([T_ptr(llunitty), + ccx.int_type])); + Store(bcx, vp, GEPi(bcx, p, [0, abi::slice_elt_base])); + Store(bcx, len, GEPi(bcx, p, [0, abi::slice_elt_len])); + + {bcx: bcx, val: p, dataptr: vp} } ast::vstore_uniq { let {bcx, val} = alloc_uniq(bcx, llunitty, args.len()); @@ -157,6 +164,9 @@ fn trans_evec(bcx: block, args: [@ast::expr], // We wrote into the destination in the fixed case. ret bcx; } + ast::vstore_slice(_) { + ret base::store_in_dest(bcx, Load(bcx, val), dest); + } _ { ret base::store_in_dest(bcx, val, dest); } diff --git a/src/test/run-pass/evec-slice.rs b/src/test/run-pass/evec-slice.rs new file mode 100644 index 00000000000..1c7799ce2c3 --- /dev/null +++ b/src/test/run-pass/evec-slice.rs @@ -0,0 +1,7 @@ +fn main() { + let x : [int]/& = [1,2,3,4,5]/&; + let mut z = [1,2,3,4,5]/&; + z = x; + assert z[0] == 1; + assert z[4] == 5; +} diff --git a/src/test/run-pass/regions-borrow-estr-uniq.rs b/src/test/run-pass/regions-borrow-estr-uniq.rs index 2794a03f5ff..f118b96bb41 100644 --- a/src/test/run-pass/regions-borrow-estr-uniq.rs +++ b/src/test/run-pass/regions-borrow-estr-uniq.rs @@ -6,4 +6,8 @@ fn main() { let p = "hello"/~; let r = foo(p); assert r == 'h' as u8; + + let p = "hello"; + let r = foo(p); + assert r == 'h' as u8; } diff --git a/src/test/run-pass/regions-borrow-evec-uniq.rs b/src/test/run-pass/regions-borrow-evec-uniq.rs new file mode 100644 index 00000000000..3cfcd015dde --- /dev/null +++ b/src/test/run-pass/regions-borrow-evec-uniq.rs @@ -0,0 +1,13 @@ +fn foo(x: [int]/&) -> int { + x[0] +} + +fn main() { + let p = [1,2,3,4,5]/~; + let r = foo(p); + assert r == 1; + + let p = [5,4,3,2,1]; + let r = foo(p); + assert r == 5; +} diff --git a/src/test/run-pass/vec-concat.rs b/src/test/run-pass/vec-concat.rs index 08a81ba6e92..3a5a1916d64 100644 --- a/src/test/run-pass/vec-concat.rs +++ b/src/test/run-pass/vec-concat.rs @@ -1,6 +1,3 @@ - - - // -*- rust -*- fn main() { let a: [int] = [1, 2, 3, 4, 5];