1
Fork 0

Fix assertions in coverage-reports test

Update some `C-unwind` bits and then
This commit is contained in:
Alex Crichton 2021-08-04 07:43:28 -07:00
parent 37c85ec939
commit bb68c66c40
4 changed files with 70 additions and 76 deletions

View file

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

View file

@ -29,12 +29,12 @@
18| 2| println!("BOOM times {}!!!", self.strength); 18| 2| println!("BOOM times {}!!!", self.strength);
19| 2| } 19| 2| }
------------------ ------------------
| <generics::Firework<i32> as core::ops::drop::Drop>::drop: | <generics::Firework<f64> as core::ops::drop::Drop>::drop:
| 17| 1| fn drop(&mut self) { | 17| 1| fn drop(&mut self) {
| 18| 1| println!("BOOM times {}!!!", self.strength); | 18| 1| println!("BOOM times {}!!!", self.strength);
| 19| 1| } | 19| 1| }
------------------ ------------------
| <generics::Firework<f64> as core::ops::drop::Drop>::drop: | <generics::Firework<i32> as core::ops::drop::Drop>::drop:
| 17| 1| fn drop(&mut self) { | 17| 1| fn drop(&mut self) {
| 18| 1| println!("BOOM times {}!!!", self.strength); | 18| 1| println!("BOOM times {}!!!", self.strength);
| 19| 1| } | 19| 1| }

View file

@ -19,12 +19,12 @@
18| 2| println!("used_only_from_bin_crate_generic_function with {:?}", arg); 18| 2| println!("used_only_from_bin_crate_generic_function with {:?}", arg);
19| 2|} 19| 2|}
------------------ ------------------
| used_crate::used_only_from_bin_crate_generic_function::<&str>: | used_crate::used_only_from_bin_crate_generic_function::<&alloc::vec::Vec<i32>>:
| 17| 1|pub fn used_only_from_bin_crate_generic_function<T: Debug>(arg: T) { | 17| 1|pub fn used_only_from_bin_crate_generic_function<T: Debug>(arg: T) {
| 18| 1| println!("used_only_from_bin_crate_generic_function with {:?}", arg); | 18| 1| println!("used_only_from_bin_crate_generic_function with {:?}", arg);
| 19| 1|} | 19| 1|}
------------------ ------------------
| used_crate::used_only_from_bin_crate_generic_function::<&alloc::vec::Vec<i32>>: | used_crate::used_only_from_bin_crate_generic_function::<&str>:
| 17| 1|pub fn used_only_from_bin_crate_generic_function<T: Debug>(arg: T) { | 17| 1|pub fn used_only_from_bin_crate_generic_function<T: Debug>(arg: T) {
| 18| 1| println!("used_only_from_bin_crate_generic_function with {:?}", arg); | 18| 1| println!("used_only_from_bin_crate_generic_function with {:?}", arg);
| 19| 1|} | 19| 1|}

View file

@ -17,16 +17,11 @@ fn main() -> Result<(), u8> {
might_abort(false); might_abort(false);
} }
// See discussion (below the `Notes` section) on coverage results for the closing brace. // See discussion (below the `Notes` section) on coverage results for the closing brace.
if countdown < 5 { if countdown < 5 { might_abort(false); } // Counts for different regions on one line.
might_abort(false);
}
// Counts for different regions on one line.
// For the following example, the closing brace is the last character on the line. // For the following example, the closing brace is the last character on the line.
// This shows the character after the closing brace is highlighted, even if that next // This shows the character after the closing brace is highlighted, even if that next
// character is a newline. // character is a newline.
if countdown < 5 { if countdown < 5 { might_abort(false); }
might_abort(false);
}
countdown -= 1; countdown -= 1;
} }
Ok(()) Ok(())