diff --git a/compiler/rustc_mir_dataflow/src/impls/mod.rs b/compiler/rustc_mir_dataflow/src/impls/mod.rs index 5dc8a003b4778..d74ecb3eb1aab 100644 --- a/compiler/rustc_mir_dataflow/src/impls/mod.rs +++ b/compiler/rustc_mir_dataflow/src/impls/mod.rs @@ -710,24 +710,27 @@ fn switch_on_enum_discriminant<'mir, 'tcx>( block: &'mir mir::BasicBlockData<'tcx>, switch_on: mir::Place<'tcx>, ) -> Option<(mir::Place<'tcx>, &'tcx ty::AdtDef)> { - match block.statements.last().map(|stmt| &stmt.kind) { - Some(mir::StatementKind::Assign(box (lhs, mir::Rvalue::Discriminant(discriminated)))) - if *lhs == switch_on => - { - match &discriminated.ty(body, tcx).ty.kind() { - ty::Adt(def, _) => Some((*discriminated, def)), - - // `Rvalue::Discriminant` is also used to get the active yield point for a - // generator, but we do not need edge-specific effects in that case. This may - // change in the future. - ty::Generator(..) => None, - - t => bug!("`discriminant` called on unexpected type {:?}", t), + for statement in block.statements.iter().rev() { + match &statement.kind { + mir::StatementKind::Assign(box (lhs, mir::Rvalue::Discriminant(discriminated))) + if *lhs == switch_on => + { + match &discriminated.ty(body, tcx).ty.kind() { + ty::Adt(def, _) => return Some((*discriminated, def)), + + // `Rvalue::Discriminant` is also used to get the active yield point for a + // generator, but we do not need edge-specific effects in that case. This may + // change in the future. + ty::Generator(..) => return None, + + t => bug!("`discriminant` called on unexpected type {:?}", t), + } } + mir::StatementKind::Coverage(_) => continue, + _ => return None, } - - _ => None, } + None } struct OnMutBorrow(F); diff --git a/src/test/ui/consts/precise-drop-with-coverage.rs b/src/test/ui/consts/precise-drop-with-coverage.rs new file mode 100644 index 0000000000000..275cb38693f0e --- /dev/null +++ b/src/test/ui/consts/precise-drop-with-coverage.rs @@ -0,0 +1,16 @@ +// Checks that code coverage doesn't interfere with const_precise_live_drops. +// Regression test for issue #93848. +// +// check-pass +// compile-flags: --crate-type=lib -Cinstrument-coverage -Zno-profiler-runtime + +#![feature(const_precise_live_drops)] + +#[inline] +pub const fn transpose(this: Option>) -> Result, E> { + match this { + Some(Ok(x)) => Ok(Some(x)), + Some(Err(e)) => Err(e), + None => Ok(None), + } +}