@@ -443,14 +443,15 @@ fn compute_layout<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
443443fn insert_switch < ' a , ' tcx > ( tcx : TyCtxt < ' a , ' tcx , ' tcx > ,
444444 mir : & mut Mir < ' tcx > ,
445445 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) ;
448449
449450 let switch = TerminatorKind :: SwitchInt {
450451 discr : Operand :: Consume ( transform. make_field ( transform. state_field , tcx. types . u32 ) ) ,
451452 switch_ty : tcx. types . u32 ,
452453 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 ( ) ,
454455 } ;
455456
456457 let source_info = source_info ( mir) ;
@@ -542,7 +543,7 @@ fn create_generator_drop_shim<'a, 'tcx>(
542543 // The returned state (1) and the poisoned state (2) falls through to
543544 // the default case which is just to return
544545
545- insert_switch ( tcx, & mut mir, cases, & transform) ;
546+ insert_switch ( tcx, & mut mir, cases, & transform, TerminatorKind :: Return ) ;
546547
547548 for block in mir. basic_blocks_mut ( ) {
548549 let kind = & mut block. terminator_mut ( ) . kind ;
@@ -588,18 +589,18 @@ fn create_generator_drop_shim<'a, 'tcx>(
588589 mir
589590}
590591
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 ( ) ) ;
593594 let source_info = source_info ( mir) ;
594595 mir. basic_blocks_mut ( ) . push ( BasicBlockData {
595596 statements : Vec :: new ( ) ,
596597 terminator : Some ( Terminator {
597598 source_info,
598- kind : TerminatorKind :: Return ,
599+ kind,
599600 } ) ,
600601 is_cleanup : false ,
601602 } ) ;
602- return_block
603+ term_block
603604}
604605
605606fn insert_panic_block < ' a , ' tcx > ( tcx : TyCtxt < ' a , ' tcx , ' tcx > ,
@@ -659,7 +660,7 @@ fn create_generator_resume_function<'a, 'tcx>(
659660 // Panic when resumed on the poisoned (2) state
660661 cases. insert ( 2 , ( 2 , insert_panic_block ( tcx, mir, AssertMessage :: GeneratorResumedAfterPanic ) ) ) ;
661662
662- insert_switch ( tcx, mir, cases, & transform) ;
663+ insert_switch ( tcx, mir, cases, & transform, TerminatorKind :: Unreachable ) ;
663664
664665 make_generator_state_argument_indirect ( tcx, def_id, mir) ;
665666
@@ -680,7 +681,7 @@ fn source_info<'a, 'tcx>(mir: &Mir<'tcx>) -> SourceInfo {
680681}
681682
682683fn 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 ) ;
684685
685686 // Create a block to destroy an unresumed generators. This can only destroy upvars.
686687 let drop_clean = BasicBlock :: new ( mir. basic_blocks ( ) . len ( ) ) ;
0 commit comments