File: unreachable.coverage

package info (click to toggle)
rustc 1.85.0%2Bdfsg3-1
  • links: PTS, VCS
  • area: main
  • in suites: experimental, sid, trixie
  • size: 893,396 kB
  • sloc: xml: 158,127; python: 35,830; javascript: 19,497; cpp: 19,002; sh: 17,245; ansic: 13,127; asm: 4,376; makefile: 1,051; perl: 29; lisp: 29; ruby: 19; sql: 11
file content (37 lines) | stat: -rw-r--r-- 1,618 bytes parent folder | download | duplicates (3)
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
   LL|       |#![feature(core_intrinsics, coverage_attribute)]
   LL|       |//@ edition: 2021
   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() }
   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|       |}