LL| |#![feature(core_intrinsics)] LL| |#![feature(coverage_attribute)] LL| |//@ edition: 2021 LL| | LL| |// LL| |// If we instrument a function for coverage, but all of its counter-increment LL| |// statements are removed by MIR optimizations, LLVM will think it isn't LL| |// instrumented and it will disappear from coverage maps and coverage reports. LL| |// Most MIR opts won't cause this because they tend not to remove statements LL| |// from bb0, but `UnreachablePropagation` can do so if it sees that bb0 ends LL| |// with `TerminatorKind::Unreachable`. LL| | LL| |use std::hint::{black_box, unreachable_unchecked}; LL| | LL| 0|static UNREACHABLE_CLOSURE: fn() = || unsafe { unreachable_unchecked() }; LL| | LL| 0|fn unreachable_function() { LL| 0| unsafe { unreachable_unchecked() } LL| |} LL| | LL| |// Use an intrinsic to more reliably trigger unreachable-propagation. LL| 0|fn unreachable_intrinsic() { LL| 0| unsafe { std::intrinsics::unreachable() } LL| |} LL| | LL| |#[coverage(off)] LL| |fn main() { LL| | if black_box(false) { LL| | UNREACHABLE_CLOSURE(); LL| | } LL| | if black_box(false) { LL| | unreachable_function(); LL| | } LL| | if black_box(false) { LL| | unreachable_intrinsic(); LL| | } LL| |}