@@ -732,7 +732,14 @@ impl<'a: 'ast, 'ast, 'tcx> Visitor<'ast> for LateResolutionVisitor<'a, '_, 'ast,
732
732
fn visit_pat ( & mut self , p : & ' ast Pat ) {
733
733
let prev = self . diag_metadata . current_pat ;
734
734
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
+
736
743
self . diag_metadata . current_pat = prev;
737
744
}
738
745
fn visit_local ( & mut self , local : & ' ast Local ) {
@@ -3645,7 +3652,7 @@ impl<'a: 'ast, 'b, 'ast, 'tcx> LateResolutionVisitor<'a, 'b, 'ast, 'tcx> {
3645
3652
/// See the implementation and `fresh_binding` for more details.
3646
3653
fn resolve_pattern_inner (
3647
3654
& mut self ,
3648
- pat : & Pat ,
3655
+ pat : & ' ast Pat ,
3649
3656
pat_src : PatternSource ,
3650
3657
bindings : & mut SmallVec < [ ( PatBoundCtx , FxHashSet < Ident > ) ; 1 ] > ,
3651
3658
) {
@@ -3705,6 +3712,15 @@ impl<'a: 'ast, 'b, 'ast, 'tcx> LateResolutionVisitor<'a, 'b, 'ast, 'tcx> {
3705
3712
// Prevent visiting `ps` as we've already done so above.
3706
3713
return false ;
3707
3714
}
3715
+ PatKind :: Guard ( ref subpat, ref cond) => {
3716
+ self . with_rib ( ValueNS , RibKind :: Normal , |this| {
3717
+ this. resolve_pattern_inner ( subpat, pat_src, bindings) ;
3718
+ this. resolve_expr ( cond, None ) ;
3719
+ } ) ;
3720
+
3721
+ // Prevent visiting `pat` as we've already done so above.
3722
+ return false ;
3723
+ }
3708
3724
_ => { }
3709
3725
}
3710
3726
true
0 commit comments