Rollup merge of #93870 - tmiasko:const-precise-live-drops-with-coverage, r=ecstatic-morse
Fix switch on discriminant detection in a presence of coverage counters Fixes #93848. r? ``@ecstatic-morse``
This commit is contained in:
commit
0da6dd3e97
2 changed files with 32 additions and 13 deletions
|
@ -706,24 +706,27 @@ fn switch_on_enum_discriminant<'mir, 'tcx>(
|
||||||
block: &'mir mir::BasicBlockData<'tcx>,
|
block: &'mir mir::BasicBlockData<'tcx>,
|
||||||
switch_on: mir::Place<'tcx>,
|
switch_on: mir::Place<'tcx>,
|
||||||
) -> Option<(mir::Place<'tcx>, &'tcx ty::AdtDef)> {
|
) -> Option<(mir::Place<'tcx>, &'tcx ty::AdtDef)> {
|
||||||
match block.statements.last().map(|stmt| &stmt.kind) {
|
for statement in block.statements.iter().rev() {
|
||||||
Some(mir::StatementKind::Assign(box (lhs, mir::Rvalue::Discriminant(discriminated))))
|
match &statement.kind {
|
||||||
if *lhs == switch_on =>
|
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)),
|
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
|
// `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
|
// generator, but we do not need edge-specific effects in that case. This may
|
||||||
// change in the future.
|
// change in the future.
|
||||||
ty::Generator(..) => None,
|
ty::Generator(..) => return None,
|
||||||
|
|
||||||
t => bug!("`discriminant` called on unexpected type {:?}", t),
|
t => bug!("`discriminant` called on unexpected type {:?}", t),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
mir::StatementKind::Coverage(_) => continue,
|
||||||
|
_ => return None,
|
||||||
}
|
}
|
||||||
|
|
||||||
_ => None,
|
|
||||||
}
|
}
|
||||||
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
struct OnMutBorrow<F>(F);
|
struct OnMutBorrow<F>(F);
|
||||||
|
|
16
src/test/ui/consts/precise-drop-with-coverage.rs
Normal file
16
src/test/ui/consts/precise-drop-with-coverage.rs
Normal file
|
@ -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<T, E>(this: Option<Result<T, E>>) -> Result<Option<T>, E> {
|
||||||
|
match this {
|
||||||
|
Some(Ok(x)) => Ok(Some(x)),
|
||||||
|
Some(Err(e)) => Err(e),
|
||||||
|
None => Ok(None),
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue