Skip to content

Commit e92542a

Browse files
committed
implement resolution of guard condition expressions
1 parent 7ec2078 commit e92542a

File tree

2 files changed

+19
-3
lines changed

2 files changed

+19
-3
lines changed

compiler/rustc_ast/src/ast.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -607,7 +607,7 @@ impl Pat {
607607
/// Walk top-down and call `it` in each place where a pattern occurs
608608
/// starting with the root pattern `walk` is called on. If `it` returns
609609
/// false then we will descend no further but siblings will be processed.
610-
pub fn walk(&self, it: &mut impl FnMut(&Pat) -> bool) {
610+
pub fn walk<'s>(&'s self, it: &mut impl FnMut(&'s Pat) -> bool) {
611611
if !it(self) {
612612
return;
613613
}

compiler/rustc_resolve/src/late.rs

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)