@@ -448,47 +448,51 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
448
448
let arm_scope = ( arm. scope , arm_source_info) ;
449
449
let match_scope = self . local_scope ( ) ;
450
450
self . in_scope ( arm_scope, arm. lint_level , |this| {
451
- let old_dedup_scope =
452
- mem:: replace ( & mut this. fixed_temps_scope , Some ( arm. scope ) ) ;
453
-
454
- // `try_to_place` may fail if it is unable to resolve the given
455
- // `PlaceBuilder` inside a closure. In this case, we don't want to include
456
- // a scrutinee place. `scrutinee_place_builder` will fail to be resolved
457
- // if the only match arm is a wildcard (`_`).
458
- // Example:
459
- // ```
460
- // let foo = (0, 1);
461
- // let c = || {
462
- // match foo { _ => () };
463
- // };
464
- // ```
465
- let scrutinee_place = scrutinee_place_builder. try_to_place ( this) ;
466
- let opt_scrutinee_place =
467
- scrutinee_place. as_ref ( ) . map ( |place| ( Some ( place) , scrutinee_span) ) ;
468
- let scope = this. declare_bindings (
469
- None ,
470
- arm. span ,
471
- & arm. pattern ,
472
- arm. guard ,
473
- opt_scrutinee_place,
474
- ) ;
451
+ let guard_scope =
452
+ region:: Scope { data : region:: ScopeData :: IfThenRescope , ..arm. scope } ;
453
+ this. in_scope ( ( guard_scope, arm_source_info) , LintLevel :: Inherited , |this| {
454
+ let old_dedup_scope =
455
+ mem:: replace ( & mut this. fixed_temps_scope , Some ( guard_scope) ) ;
456
+
457
+ // `try_to_place` may fail if it is unable to resolve the given
458
+ // `PlaceBuilder` inside a closure. In this case, we don't want to include
459
+ // a scrutinee place. `scrutinee_place_builder` will fail to be resolved
460
+ // if the only match arm is a wildcard (`_`).
461
+ // Example:
462
+ // ```
463
+ // let foo = (0, 1);
464
+ // let c = || {
465
+ // match foo { _ => () };
466
+ // };
467
+ // ```
468
+ let scrutinee_place = scrutinee_place_builder. try_to_place ( this) ;
469
+ let opt_scrutinee_place =
470
+ scrutinee_place. as_ref ( ) . map ( |place| ( Some ( place) , scrutinee_span) ) ;
471
+ let scope = this. declare_bindings (
472
+ None ,
473
+ arm. span ,
474
+ & arm. pattern ,
475
+ arm. guard ,
476
+ opt_scrutinee_place,
477
+ ) ;
475
478
476
- let arm_block = this. bind_pattern (
477
- outer_source_info,
478
- branch,
479
- & built_match_tree. fake_borrow_temps ,
480
- scrutinee_span,
481
- Some ( ( arm, match_scope) ) ,
482
- EmitStorageLive :: Yes ,
483
- ) ;
479
+ let arm_block = this. bind_pattern (
480
+ outer_source_info,
481
+ branch,
482
+ & built_match_tree. fake_borrow_temps ,
483
+ scrutinee_span,
484
+ Some ( ( arm, match_scope) ) ,
485
+ EmitStorageLive :: Yes ,
486
+ ) ;
484
487
485
- this. fixed_temps_scope = old_dedup_scope;
488
+ this. fixed_temps_scope = old_dedup_scope;
486
489
487
- if let Some ( source_scope) = scope {
488
- this. source_scope = source_scope;
489
- }
490
+ if let Some ( source_scope) = scope {
491
+ this. source_scope = source_scope;
492
+ }
490
493
491
- this. expr_into_dest ( destination, arm_block, arm. body )
494
+ this. expr_into_dest ( destination, arm_block, arm. body )
495
+ } )
492
496
} )
493
497
. into_block ( )
494
498
} )
@@ -569,7 +573,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
569
573
// be bound for each candidate.
570
574
for sub_branch in branch. sub_branches {
571
575
if let Some ( arm) = arm {
572
- self . clear_top_scope ( arm. scope ) ;
576
+ self . clear_match_arm_scope ( arm. scope ) ;
573
577
}
574
578
let binding_end = self . bind_and_guard_matched_candidate (
575
579
sub_branch,
0 commit comments