summaryrefslogtreecommitdiffstats
path: root/tests/coverage/unreachable.rs
blob: 6385bfa160d7d12870ae4d47114ddea7454f15cc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#![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();
    }
}