@@ -742,44 +742,50 @@ impl<'tcx> Constructor<'tcx> {
742
742
Single | Variant ( _) | ConstantValue ( ..) | FloatRange ( ..) => {
743
743
if other_ctors. iter ( ) . any ( |c| c == self ) { vec ! [ ] } else { vec ! [ self . clone( ) ] }
744
744
}
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) ;
768
755
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) ]
773
762
}
774
763
}
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
+ }
775
780
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
+ }
781
787
}
782
- } ,
788
+ }
783
789
IntRange ( self_range) => {
784
790
let mut remaining_ranges = vec ! [ self_range. clone( ) ] ;
785
791
for other_ctor in other_ctors {
0 commit comments