@@ -732,7 +732,14 @@ impl<'ra: 'ast, 'ast, 'tcx> Visitor<'ast> for LateResolutionVisitor<'_, 'ast, 'r
732732 fn visit_pat ( & mut self , p : & ' ast Pat ) {
733733 let prev = self . diag_metadata . current_pat ;
734734 self . diag_metadata . current_pat = Some ( p) ;
735- visit:: walk_pat ( self , p) ;
735+
736+ match p. kind {
737+ // We visit only the subpattern, allowing the condition to be resolved later in `resolve_pat`.
738+ PatKind :: Guard ( ref subpat, _) => self . visit_pat ( subpat) ,
739+ // Otherwise, we just walk the pattern.
740+ _ => visit:: walk_pat ( self , p) ,
741+ }
742+
736743 self . diag_metadata . current_pat = prev;
737744 }
738745 fn visit_local ( & mut self , local : & ' ast Local ) {
@@ -3706,7 +3713,7 @@ impl<'a, 'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {
37063713 /// See the implementation and `fresh_binding` for more details.
37073714 fn resolve_pattern_inner (
37083715 & mut self ,
3709- pat : & Pat ,
3716+ pat : & ' ast Pat ,
37103717 pat_src : PatternSource ,
37113718 bindings : & mut SmallVec < [ ( PatBoundCtx , FxHashSet < Ident > ) ; 1 ] > ,
37123719 ) {
@@ -3766,6 +3773,15 @@ impl<'a, 'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {
37663773 // Prevent visiting `ps` as we've already done so above.
37673774 return false ;
37683775 }
3776+ PatKind :: Guard ( ref subpat, ref cond) => {
3777+ self . with_rib ( ValueNS , RibKind :: Normal , |this| {
3778+ this. resolve_pattern_inner ( subpat, pat_src, bindings) ;
3779+ this. resolve_expr ( cond, None ) ;
3780+ } ) ;
3781+
3782+ // Prevent visiting `pat` as we've already done so above.
3783+ return false ;
3784+ }
37693785 _ => { }
37703786 }
37713787 true
0 commit comments