@@ -25,12 +25,18 @@ use tracing::debug;
25
25
struct Context {
26
26
/// The scope that contains any new variables declared, plus its depth in
27
27
/// the scope tree.
28
- var_parent : Option < ( Scope , ScopeDepth ) > ,
28
+ var_parent : Option < Scope > ,
29
29
30
30
/// Region parent of expressions, etc., plus its depth in the scope tree.
31
31
parent : Option < ( Scope , ScopeDepth ) > ,
32
32
}
33
33
34
+ impl Context {
35
+ fn set_var_parent ( & mut self ) {
36
+ self . var_parent = self . parent . map ( |( p, _) | p) ;
37
+ }
38
+ }
39
+
34
40
struct ScopeResolutionVisitor < ' tcx > {
35
41
tcx : TyCtxt < ' tcx > ,
36
42
@@ -78,7 +84,7 @@ fn record_var_lifetime(visitor: &mut ScopeResolutionVisitor<'_>, var_id: hir::It
78
84
//
79
85
// extern fn isalnum(c: c_int) -> c_int
80
86
}
81
- Some ( ( parent_scope, _ ) ) => visitor. scope_tree . record_var_scope ( var_id, parent_scope) ,
87
+ Some ( parent_scope) => visitor. scope_tree . record_var_scope ( var_id, parent_scope) ,
82
88
}
83
89
}
84
90
@@ -113,7 +119,7 @@ fn resolve_block<'tcx>(visitor: &mut ScopeResolutionVisitor<'tcx>, blk: &'tcx hi
113
119
// itself has returned.
114
120
115
121
visitor. enter_node_scope_with_dtor ( blk. hir_id . local_id ) ;
116
- visitor. cx . var_parent = visitor . cx . parent ;
122
+ visitor. cx . set_var_parent ( ) ;
117
123
118
124
{
119
125
// This block should be kept approximately in sync with
@@ -132,7 +138,7 @@ fn resolve_block<'tcx>(visitor: &mut ScopeResolutionVisitor<'tcx>, blk: &'tcx hi
132
138
local_id : blk. hir_id . local_id ,
133
139
data : ScopeData :: Remainder ( FirstStatementIndex :: new ( i) ) ,
134
140
} ) ;
135
- visitor. cx . var_parent = visitor . cx . parent ;
141
+ visitor. cx . set_var_parent ( ) ;
136
142
visitor. visit_stmt ( statement) ;
137
143
// We need to back out temporarily to the last enclosing scope
138
144
// for the `else` block, so that even the temporaries receiving
@@ -157,7 +163,7 @@ fn resolve_block<'tcx>(visitor: &mut ScopeResolutionVisitor<'tcx>, blk: &'tcx hi
157
163
local_id : blk. hir_id . local_id ,
158
164
data : ScopeData :: Remainder ( FirstStatementIndex :: new ( i) ) ,
159
165
} ) ;
160
- visitor. cx . var_parent = visitor . cx . parent ;
166
+ visitor. cx . set_var_parent ( ) ;
161
167
visitor. visit_stmt ( statement)
162
168
}
163
169
hir:: StmtKind :: Item ( ..) => {
@@ -207,7 +213,7 @@ fn resolve_arm<'tcx>(visitor: &mut ScopeResolutionVisitor<'tcx>, arm: &'tcx hir:
207
213
visitor. terminating_scopes . insert ( arm. hir_id . local_id ) ;
208
214
209
215
visitor. enter_node_scope_with_dtor ( arm. hir_id . local_id ) ;
210
- visitor. cx . var_parent = visitor . cx . parent ;
216
+ visitor. cx . set_var_parent ( ) ;
211
217
212
218
if let Some ( expr) = arm. guard
213
219
&& !has_let_expr ( expr)
@@ -484,7 +490,7 @@ fn resolve_expr<'tcx>(visitor: &mut ScopeResolutionVisitor<'tcx>, expr: &'tcx hi
484
490
ScopeData :: IfThen
485
491
} ;
486
492
visitor. enter_scope ( Scope { local_id : then. hir_id . local_id , data } ) ;
487
- visitor. cx . var_parent = visitor . cx . parent ;
493
+ visitor. cx . set_var_parent ( ) ;
488
494
visitor. visit_expr ( cond) ;
489
495
visitor. visit_expr ( then) ;
490
496
visitor. cx = expr_cx;
@@ -499,7 +505,7 @@ fn resolve_expr<'tcx>(visitor: &mut ScopeResolutionVisitor<'tcx>, expr: &'tcx hi
499
505
ScopeData :: IfThen
500
506
} ;
501
507
visitor. enter_scope ( Scope { local_id : then. hir_id . local_id , data } ) ;
502
- visitor. cx . var_parent = visitor . cx . parent ;
508
+ visitor. cx . set_var_parent ( ) ;
503
509
visitor. visit_expr ( cond) ;
504
510
visitor. visit_expr ( then) ;
505
511
visitor. cx = expr_cx;
@@ -558,7 +564,7 @@ fn resolve_local<'tcx>(
558
564
) {
559
565
debug ! ( "resolve_local(pat={:?}, init={:?})" , pat, init) ;
560
566
561
- let blk_scope = visitor. cx . var_parent . map ( | ( p , _ ) | p ) ;
567
+ let blk_scope = visitor. cx . var_parent ;
562
568
563
569
// As an exception to the normal rules governing temporary
564
570
// lifetimes, initializers in a let have a temporary lifetime
@@ -849,7 +855,7 @@ impl<'tcx> Visitor<'tcx> for ScopeResolutionVisitor<'tcx> {
849
855
self . enter_body ( body. value . hir_id , |this| {
850
856
if this. tcx . hir_body_owner_kind ( owner_id) . is_fn_or_closure ( ) {
851
857
// The arguments and `self` are parented to the fn.
852
- this. cx . var_parent = this . cx . parent ;
858
+ this. cx . set_var_parent ( ) ;
853
859
for param in body. params {
854
860
this. visit_pat ( param. pat ) ;
855
861
}
0 commit comments