@@ -16,6 +16,7 @@ use rustc::mir::*;
16
16
use rustc:: util:: nodemap:: FxHashMap ;
17
17
use rustc_data_structures:: bit_set:: BitSet ;
18
18
use std:: fmt;
19
+ use std:: iter;
19
20
use syntax_pos:: Span ;
20
21
21
22
pub struct ElaborateDrops ;
@@ -468,14 +469,22 @@ impl<'b, 'tcx> ElaborateDropsCtxt<'b, 'tcx> {
468
469
let terminator = data. terminator ( ) ;
469
470
assert ! ( !data. is_cleanup, "DropAndReplace in unwind path not supported" ) ;
470
471
472
+ let storage_live = match location {
473
+ Place :: Base ( PlaceBase :: Local ( local) ) => Some ( Statement {
474
+ kind : StatementKind :: StorageLive ( * local) ,
475
+ source_info : terminator. source_info
476
+ } ) ,
477
+ _ => None ,
478
+ } ;
471
479
let assign = Statement {
472
480
kind : StatementKind :: Assign ( location. clone ( ) , box Rvalue :: Use ( value. clone ( ) ) ) ,
473
481
source_info : terminator. source_info
474
482
} ;
483
+ let statements = storage_live. into_iter ( ) . chain ( iter:: once ( assign) ) . collect :: < Vec < _ > > ( ) ;
475
484
476
485
let unwind = unwind. unwrap_or_else ( || self . patch . resume_block ( ) ) ;
477
486
let unwind = self . patch . new_block ( BasicBlockData {
478
- statements : vec ! [ assign . clone( ) ] ,
487
+ statements : statements . clone ( ) ,
479
488
terminator : Some ( Terminator {
480
489
kind : TerminatorKind :: Goto { target : unwind } ,
481
490
..* terminator
@@ -484,7 +493,7 @@ impl<'b, 'tcx> ElaborateDropsCtxt<'b, 'tcx> {
484
493
} ) ;
485
494
486
495
let target = self . patch . new_block ( BasicBlockData {
487
- statements : vec ! [ assign ] ,
496
+ statements,
488
497
terminator : Some ( Terminator {
489
498
kind : TerminatorKind :: Goto { target } ,
490
499
..* terminator
0 commit comments