]>
Commit | Line | Data |
---|---|---|
94222f64 | 1 | #![feature(c_unwind)] |
fc512014 XL |
2 | #![allow(unused_assignments)] |
3 | ||
94222f64 | 4 | extern "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 | ||
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 | */ |