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