@@ -443,14 +443,15 @@ fn compute_layout<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
443
443
fn insert_switch < ' a , ' tcx > ( tcx : TyCtxt < ' a , ' tcx , ' tcx > ,
444
444
mir : & mut Mir < ' tcx > ,
445
445
cases : Vec < ( u32 , BasicBlock ) > ,
446
- transform : & TransformVisitor < ' a , ' tcx > ) {
447
- let return_block = insert_return_block ( mir) ;
446
+ transform : & TransformVisitor < ' a , ' tcx > ,
447
+ default : TerminatorKind < ' tcx > ) {
448
+ let default_block = insert_term_block ( mir, default) ;
448
449
449
450
let switch = TerminatorKind :: SwitchInt {
450
451
discr : Operand :: Consume ( transform. make_field ( transform. state_field , tcx. types . u32 ) ) ,
451
452
switch_ty : tcx. types . u32 ,
452
453
values : Cow :: from ( cases. iter ( ) . map ( |& ( i, _) | ConstInt :: U32 ( i) ) . collect :: < Vec < _ > > ( ) ) ,
453
- targets : cases. iter ( ) . map ( |& ( _, d) | d) . chain ( once ( return_block ) ) . collect ( ) ,
454
+ targets : cases. iter ( ) . map ( |& ( _, d) | d) . chain ( once ( default_block ) ) . collect ( ) ,
454
455
} ;
455
456
456
457
let source_info = source_info ( mir) ;
@@ -542,7 +543,7 @@ fn create_generator_drop_shim<'a, 'tcx>(
542
543
// The returned state (1) and the poisoned state (2) falls through to
543
544
// the default case which is just to return
544
545
545
- insert_switch ( tcx, & mut mir, cases, & transform) ;
546
+ insert_switch ( tcx, & mut mir, cases, & transform, TerminatorKind :: Return ) ;
546
547
547
548
for block in mir. basic_blocks_mut ( ) {
548
549
let kind = & mut block. terminator_mut ( ) . kind ;
@@ -588,18 +589,18 @@ fn create_generator_drop_shim<'a, 'tcx>(
588
589
mir
589
590
}
590
591
591
- fn insert_return_block < ' tcx > ( mir : & mut Mir < ' tcx > ) -> BasicBlock {
592
- let return_block = BasicBlock :: new ( mir. basic_blocks ( ) . len ( ) ) ;
592
+ fn insert_term_block < ' tcx > ( mir : & mut Mir < ' tcx > , kind : TerminatorKind < ' tcx > ) -> BasicBlock {
593
+ let term_block = BasicBlock :: new ( mir. basic_blocks ( ) . len ( ) ) ;
593
594
let source_info = source_info ( mir) ;
594
595
mir. basic_blocks_mut ( ) . push ( BasicBlockData {
595
596
statements : Vec :: new ( ) ,
596
597
terminator : Some ( Terminator {
597
598
source_info,
598
- kind : TerminatorKind :: Return ,
599
+ kind,
599
600
} ) ,
600
601
is_cleanup : false ,
601
602
} ) ;
602
- return_block
603
+ term_block
603
604
}
604
605
605
606
fn insert_panic_block < ' a , ' tcx > ( tcx : TyCtxt < ' a , ' tcx , ' tcx > ,
@@ -659,7 +660,7 @@ fn create_generator_resume_function<'a, 'tcx>(
659
660
// Panic when resumed on the poisoned (2) state
660
661
cases. insert ( 2 , ( 2 , insert_panic_block ( tcx, mir, AssertMessage :: GeneratorResumedAfterPanic ) ) ) ;
661
662
662
- insert_switch ( tcx, mir, cases, & transform) ;
663
+ insert_switch ( tcx, mir, cases, & transform, TerminatorKind :: Unreachable ) ;
663
664
664
665
make_generator_state_argument_indirect ( tcx, def_id, mir) ;
665
666
@@ -680,7 +681,7 @@ fn source_info<'a, 'tcx>(mir: &Mir<'tcx>) -> SourceInfo {
680
681
}
681
682
682
683
fn insert_clean_drop < ' a , ' tcx > ( mir : & mut Mir < ' tcx > ) -> BasicBlock {
683
- let return_block = insert_return_block ( mir) ;
684
+ let return_block = insert_term_block ( mir, TerminatorKind :: Return ) ;
684
685
685
686
// Create a block to destroy an unresumed generators. This can only destroy upvars.
686
687
let drop_clean = BasicBlock :: new ( mir. basic_blocks ( ) . len ( ) ) ;
0 commit comments