diff options
| author | Oliver Schneider <git-spam-no-reply9815368754983@oli-obk.de> | 2017-08-29 09:55:40 +0200 |
|---|---|---|
| committer | Oliver Schneider <git-spam-no-reply9815368754983@oli-obk.de> | 2017-08-29 10:03:00 +0200 |
| commit | 206f0bd6dff718e7bb10522761f129948dccdbe7 (patch) | |
| tree | 7a692677caf1dcd1b65d982f1a02975fa45b80e5 | |
| parent | b8329da5e88683bf497f5584d2dde2b824cb86b6 (diff) | |
| download | rust-206f0bd6dff718e7bb10522761f129948dccdbe7.tar.gz rust-206f0bd6dff718e7bb10522761f129948dccdbe7.zip | |
Fix panic in subslice patterns of arrays (fixes #276)
| -rw-r--r-- | src/librustc_mir/interpret/lvalue.rs | 7 | ||||
| -rw-r--r-- | tests/run-pass/subslice_array.rs | 14 |
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"); +} |
