Skip to content

Commit 7f8aef9

Browse files
committed
Auto merge of #44747 - Zoxc:gen-switch-unreachable, r=eddyb
Make the fallback of generator resumption be unreachable instead of using return
2 parents a6a7dac + f5affb5 commit 7f8aef9

File tree

1 file changed

+11
-10
lines changed

1 file changed

+11
-10
lines changed

src/librustc_mir/transform/generator.rs

+11-10
Original file line numberDiff line numberDiff line change
@@ -443,14 +443,15 @@ fn compute_layout<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
443443
fn 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

605606
fn 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

682683
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);
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

Comments
 (0)