mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-23 15:23:46 +00:00
38 lines
1.1 KiB
Rust
38 lines
1.1 KiB
Rust
#![feature(core_intrinsics)]
|
|
#![feature(coverage_attribute)]
|
|
// compile-flags: --edition=2021
|
|
|
|
// <https://github.com/rust-lang/rust/issues/116171>
|
|
// If we instrument a function for coverage, but all of its counter-increment
|
|
// statements are removed by MIR optimizations, LLVM will think it isn't
|
|
// instrumented and it will disappear from coverage maps and coverage reports.
|
|
// Most MIR opts won't cause this because they tend not to remove statements
|
|
// from bb0, but `UnreachablePropagation` can do so if it sees that bb0 ends
|
|
// with `TerminatorKind::Unreachable`.
|
|
|
|
use std::hint::{black_box, unreachable_unchecked};
|
|
|
|
static UNREACHABLE_CLOSURE: fn() = || unsafe { unreachable_unchecked() };
|
|
|
|
fn unreachable_function() {
|
|
unsafe { unreachable_unchecked() }
|
|
}
|
|
|
|
// Use an intrinsic to more reliably trigger unreachable-propagation.
|
|
fn unreachable_intrinsic() {
|
|
unsafe { std::intrinsics::unreachable() }
|
|
}
|
|
|
|
#[coverage(off)]
|
|
fn main() {
|
|
if black_box(false) {
|
|
UNREACHABLE_CLOSURE();
|
|
}
|
|
if black_box(false) {
|
|
unreachable_function();
|
|
}
|
|
if black_box(false) {
|
|
unreachable_intrinsic();
|
|
}
|
|
}
|