Skip to content

Commit 0bdaef5

Browse files
committed
only introduce a guard scope for arms with guards
1 parent b2241c7 commit 0bdaef5

File tree

5 files changed

+39
-23
lines changed

5 files changed

+39
-23
lines changed

compiler/rustc_hir_analysis/src/check/region.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -198,12 +198,12 @@ fn resolve_arm<'tcx>(visitor: &mut ScopeResolutionVisitor<'tcx>, arm: &'tcx hir:
198198
visitor.cx.var_parent = visitor.cx.parent;
199199

200200
resolve_pat(visitor, arm.pat);
201-
// We introduce a new scope to contain bindings and temporaries from `if let` guards, to
202-
// ensure they're dropped before the arm's pattern's bindings. This extends to the end of
203-
// the arm body and is the scope of its locals as well.
204-
visitor.enter_scope(Scope { local_id: arm.hir_id.local_id, data: ScopeData::MatchGuard });
205-
visitor.cx.var_parent = visitor.cx.parent;
206201
if let Some(guard) = arm.guard {
202+
// We introduce a new scope to contain bindings and temporaries from `if let` guards, to
203+
// ensure they're dropped before the arm's pattern's bindings. This extends to the end of
204+
// the arm body and is the scope of its locals as well.
205+
visitor.enter_scope(Scope { local_id: arm.hir_id.local_id, data: ScopeData::MatchGuard });
206+
visitor.cx.var_parent = visitor.cx.parent;
207207
resolve_cond(visitor, guard);
208208
}
209209
resolve_expr(visitor, arm.body, false);

compiler/rustc_mir_build/src/builder/matches/mod.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -434,12 +434,14 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
434434
let arm_source_info = self.source_info(arm.span);
435435
let arm_scope = (arm.scope, arm_source_info);
436436
let match_scope = self.local_scope();
437+
let guard_scope = arm
438+
.guard
439+
.map(|_| region::Scope { data: region::ScopeData::MatchGuard, ..arm.scope });
437440
self.in_scope(arm_scope, arm.lint_level, |this| {
438-
let guard_scope =
439-
region::Scope { data: region::ScopeData::MatchGuard, ..arm.scope };
440-
this.in_scope((guard_scope, arm_source_info), LintLevel::Inherited, |this| {
441+
this.opt_in_scope(guard_scope.map(|scope| (scope, arm_source_info)), |this| {
442+
// `if let` guard temps needing deduplicating will be in the guard scope.
441443
let old_dedup_scope =
442-
mem::replace(&mut this.fixed_temps_scope, Some(guard_scope));
444+
mem::replace(&mut this.fixed_temps_scope, guard_scope);
443445

444446
// `try_to_place` may fail if it is unable to resolve the given
445447
// `PlaceBuilder` inside a closure. In this case, we don't want to include

compiler/rustc_mir_build/src/builder/scope.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -697,6 +697,20 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
697697
block.and(rv)
698698
}
699699

700+
/// Convenience wrapper that executes `f` either within the current scope or a new scope.
701+
/// Used for pattern matching, which introduces an additional scope for patterns with guards.
702+
pub(crate) fn opt_in_scope<R>(
703+
&mut self,
704+
opt_region_scope: Option<(region::Scope, SourceInfo)>,
705+
f: impl FnOnce(&mut Builder<'a, 'tcx>) -> BlockAnd<R>,
706+
) -> BlockAnd<R> {
707+
if let Some(region_scope) = opt_region_scope {
708+
self.in_scope(region_scope, LintLevel::Inherited, f)
709+
} else {
710+
f(self)
711+
}
712+
}
713+
700714
/// Push a scope onto the stack. You can then build code in this
701715
/// scope and call `pop_scope` afterwards. Note that these two
702716
/// calls must be paired; using `in_scope` as a convenience

tests/ui/thir-print/thir-tree-loop-match.stdout

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ body:
129129
body:
130130
Expr {
131131
ty: bool
132-
temp_lifetime: TempLifetime { temp_lifetime: Some(MatchGuard(16)), backwards_incompatible: None }
132+
temp_lifetime: TempLifetime { temp_lifetime: Some(Node(16)), backwards_incompatible: None }
133133
span: $DIR/thir-tree-loop-match.rs:12:25: 15:18 (#0)
134134
kind:
135135
Scope {
@@ -138,14 +138,14 @@ body:
138138
value:
139139
Expr {
140140
ty: bool
141-
temp_lifetime: TempLifetime { temp_lifetime: Some(MatchGuard(16)), backwards_incompatible: None }
141+
temp_lifetime: TempLifetime { temp_lifetime: Some(Node(16)), backwards_incompatible: None }
142142
span: $DIR/thir-tree-loop-match.rs:12:25: 15:18 (#0)
143143
kind:
144144
NeverToAny {
145145
source:
146146
Expr {
147147
ty: !
148-
temp_lifetime: TempLifetime { temp_lifetime: Some(MatchGuard(16)), backwards_incompatible: None }
148+
temp_lifetime: TempLifetime { temp_lifetime: Some(Node(16)), backwards_incompatible: None }
149149
span: $DIR/thir-tree-loop-match.rs:12:25: 15:18 (#0)
150150
kind:
151151
Block {
@@ -227,7 +227,7 @@ body:
227227
body:
228228
Expr {
229229
ty: bool
230-
temp_lifetime: TempLifetime { temp_lifetime: Some(MatchGuard(24)), backwards_incompatible: None }
230+
temp_lifetime: TempLifetime { temp_lifetime: Some(Node(24)), backwards_incompatible: None }
231231
span: $DIR/thir-tree-loop-match.rs:16:26: 16:38 (#0)
232232
kind:
233233
Scope {
@@ -236,21 +236,21 @@ body:
236236
value:
237237
Expr {
238238
ty: bool
239-
temp_lifetime: TempLifetime { temp_lifetime: Some(MatchGuard(24)), backwards_incompatible: None }
239+
temp_lifetime: TempLifetime { temp_lifetime: Some(Node(24)), backwards_incompatible: None }
240240
span: $DIR/thir-tree-loop-match.rs:16:26: 16:38 (#0)
241241
kind:
242242
NeverToAny {
243243
source:
244244
Expr {
245245
ty: !
246-
temp_lifetime: TempLifetime { temp_lifetime: Some(MatchGuard(24)), backwards_incompatible: None }
246+
temp_lifetime: TempLifetime { temp_lifetime: Some(Node(24)), backwards_incompatible: None }
247247
span: $DIR/thir-tree-loop-match.rs:16:26: 16:38 (#0)
248248
kind:
249249
Return {
250250
value:
251251
Expr {
252252
ty: bool
253-
temp_lifetime: TempLifetime { temp_lifetime: Some(MatchGuard(24)), backwards_incompatible: None }
253+
temp_lifetime: TempLifetime { temp_lifetime: Some(Node(24)), backwards_incompatible: None }
254254
span: $DIR/thir-tree-loop-match.rs:16:33: 16:38 (#0)
255255
kind:
256256
Scope {
@@ -259,7 +259,7 @@ body:
259259
value:
260260
Expr {
261261
ty: bool
262-
temp_lifetime: TempLifetime { temp_lifetime: Some(MatchGuard(24)), backwards_incompatible: None }
262+
temp_lifetime: TempLifetime { temp_lifetime: Some(Node(24)), backwards_incompatible: None }
263263
span: $DIR/thir-tree-loop-match.rs:16:33: 16:38 (#0)
264264
kind:
265265
VarRef {

tests/ui/thir-print/thir-tree-match.stdout

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ body:
123123
body:
124124
Expr {
125125
ty: bool
126-
temp_lifetime: TempLifetime { temp_lifetime: Some(MatchGuard(14)), backwards_incompatible: None }
126+
temp_lifetime: TempLifetime { temp_lifetime: Some(Node(14)), backwards_incompatible: None }
127127
span: $DIR/thir-tree-match.rs:17:36: 17:40 (#0)
128128
kind:
129129
Scope {
@@ -132,7 +132,7 @@ body:
132132
value:
133133
Expr {
134134
ty: bool
135-
temp_lifetime: TempLifetime { temp_lifetime: Some(MatchGuard(14)), backwards_incompatible: None }
135+
temp_lifetime: TempLifetime { temp_lifetime: Some(Node(14)), backwards_incompatible: None }
136136
span: $DIR/thir-tree-match.rs:17:36: 17:40 (#0)
137137
kind:
138138
Literal( lit: Spanned { node: Bool(true), span: $DIR/thir-tree-match.rs:17:36: 17:40 (#0) }, neg: false)
@@ -175,7 +175,7 @@ body:
175175
body:
176176
Expr {
177177
ty: bool
178-
temp_lifetime: TempLifetime { temp_lifetime: Some(MatchGuard(20)), backwards_incompatible: None }
178+
temp_lifetime: TempLifetime { temp_lifetime: Some(Node(20)), backwards_incompatible: None }
179179
span: $DIR/thir-tree-match.rs:18:27: 18:32 (#0)
180180
kind:
181181
Scope {
@@ -184,7 +184,7 @@ body:
184184
value:
185185
Expr {
186186
ty: bool
187-
temp_lifetime: TempLifetime { temp_lifetime: Some(MatchGuard(20)), backwards_incompatible: None }
187+
temp_lifetime: TempLifetime { temp_lifetime: Some(Node(20)), backwards_incompatible: None }
188188
span: $DIR/thir-tree-match.rs:18:27: 18:32 (#0)
189189
kind:
190190
Literal( lit: Spanned { node: Bool(false), span: $DIR/thir-tree-match.rs:18:27: 18:32 (#0) }, neg: false)
@@ -219,7 +219,7 @@ body:
219219
body:
220220
Expr {
221221
ty: bool
222-
temp_lifetime: TempLifetime { temp_lifetime: Some(MatchGuard(26)), backwards_incompatible: None }
222+
temp_lifetime: TempLifetime { temp_lifetime: Some(Node(26)), backwards_incompatible: None }
223223
span: $DIR/thir-tree-match.rs:19:24: 19:28 (#0)
224224
kind:
225225
Scope {
@@ -228,7 +228,7 @@ body:
228228
value:
229229
Expr {
230230
ty: bool
231-
temp_lifetime: TempLifetime { temp_lifetime: Some(MatchGuard(26)), backwards_incompatible: None }
231+
temp_lifetime: TempLifetime { temp_lifetime: Some(Node(26)), backwards_incompatible: None }
232232
span: $DIR/thir-tree-match.rs:19:24: 19:28 (#0)
233233
kind:
234234
Literal( lit: Spanned { node: Bool(true), span: $DIR/thir-tree-match.rs:19:24: 19:28 (#0) }, neg: false)

0 commit comments

Comments
 (0)