2023-09-28 00:08:11 -05:00
|
|
|
LL| |#![feature(core_intrinsics)]
|
|
|
|
LL| |#![feature(coverage_attribute)]
|
2024-01-12 00:12:45 -06:00
|
|
|
LL| |//@ edition: 2021
|
2023-09-28 00:08:11 -05:00
|
|
|
LL| |
|
|
|
|
LL| |// <https://github.com/rust-lang/rust/issues/116171>
|
|
|
|
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() }
|
2023-11-26 05:20:16 -06:00
|
|
|
LL| |}
|
2023-09-28 00:08:11 -05:00
|
|
|
LL| |
|
|
|
|
LL| |// Use an intrinsic to more reliably trigger unreachable-propagation.
|
|
|
|
LL| 0|fn unreachable_intrinsic() {
|
|
|
|
LL| 0| unsafe { std::intrinsics::unreachable() }
|
2023-11-26 05:20:16 -06:00
|
|
|
LL| |}
|
2023-09-28 00:08:11 -05:00
|
|
|
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| |}
|
|
|
|
|