Skip to content

Commit 206f0bd

Browse files
committed
Fix panic in subslice patterns of arrays (fixes rust-lang#276)
1 parent b8329da commit 206f0bd

File tree

2 files changed

+20
-1
lines changed

2 files changed

+20
-1
lines changed

Diff for: src/librustc_mir/interpret/lvalue.rs

+6-1
Original file line numberDiff line numberDiff line change
@@ -476,7 +476,12 @@ impl<'a, 'tcx, M: Machine<'tcx>> EvalContext<'a, 'tcx, M> {
476476
);
477477
assert!(u64::from(from) <= n - u64::from(to));
478478
let ptr = base_ptr.offset(u64::from(from) * elem_size, &self)?;
479-
let extra = LvalueExtra::Length(n - u64::from(to) - u64::from(from));
479+
// sublicing arrays produces arrays
480+
let extra = if self.type_is_sized(base_ty) {
481+
LvalueExtra::None
482+
} else {
483+
LvalueExtra::Length(n - u64::from(to) - u64::from(from))
484+
};
480485
(ptr, extra)
481486
}
482487
};

Diff for: tests/run-pass/subslice_array.rs

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#![feature(advanced_slice_patterns)]
2+
#![feature(slice_patterns)]
3+
4+
fn bar(a: &'static str, b: &'static str) -> [&'static str; 4] {
5+
[a, b, b, a]
6+
}
7+
8+
fn main() {
9+
let out = bar("baz", "foo");
10+
let [a, xs.., d] = out;
11+
assert_eq!(a, "baz");
12+
assert_eq!(xs, ["foo", "foo"]);
13+
assert_eq!(d, "baz");
14+
}

0 commit comments

Comments
 (0)