@@ -975,7 +975,7 @@ enum Fields<'p, 'tcx> {
975975 Slice ( & ' p [ Pat < ' tcx > ] ) ,
976976 Vec ( SmallVec < [ & ' p Pat < ' tcx > ; 2 ] > ) ,
977977 /// Patterns where some of the fields need to be hidden.
978- Filtered ( SmallVec < [ FilteredField < ' p , ' tcx > ; 2 ] > ) ,
978+ Filtered { fields : SmallVec < [ FilteredField < ' p , ' tcx > ; 2 ] > , len : usize } ,
979979}
980980
981981impl < ' p , ' tcx > Fields < ' p , ' tcx > {
@@ -1038,6 +1038,7 @@ impl<'p, 'tcx> Fields<'p, 'tcx> {
10381038 if has_no_hidden_fields {
10391039 Fields :: wildcards_from_tys ( cx, field_tys)
10401040 } else {
1041+ let mut len = 0 ;
10411042 let fields = variant
10421043 . fields
10431044 . iter ( )
@@ -1054,11 +1055,12 @@ impl<'p, 'tcx> Fields<'p, 'tcx> {
10541055 if is_uninhabited && ( !is_visible || is_non_exhaustive) {
10551056 FilteredField :: Hidden ( ty)
10561057 } else {
1058+ len += 1 ;
10571059 FilteredField :: Kept ( wildcard_from_ty ( ty) )
10581060 }
10591061 } )
10601062 . collect ( ) ;
1061- Fields :: Filtered ( fields)
1063+ Fields :: Filtered { fields, len }
10621064 }
10631065 }
10641066 }
@@ -1079,7 +1081,7 @@ impl<'p, 'tcx> Fields<'p, 'tcx> {
10791081 match self {
10801082 Fields :: Slice ( pats) => pats. len ( ) ,
10811083 Fields :: Vec ( pats) => pats. len ( ) ,
1082- Fields :: Filtered ( fields ) => fields . iter ( ) . filter ( |p| p . kept ( ) . is_some ( ) ) . count ( ) ,
1084+ Fields :: Filtered { len , .. } => * len ,
10831085 }
10841086 }
10851087
@@ -1088,7 +1090,7 @@ impl<'p, 'tcx> Fields<'p, 'tcx> {
10881090 let pats: SmallVec < [ _ ; 2 ] > = match self {
10891091 Fields :: Slice ( pats) => pats. iter ( ) . cloned ( ) . collect ( ) ,
10901092 Fields :: Vec ( pats) => pats. into_iter ( ) . cloned ( ) . collect ( ) ,
1091- Fields :: Filtered ( fields) => {
1093+ Fields :: Filtered { fields, .. } => {
10921094 // We don't skip any fields here.
10931095 fields. into_iter ( ) . map ( |p| p. to_pattern ( ) ) . collect ( )
10941096 }
@@ -1122,7 +1124,7 @@ impl<'p, 'tcx> Fields<'p, 'tcx> {
11221124 pats[ i] = pat
11231125 }
11241126 }
1125- Fields :: Filtered ( fields) => {
1127+ Fields :: Filtered { fields, .. } => {
11261128 for ( i, pat) in new_pats {
11271129 if let FilteredField :: Kept ( p) = & mut fields[ i] {
11281130 * p = pat
@@ -1144,7 +1146,7 @@ impl<'p, 'tcx> Fields<'p, 'tcx> {
11441146 let pats: & [ _ ] = cx. pattern_arena . alloc_from_iter ( pats) ;
11451147
11461148 match self {
1147- Fields :: Filtered ( fields) => {
1149+ Fields :: Filtered { fields, len } => {
11481150 let mut pats = pats. iter ( ) ;
11491151 let mut fields = fields. clone ( ) ;
11501152 for f in & mut fields {
@@ -1153,7 +1155,7 @@ impl<'p, 'tcx> Fields<'p, 'tcx> {
11531155 * p = pats. next ( ) . unwrap ( ) ;
11541156 }
11551157 }
1156- Fields :: Filtered ( fields)
1158+ Fields :: Filtered { fields, len : * len }
11571159 }
11581160 _ => Fields :: Slice ( pats) ,
11591161 }
@@ -1166,7 +1168,7 @@ impl<'p, 'tcx> Fields<'p, 'tcx> {
11661168 pats. extend_from_slice ( stack) ;
11671169 pats
11681170 }
1169- Fields :: Filtered ( fields) => {
1171+ Fields :: Filtered { fields, .. } => {
11701172 // We skip hidden fields here
11711173 fields. into_iter ( ) . filter_map ( |p| p. kept ( ) ) . chain ( stack. iter ( ) . copied ( ) ) . collect ( )
11721174 }
0 commit comments