diff --git a/src/librustc_mir/interpret/lvalue.rs b/src/librustc_mir/interpret/lvalue.rs index 2bb0b88a356f..c4ec2aa795e8 100644 --- a/src/librustc_mir/interpret/lvalue.rs +++ b/src/librustc_mir/interpret/lvalue.rs @@ -476,7 +476,12 @@ impl<'a, 'tcx, M: Machine<'tcx>> EvalContext<'a, 'tcx, M> { ); assert!(u64::from(from) <= n - u64::from(to)); let ptr = base_ptr.offset(u64::from(from) * elem_size, &self)?; - let extra = LvalueExtra::Length(n - u64::from(to) - u64::from(from)); + // sublicing arrays produces arrays + let extra = if self.type_is_sized(base_ty) { + LvalueExtra::None + } else { + LvalueExtra::Length(n - u64::from(to) - u64::from(from)) + }; (ptr, extra) } }; diff --git a/tests/run-pass/subslice_array.rs b/tests/run-pass/subslice_array.rs new file mode 100644 index 000000000000..468cc9f09416 --- /dev/null +++ b/tests/run-pass/subslice_array.rs @@ -0,0 +1,14 @@ +#![feature(advanced_slice_patterns)] +#![feature(slice_patterns)] + +fn bar(a: &'static str, b: &'static str) -> [&'static str; 4] { + [a, b, b, a] +} + +fn main() { + let out = bar("baz", "foo"); + let [a, xs.., d] = out; + assert_eq!(a, "baz"); + assert_eq!(xs, ["foo", "foo"]); + assert_eq!(d, "baz"); +}