@@ -1136,40 +1136,35 @@ impl<'a, 'b> LateResolutionVisitor<'a, '_> {
11361136 // Checks that all of the arms in an or-pattern have exactly the
11371137 // same set of bindings, with the same binding modes for each.
11381138 fn check_consistent_bindings ( & mut self , pats : & [ P < Pat > ] ) {
1139- if pats. len ( ) <= 1 {
1140- return ;
1141- }
1142-
11431139 let mut missing_vars = FxHashMap :: default ( ) ;
11441140 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- }
11511141
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) {
11551150 None => { // missing binding
11561151 let binding_error = missing_vars
1157- . entry ( key_j . name )
1152+ . entry ( key_inner . name )
11581153 . or_insert ( BindingError {
1159- name : key_j . name ,
1154+ name : key_inner . name ,
11601155 origin : BTreeSet :: new ( ) ,
11611156 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)
11641159 } ) ;
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 ) ;
11671162 }
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 {
11701165 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 ) ) ;
11731168 }
11741169 }
11751170 }
@@ -1181,12 +1176,13 @@ impl<'a, 'b> LateResolutionVisitor<'a, '_> {
11811176 missing_vars. sort ( ) ;
11821177 for ( name, mut v) in missing_vars {
11831178 if inconsistent_vars. contains_key ( name) {
1184- v. could_be_variant = false ;
1179+ v. could_be_path = false ;
11851180 }
11861181 self . r . report_error (
11871182 * v. origin . iter ( ) . next ( ) . unwrap ( ) ,
11881183 ResolutionError :: VariableNotBoundInPattern ( v) ) ;
11891184 }
1185+
11901186 let mut inconsistent_vars = inconsistent_vars. iter ( ) . collect :: < Vec < _ > > ( ) ;
11911187 inconsistent_vars. sort ( ) ;
11921188 for ( name, v) in inconsistent_vars {
@@ -1214,7 +1210,9 @@ impl<'a, 'b> LateResolutionVisitor<'a, '_> {
12141210 self . resolve_pattern ( pat, source, & mut bindings_list) ;
12151211 }
12161212 // 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+ }
12181216 }
12191217
12201218 fn resolve_block ( & mut self , block : & Block ) {
0 commit comments