@@ -975,7 +975,7 @@ enum Fields<'p, 'tcx> {
975
975
Slice ( & ' p [ Pat < ' tcx > ] ) ,
976
976
Vec ( SmallVec < [ & ' p Pat < ' tcx > ; 2 ] > ) ,
977
977
/// 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 } ,
979
979
}
980
980
981
981
impl < ' p , ' tcx > Fields < ' p , ' tcx > {
@@ -1038,6 +1038,7 @@ impl<'p, 'tcx> Fields<'p, 'tcx> {
1038
1038
if has_no_hidden_fields {
1039
1039
Fields :: wildcards_from_tys ( cx, field_tys)
1040
1040
} else {
1041
+ let mut len = 0 ;
1041
1042
let fields = variant
1042
1043
. fields
1043
1044
. iter ( )
@@ -1054,11 +1055,12 @@ impl<'p, 'tcx> Fields<'p, 'tcx> {
1054
1055
if is_uninhabited && ( !is_visible || is_non_exhaustive) {
1055
1056
FilteredField :: Hidden ( ty)
1056
1057
} else {
1058
+ len += 1 ;
1057
1059
FilteredField :: Kept ( wildcard_from_ty ( ty) )
1058
1060
}
1059
1061
} )
1060
1062
. collect ( ) ;
1061
- Fields :: Filtered ( fields)
1063
+ Fields :: Filtered { fields, len }
1062
1064
}
1063
1065
}
1064
1066
}
@@ -1079,7 +1081,7 @@ impl<'p, 'tcx> Fields<'p, 'tcx> {
1079
1081
match self {
1080
1082
Fields :: Slice ( pats) => pats. len ( ) ,
1081
1083
Fields :: Vec ( pats) => pats. len ( ) ,
1082
- Fields :: Filtered ( fields ) => fields . iter ( ) . filter ( |p| p . kept ( ) . is_some ( ) ) . count ( ) ,
1084
+ Fields :: Filtered { len , .. } => * len ,
1083
1085
}
1084
1086
}
1085
1087
@@ -1088,7 +1090,7 @@ impl<'p, 'tcx> Fields<'p, 'tcx> {
1088
1090
let pats: SmallVec < [ _ ; 2 ] > = match self {
1089
1091
Fields :: Slice ( pats) => pats. iter ( ) . cloned ( ) . collect ( ) ,
1090
1092
Fields :: Vec ( pats) => pats. into_iter ( ) . cloned ( ) . collect ( ) ,
1091
- Fields :: Filtered ( fields) => {
1093
+ Fields :: Filtered { fields, .. } => {
1092
1094
// We don't skip any fields here.
1093
1095
fields. into_iter ( ) . map ( |p| p. to_pattern ( ) ) . collect ( )
1094
1096
}
@@ -1122,7 +1124,7 @@ impl<'p, 'tcx> Fields<'p, 'tcx> {
1122
1124
pats[ i] = pat
1123
1125
}
1124
1126
}
1125
- Fields :: Filtered ( fields) => {
1127
+ Fields :: Filtered { fields, .. } => {
1126
1128
for ( i, pat) in new_pats {
1127
1129
if let FilteredField :: Kept ( p) = & mut fields[ i] {
1128
1130
* p = pat
@@ -1144,7 +1146,7 @@ impl<'p, 'tcx> Fields<'p, 'tcx> {
1144
1146
let pats: & [ _ ] = cx. pattern_arena . alloc_from_iter ( pats) ;
1145
1147
1146
1148
match self {
1147
- Fields :: Filtered ( fields) => {
1149
+ Fields :: Filtered { fields, len } => {
1148
1150
let mut pats = pats. iter ( ) ;
1149
1151
let mut fields = fields. clone ( ) ;
1150
1152
for f in & mut fields {
@@ -1153,7 +1155,7 @@ impl<'p, 'tcx> Fields<'p, 'tcx> {
1153
1155
* p = pats. next ( ) . unwrap ( ) ;
1154
1156
}
1155
1157
}
1156
- Fields :: Filtered ( fields)
1158
+ Fields :: Filtered { fields, len : * len }
1157
1159
}
1158
1160
_ => Fields :: Slice ( pats) ,
1159
1161
}
@@ -1166,7 +1168,7 @@ impl<'p, 'tcx> Fields<'p, 'tcx> {
1166
1168
pats. extend_from_slice ( stack) ;
1167
1169
pats
1168
1170
}
1169
- Fields :: Filtered ( fields) => {
1171
+ Fields :: Filtered { fields, .. } => {
1170
1172
// We skip hidden fields here
1171
1173
fields. into_iter ( ) . filter_map ( |p| p. kept ( ) ) . chain ( stack. iter ( ) . copied ( ) ) . collect ( )
1172
1174
}
0 commit comments