|
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