]> git.proxmox.com Git - rustc.git/blame - src/test/run-make-fulldeps/coverage/abort.rs
New upstream version 1.56.0~beta.4+dfsg1
[rustc.git] / src / test / run-make-fulldeps / coverage / abort.rs
CommitLineData
94222f64 1#![feature(c_unwind)]
fc512014
XL
2#![allow(unused_assignments)]
3
94222f64 4extern "C" fn might_abort(should_abort: bool) {
fc512014
XL
5 if should_abort {
6 println!("aborting...");
7 panic!("panics and aborts");
8 } else {
9 println!("Don't Panic");
10 }
11}
12
13fn main() -> Result<(), u8> {
14 let mut countdown = 10;
15 while countdown > 0 {
16 if countdown < 5 {
17 might_abort(false);
18 }
19 // See discussion (below the `Notes` section) on coverage results for the closing brace.
20 if countdown < 5 { might_abort(false); } // Counts for different regions on one line.
21 // For the following example, the closing brace is the last character on the line.
22 // This shows the character after the closing brace is highlighted, even if that next
23 // character is a newline.
24 if countdown < 5 { might_abort(false); }
25 countdown -= 1;
26 }
27 Ok(())
28}
29
30// Notes:
31// 1. Compare this program and its coverage results to those of the similar tests
32// `panic_unwind.rs` and `try_error_result.rs`.
33// 2. This test confirms the coverage generated when a program includes `TerminatorKind::Abort`.
34// 3. The test does not invoke the abort. By executing to a successful completion, the coverage
35// results show where the program did and did not execute.
36// 4. If the program actually aborted, the coverage counters would not be saved (which "works as
37// intended"). Coverage results would show no executed coverage regions.
38// 6. If `should_abort` is `true` and the program aborts, the program exits with a `132` status
39// (on Linux at least).
40
41/*
42
43Expect the following coverage results:
44
45```text
46 16| 11| while countdown > 0 {
47 17| 10| if countdown < 5 {
48 18| 4| might_abort(false);
49 19| 6| }
50```
51
52This is actually correct.
53
54The condition `countdown < 5` executed 10 times (10 loop iterations).
55
56It evaluated to `true` 4 times, and executed the `might_abort()` call.
57
58It skipped the body of the `might_abort()` call 6 times. If an `if` does not include an explicit
59`else`, the coverage implementation injects a counter, at the character immediately after the `if`s
60closing brace, to count the "implicit" `else`. This is the only way to capture the coverage of the
61non-true condition.
62
63As another example of why this is important, say the condition was `countdown < 50`, which is always
64`true`. In that case, we wouldn't have a test for what happens if `might_abort()` is not called.
65The closing brace would have a count of `0`, highlighting the missed coverage.
66*/