@@ -1036,30 +1036,21 @@ impl ConstructorSet {
10361036 where
10371037 ' tcx : ' a ,
10381038 {
1039- let mut missing = Vec :: new ( ) ;
10401039 let mut present: SmallVec < [ _ ; 1 ] > = SmallVec :: new ( ) ;
1040+ let mut missing = Vec :: new ( ) ;
10411041 // Constructors in `ctors`, except wildcards.
1042- let mut seen = Vec :: new ( ) ;
1043- for ctor in ctors. cloned ( ) {
1044- match ctor {
1045- // Wildcards in `ctors` are irrelevant to splitting
1046- Opaque | Wildcard => { }
1047- _ => {
1048- seen. push ( ctor) ;
1049- }
1050- }
1051- }
1042+ let mut seen = ctors. filter ( |c| !( matches ! ( c, Opaque | Wildcard ) ) ) ;
10521043 let mut nonexhaustive_enum_missing_visible_variants = false ;
10531044 match self {
10541045 ConstructorSet :: Single => {
1055- if seen. is_empty ( ) {
1046+ if seen. next ( ) . is_none ( ) {
10561047 missing. push ( Single ) ;
10571048 } else {
10581049 present. push ( Single ) ;
10591050 }
10601051 }
10611052 ConstructorSet :: Variants { visible_variants, hidden_variants, non_exhaustive } => {
1062- let seen_set: FxHashSet < _ > = seen. iter ( ) . map ( |c| c. as_variant ( ) . unwrap ( ) ) . collect ( ) ;
1053+ let seen_set: FxHashSet < _ > = seen. map ( |c| c. as_variant ( ) . unwrap ( ) ) . collect ( ) ;
10631054 let mut skipped_a_hidden_variant = false ;
10641055 for variant in visible_variants {
10651056 let ctor = Variant ( * variant) ;
@@ -1089,15 +1080,16 @@ impl ConstructorSet {
10891080 }
10901081 }
10911082 ConstructorSet :: Integers { range_1, range_2, non_exhaustive } => {
1092- let seen_ranges = seen. iter ( ) . map ( |ctor| ctor. as_int_range ( ) . unwrap ( ) ) . cloned ( ) ;
1093- for ( seen, splitted_range) in range_1. split ( seen_ranges. clone ( ) ) {
1083+ let seen_ranges: Vec < _ > =
1084+ seen. map ( |ctor| ctor. as_int_range ( ) . unwrap ( ) . clone ( ) ) . collect ( ) ;
1085+ for ( seen, splitted_range) in range_1. split ( seen_ranges. iter ( ) . cloned ( ) ) {
10941086 match seen {
10951087 Presence :: Unseen => missing. push ( IntRange ( splitted_range) ) ,
10961088 Presence :: Seen => present. push ( IntRange ( splitted_range) ) ,
10971089 }
10981090 }
10991091 if let Some ( range_2) = range_2 {
1100- for ( seen, splitted_range) in range_2. split ( seen_ranges) {
1092+ for ( seen, splitted_range) in range_2. split ( seen_ranges. into_iter ( ) ) {
11011093 match seen {
11021094 Presence :: Unseen => missing. push ( IntRange ( splitted_range) ) ,
11031095 Presence :: Seen => present. push ( IntRange ( splitted_range) ) ,
@@ -1110,7 +1102,7 @@ impl ConstructorSet {
11101102 }
11111103 }
11121104 & ConstructorSet :: Slice ( array_len) => {
1113- let seen_slices = seen. iter ( ) . map ( |c| c. as_slice ( ) . unwrap ( ) ) ;
1105+ let seen_slices = seen. map ( |c| c. as_slice ( ) . unwrap ( ) ) ;
11141106 let base_slice = Slice { kind : VarLen ( 0 , 0 ) , array_len } ;
11151107 for ( seen, splitted_slice) in base_slice. split ( seen_slices) {
11161108 let ctor = Slice ( splitted_slice) ;
@@ -1123,7 +1115,7 @@ impl ConstructorSet {
11231115 ConstructorSet :: SliceOfEmpty => {
11241116 // Behaves essentially like `Single`.
11251117 let slice = Slice ( Slice :: new ( None , FixedLen ( 0 ) ) ) ;
1126- if seen. is_empty ( ) {
1118+ if seen. next ( ) . is_none ( ) {
11271119 missing. push ( slice) ;
11281120 } else {
11291121 present. push ( slice) ;
@@ -1132,7 +1124,7 @@ impl ConstructorSet {
11321124 ConstructorSet :: Unlistable => {
11331125 // Since we can't list constructors, we take the ones in the column. This might list
11341126 // some constructors several times but there's not much we can do.
1135- present. extend ( seen. iter ( ) . cloned ( ) ) ;
1127+ present. extend ( seen. cloned ( ) ) ;
11361128 missing. push ( NonExhaustive ) ;
11371129 }
11381130 // If `exhaustive_patterns` is disabled and our scrutinee is an empty type, we cannot
0 commit comments