Skip to content

Commit 7f5e044

Browse files
committed
ConstantValue is the only other ctor allowed when subtracting from slice ctors
1 parent bd0e3cc commit 7f5e044

File tree

1 file changed

+39
-33
lines changed

1 file changed

+39
-33
lines changed

src/librustc_mir/hair/pattern/_match.rs

Lines changed: 39 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -742,44 +742,50 @@ impl<'tcx> Constructor<'tcx> {
742742
Single | Variant(_) | ConstantValue(..) | FloatRange(..) => {
743743
if other_ctors.iter().any(|c| c == self) { vec![] } else { vec![self.clone()] }
744744
}
745-
&Slice(slice) => match slice.value_kind() {
746-
FixedLen(self_len) => {
747-
let overlaps = |c: &Constructor<'_>| match *c {
748-
Slice(other_slice) => other_slice.value_kind().covers_length(self_len),
749-
_ => false,
750-
};
751-
if other_ctors.iter().any(overlaps) { vec![] } else { vec![Slice(slice)] }
752-
}
753-
VarLen(..) => {
754-
let mut remaining_slices = vec![slice.value_kind()];
755-
756-
// For each used slice, subtract from the current set of slices.
757-
for other_ctor in other_ctors {
758-
let other_slice = match other_ctor {
759-
Slice(slice) => slice.value_kind(),
760-
// FIXME(#65413): If `other_ctor` is not a slice, we assume it doesn't
761-
// cover any value here.
762-
_ => continue,
763-
};
764-
remaining_slices = remaining_slices
765-
.into_iter()
766-
.flat_map(|remaining_slice| remaining_slice.subtract(other_slice))
767-
.collect();
745+
&Slice(slice) => {
746+
let mut other_slices = other_ctors
747+
.iter()
748+
.filter_map(|c: &Constructor<'_>| match c {
749+
Slice(slice) => Some(*slice),
750+
// FIXME(#65413): We ignore `ConstantValue`s here.
751+
ConstantValue(..) => None,
752+
_ => bug!("bad slice pattern constructor {:?}", c),
753+
})
754+
.map(Slice::value_kind);
768755

769-
// If the constructors that have been considered so far already cover
770-
// the entire range of `self`, no need to look at more constructors.
771-
if remaining_slices.is_empty() {
772-
break;
756+
match slice.value_kind() {
757+
FixedLen(self_len) => {
758+
if other_slices.any(|other_slice| other_slice.covers_length(self_len)) {
759+
vec![]
760+
} else {
761+
vec![Slice(slice)]
773762
}
774763
}
764+
kind @ VarLen(..) => {
765+
let mut remaining_slices = vec![kind];
766+
767+
// For each used slice, subtract from the current set of slices.
768+
for other_slice in other_slices {
769+
remaining_slices = remaining_slices
770+
.into_iter()
771+
.flat_map(|remaining_slice| remaining_slice.subtract(other_slice))
772+
.collect();
773+
774+
// If the constructors that have been considered so far already cover
775+
// the entire range of `self`, no need to look at more constructors.
776+
if remaining_slices.is_empty() {
777+
break;
778+
}
779+
}
775780

776-
remaining_slices
777-
.into_iter()
778-
.map(|kind| Slice { array_len: slice.array_len, kind })
779-
.map(Slice)
780-
.collect()
781+
remaining_slices
782+
.into_iter()
783+
.map(|kind| Slice { array_len: slice.array_len, kind })
784+
.map(Slice)
785+
.collect()
786+
}
781787
}
782-
},
788+
}
783789
IntRange(self_range) => {
784790
let mut remaining_ranges = vec![self_range.clone()];
785791
for other_ctor in other_ctors {

0 commit comments

Comments
 (0)