@@ -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