]> git.lizzy.rs Git - rust.git/blob - tests/run-make/coverage/abort.rs
Change `src/test` to `tests` in source files, fix tidy and tests
[rust.git] / tests / run-make / coverage / abort.rs
1 #![feature(c_unwind)]
2 #![allow(unused_assignments)]
3
4 extern "C" fn might_abort(should_abort: bool) {
5     if should_abort {
6         println!("aborting...");
7         panic!("panics and aborts");
8     } else {
9         println!("Don't Panic");
10     }
11 }
12
13 fn 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
43 Expect 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
52 This is actually correct.
53
54 The condition `countdown < 5` executed 10 times (10 loop iterations).
55
56 It evaluated to `true` 4 times, and executed the `might_abort()` call.
57
58 It 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
60 closing brace, to count the "implicit" `else`. This is the only way to capture the coverage of the
61 non-true condition.
62
63 As 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.
65 The closing brace would have a count of `0`, highlighting the missed coverage.
66 */