@@ -1136,40 +1136,35 @@ impl<'a, 'b> LateResolutionVisitor<'a, '_> {
1136
1136
// Checks that all of the arms in an or-pattern have exactly the
1137
1137
// same set of bindings, with the same binding modes for each.
1138
1138
fn check_consistent_bindings ( & mut self , pats : & [ P < Pat > ] ) {
1139
- if pats. len ( ) <= 1 {
1140
- return ;
1141
- }
1142
-
1143
1139
let mut missing_vars = FxHashMap :: default ( ) ;
1144
1140
let mut inconsistent_vars = FxHashMap :: default ( ) ;
1145
- for p in pats. iter ( ) {
1146
- let map_i = self . binding_mode_map ( & p) ;
1147
- for q in pats. iter ( ) {
1148
- if p. id == q. id {
1149
- continue ;
1150
- }
1151
1141
1152
- let map_j = self . binding_mode_map ( & q) ;
1153
- for ( & key_j, & binding_j) in map_j. iter ( ) {
1154
- match map_i. get ( & key_j) {
1142
+ for pat_outer in pats. iter ( ) {
1143
+ let map_outer = self . binding_mode_map ( & pat_outer) ;
1144
+
1145
+ for pat_inner in pats. iter ( ) . filter ( |pat| pat. id != pat_outer. id ) {
1146
+ let map_inner = self . binding_mode_map ( & pat_inner) ;
1147
+
1148
+ for ( & key_inner, & binding_inner) in map_inner. iter ( ) {
1149
+ match map_outer. get ( & key_inner) {
1155
1150
None => { // missing binding
1156
1151
let binding_error = missing_vars
1157
- . entry ( key_j . name )
1152
+ . entry ( key_inner . name )
1158
1153
. or_insert ( BindingError {
1159
- name : key_j . name ,
1154
+ name : key_inner . name ,
1160
1155
origin : BTreeSet :: new ( ) ,
1161
1156
target : BTreeSet :: new ( ) ,
1162
- could_be_variant :
1163
- key_j . name . as_str ( ) . starts_with ( char:: is_uppercase)
1157
+ could_be_path :
1158
+ key_inner . name . as_str ( ) . starts_with ( char:: is_uppercase)
1164
1159
} ) ;
1165
- binding_error. origin . insert ( binding_j . span ) ;
1166
- binding_error. target . insert ( p . span ) ;
1160
+ binding_error. origin . insert ( binding_inner . span ) ;
1161
+ binding_error. target . insert ( pat_outer . span ) ;
1167
1162
}
1168
- Some ( binding_i ) => { // check consistent binding
1169
- if binding_i . binding_mode != binding_j . binding_mode {
1163
+ Some ( binding_outer ) => { // check consistent binding
1164
+ if binding_outer . binding_mode != binding_inner . binding_mode {
1170
1165
inconsistent_vars
1171
- . entry ( key_j . name )
1172
- . or_insert ( ( binding_j . span , binding_i . span ) ) ;
1166
+ . entry ( key_inner . name )
1167
+ . or_insert ( ( binding_inner . span , binding_outer . span ) ) ;
1173
1168
}
1174
1169
}
1175
1170
}
@@ -1181,12 +1176,13 @@ impl<'a, 'b> LateResolutionVisitor<'a, '_> {
1181
1176
missing_vars. sort ( ) ;
1182
1177
for ( name, mut v) in missing_vars {
1183
1178
if inconsistent_vars. contains_key ( name) {
1184
- v. could_be_variant = false ;
1179
+ v. could_be_path = false ;
1185
1180
}
1186
1181
self . r . report_error (
1187
1182
* v. origin . iter ( ) . next ( ) . unwrap ( ) ,
1188
1183
ResolutionError :: VariableNotBoundInPattern ( v) ) ;
1189
1184
}
1185
+
1190
1186
let mut inconsistent_vars = inconsistent_vars. iter ( ) . collect :: < Vec < _ > > ( ) ;
1191
1187
inconsistent_vars. sort ( ) ;
1192
1188
for ( name, v) in inconsistent_vars {
@@ -1214,7 +1210,9 @@ impl<'a, 'b> LateResolutionVisitor<'a, '_> {
1214
1210
self . resolve_pattern ( pat, source, & mut bindings_list) ;
1215
1211
}
1216
1212
// This has to happen *after* we determine which pat_idents are variants
1217
- self . check_consistent_bindings ( pats) ;
1213
+ if pats. len ( ) > 1 {
1214
+ self . check_consistent_bindings ( pats) ;
1215
+ }
1218
1216
}
1219
1217
1220
1218
fn resolve_block ( & mut self , block : & Block ) {
0 commit comments