Fix assertions in coverage-reports
test
Update some `C-unwind` bits and then
This commit is contained in:
parent
37c85ec939
commit
bb68c66c40
4 changed files with 70 additions and 76 deletions
|
@ -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| |*/
|
||||||
|
|
||||||
|
|
|
@ -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| }
|
||||||
|
|
|
@ -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|}
|
||||||
|
|
|
@ -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(())
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue