about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/librustc_mir/interpret/lvalue.rs7
-rw-r--r--tests/run-pass/subslice_array.rs14
2 files changed, 20 insertions, 1 deletions
diff --git a/src/librustc_mir/interpret/lvalue.rs b/src/librustc_mir/interpret/lvalue.rs
index 2bb0b88a356..c4ec2aa795e 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 00000000000..468cc9f0941
--- /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");
+}