about summary refs log tree commit diff
diff options
context:
space:
mode:
authorOliver Schneider <git-spam-no-reply9815368754983@oli-obk.de>2017-08-29 09:55:40 +0200
committerOliver Schneider <git-spam-no-reply9815368754983@oli-obk.de>2017-08-29 10:03:00 +0200
commit206f0bd6dff718e7bb10522761f129948dccdbe7 (patch)
tree7a692677caf1dcd1b65d982f1a02975fa45b80e5
parentb8329da5e88683bf497f5584d2dde2b824cb86b6 (diff)
downloadrust-206f0bd6dff718e7bb10522761f129948dccdbe7.tar.gz
rust-206f0bd6dff718e7bb10522761f129948dccdbe7.zip
Fix panic in subslice patterns of arrays (fixes #276)
-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");
+}