@@ -2282,49 +2282,55 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
22822282 initializer_span : Span ,
22832283 else_block : & Block ,
22842284 visibility_scope : Option < SourceScope > ,
2285+ remainder_scope : region:: Scope ,
22852286 remainder_span : Span ,
22862287 pattern : & Pat < ' tcx > ,
22872288 ) -> BlockAnd < ( ) > {
2288- let scrutinee = unpack ! ( block = self . lower_scrutinee( block, init, initializer_span) ) ;
2289- let pat = Pat { ty : init. ty , span : else_block. span , kind : Box :: new ( PatKind :: Wild ) } ;
2290- let mut wildcard = Candidate :: new ( scrutinee. clone ( ) , & pat, false ) ;
2291- self . declare_bindings (
2292- visibility_scope,
2293- remainder_span,
2294- pattern,
2295- ArmHasGuard ( false ) ,
2296- Some ( ( None , initializer_span) ) ,
2297- ) ;
2298- let mut candidate = Candidate :: new ( scrutinee. clone ( ) , pattern, false ) ;
2299- let fake_borrow_temps = self . lower_match_tree (
2300- block,
2301- initializer_span,
2302- pattern. span ,
2303- false ,
2304- & mut [ & mut candidate, & mut wildcard] ,
2305- ) ;
2306- // This block is for the matching case
2307- let matching = self . bind_pattern (
2308- self . source_info ( pattern. span ) ,
2309- candidate,
2310- None ,
2311- & fake_borrow_temps,
2312- initializer_span,
2313- None ,
2314- None ,
2315- None ,
2316- ) ;
2317- // This block is for the failure case
2318- let failure = self . bind_pattern (
2319- self . source_info ( else_block. span ) ,
2320- wildcard,
2321- None ,
2322- & fake_borrow_temps,
2323- initializer_span,
2324- None ,
2325- None ,
2326- None ,
2327- ) ;
2289+ let ( matching, failure) = self . in_if_then_scope ( remainder_scope, |this| {
2290+ let scrutinee = unpack ! ( block = this. lower_scrutinee( block, init, initializer_span) ) ;
2291+ let pat = Pat { ty : init. ty , span : else_block. span , kind : Box :: new ( PatKind :: Wild ) } ;
2292+ let mut wildcard = Candidate :: new ( scrutinee. clone ( ) , & pat, false ) ;
2293+ this. declare_bindings (
2294+ visibility_scope,
2295+ remainder_span,
2296+ pattern,
2297+ ArmHasGuard ( false ) ,
2298+ Some ( ( None , initializer_span) ) ,
2299+ ) ;
2300+ let mut candidate = Candidate :: new ( scrutinee. clone ( ) , pattern, false ) ;
2301+ let fake_borrow_temps = this. lower_match_tree (
2302+ block,
2303+ initializer_span,
2304+ pattern. span ,
2305+ false ,
2306+ & mut [ & mut candidate, & mut wildcard] ,
2307+ ) ;
2308+ // This block is for the matching case
2309+ let matching = this. bind_pattern (
2310+ this. source_info ( pattern. span ) ,
2311+ candidate,
2312+ None ,
2313+ & fake_borrow_temps,
2314+ initializer_span,
2315+ None ,
2316+ None ,
2317+ None ,
2318+ ) ;
2319+ // This block is for the failure case
2320+ let failure = this. bind_pattern (
2321+ this. source_info ( else_block. span ) ,
2322+ wildcard,
2323+ None ,
2324+ & fake_borrow_temps,
2325+ initializer_span,
2326+ None ,
2327+ None ,
2328+ None ,
2329+ ) ;
2330+ this. break_for_else ( failure, remainder_scope, this. source_info ( initializer_span) ) ;
2331+ matching. unit ( )
2332+ } ) ;
2333+
23282334 // This place is not really used because this destination place
23292335 // should never be used to take values at the end of the failure
23302336 // block.
0 commit comments