add a scope for if let guard temporaries and bindings

This ensures `if let` guard temporaries and bindings are dropped before
the match arm's pattern's bindings.
This commit is contained in:
dianne
2025-07-03 06:10:37 -07:00
parent 4ec688110f
commit b2241c78c8
8 changed files with 83 additions and 62 deletions

View File

@@ -198,6 +198,11 @@ fn resolve_arm<'tcx>(visitor: &mut ScopeResolutionVisitor<'tcx>, arm: &'tcx hir:
visitor.cx.var_parent = visitor.cx.parent;
resolve_pat(visitor, arm.pat);
// We introduce a new scope to contain bindings and temporaries from `if let` guards, to
// ensure they're dropped before the arm's pattern's bindings. This extends to the end of
// the arm body and is the scope of its locals as well.
visitor.enter_scope(Scope { local_id: arm.hir_id.local_id, data: ScopeData::MatchGuard });
visitor.cx.var_parent = visitor.cx.parent;
if let Some(guard) = arm.guard {
resolve_cond(visitor, guard);
}