From b0d4f092010a0867be8b396929a2428d5c44c6d4 Mon Sep 17 00:00:00 2001 From: Michael Sullivan Date: Thu, 5 Jul 2012 14:38:38 -0700 Subject: [PATCH] Consider slices to be a structural type. Closes #2748. --- src/rustc/middle/trans/base.rs | 4 ++-- src/rustc/middle/ty.rs | 6 ++++-- src/test/run-pass/issue-2748-a.rs | 9 +++++++++ src/test/run-pass/issue-2748-b.rs | 8 ++++++++ 4 files changed, 23 insertions(+), 4 deletions(-) create mode 100644 src/test/run-pass/issue-2748-a.rs create mode 100644 src/test/run-pass/issue-2748-b.rs diff --git a/src/rustc/middle/trans/base.rs b/src/rustc/middle/trans/base.rs index dcbb4aa0fd9..cff52a8c1dd 100644 --- a/src/rustc/middle/trans/base.rs +++ b/src/rustc/middle/trans/base.rs @@ -1369,7 +1369,7 @@ fn copy_val_no_check(bcx: block, action: copy_action, dst: ValueRef, let _icx = bcx.insn_ctxt("copy_val_no_check"); let ccx = bcx.ccx(); let mut bcx = bcx; - if ty::type_is_scalar(t) || ty::type_is_slice(t) { + if ty::type_is_scalar(t) { Store(bcx, src, dst); ret bcx; } @@ -1401,7 +1401,7 @@ fn move_val(cx: block, action: copy_action, dst: ValueRef, let mut src_val = src.val; let tcx = cx.tcx(); let mut cx = cx; - if ty::type_is_scalar(t) || ty::type_is_slice(t) { + if ty::type_is_scalar(t) { if src.kind == owned { src_val = Load(cx, src_val); } Store(cx, src_val, dst); ret cx; diff --git a/src/rustc/middle/ty.rs b/src/rustc/middle/ty.rs index bdb7cb4d472..298aecf4fd7 100644 --- a/src/rustc/middle/ty.rs +++ b/src/rustc/middle/ty.rs @@ -1074,8 +1074,10 @@ fn type_is_bool(ty: t) -> bool { get(ty).struct == ty_bool } fn type_is_structural(ty: t) -> bool { alt get(ty).struct { ty_rec(_) | ty_class(*) | ty_tup(_) | ty_enum(*) | ty_fn(_) | - ty_trait(*) | ty_evec(_, vstore_fixed(_)) - | ty_estr(vstore_fixed(_)) { true } + ty_trait(*) | + ty_evec(_, vstore_fixed(_)) | ty_estr(vstore_fixed(_)) | + ty_evec(_, vstore_slice(_)) | ty_estr(vstore_slice(_)) + { true } _ { false } } } diff --git a/src/test/run-pass/issue-2748-a.rs b/src/test/run-pass/issue-2748-a.rs new file mode 100644 index 00000000000..7f1d4a45b61 --- /dev/null +++ b/src/test/run-pass/issue-2748-a.rs @@ -0,0 +1,9 @@ +class CMap/& { + let buf: [u8]/&; + + new(buf: [u8]/&) { + self.buf = buf; + } +} + +fn main() { } diff --git a/src/test/run-pass/issue-2748-b.rs b/src/test/run-pass/issue-2748-b.rs new file mode 100644 index 00000000000..a1bcdc5cd5d --- /dev/null +++ b/src/test/run-pass/issue-2748-b.rs @@ -0,0 +1,8 @@ +fn thing(x: &[int]) -> &[int] { x } +fn main() { + let x = &[1,2,3]; + let y = x; + let z = thing(x); + assert(z[2] == x[2]); + assert(z[1] == y[1]); +} -- GitLab