Coverage tests for remaining TerminatorKinds and async, improve Assert
Tested and validate results for panic unwind, panic abort, assert!()
macro, TerminatorKind::Assert (for example, numeric overflow), and
async/await.
Implemented a previous documented idea to change Assert handling to be
the same as FalseUnwind and Goto, so it doesn't get its own
BasicCoverageBlock anymore. This changed a couple of coverage regions,
but I validated those changes are not any worse than the prior results,
and probably help assure some consistency (even if some people might
disagree with how the code region is consistently computed).
Fixed issue with async/await. AggregateKind::Generator needs to be
handled like AggregateKind::Closure; coverage span for the outer async
function should not "cover" the async body, which is actually executed
in a separate "closure" MIR.
2020-11-16 17:14:28 +00:00
|
|
|
#![allow(unused_assignments)]
|
2023-06-12 08:07:04 +00:00
|
|
|
// failure-status: 101
|
Coverage tests for remaining TerminatorKinds and async, improve Assert
Tested and validate results for panic unwind, panic abort, assert!()
macro, TerminatorKind::Assert (for example, numeric overflow), and
async/await.
Implemented a previous documented idea to change Assert handling to be
the same as FalseUnwind and Goto, so it doesn't get its own
BasicCoverageBlock anymore. This changed a couple of coverage regions,
but I validated those changes are not any worse than the prior results,
and probably help assure some consistency (even if some people might
disagree with how the code region is consistently computed).
Fixed issue with async/await. AggregateKind::Generator needs to be
handled like AggregateKind::Closure; coverage span for the outer async
function should not "cover" the async body, which is actually executed
in a separate "closure" MIR.
2020-11-16 17:14:28 +00:00
|
|
|
|
|
|
|
fn might_fail_assert(one_plus_one: u32) {
|
|
|
|
println!("does 1 + 1 = {}?", one_plus_one);
|
|
|
|
assert_eq!(1 + 1, one_plus_one, "the argument was wrong");
|
|
|
|
}
|
|
|
|
|
|
|
|
fn main() -> Result<(),u8> {
|
|
|
|
let mut countdown = 10;
|
|
|
|
while countdown > 0 {
|
|
|
|
if countdown == 1 {
|
|
|
|
might_fail_assert(3);
|
|
|
|
} else if countdown < 5 {
|
|
|
|
might_fail_assert(2);
|
|
|
|
}
|
|
|
|
countdown -= 1;
|
|
|
|
}
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
|
|
|
|
// Notes:
|
|
|
|
// 1. Compare this program and its coverage results to those of the very similar test
|
|
|
|
// `panic_unwind.rs`, and similar tests `abort.rs` and `try_error_result.rs`.
|
|
|
|
// 2. This test confirms the coverage generated when a program passes or fails an `assert!()` or
|
|
|
|
// related `assert_*!()` macro.
|
|
|
|
// 3. Notably, the `assert` macros *do not* generate `TerminatorKind::Assert`. The macros produce
|
|
|
|
// conditional expressions, `TerminatorKind::SwitchInt` branches, and a possible call to
|
|
|
|
// `begin_panic_fmt()` (that begins a panic unwind, if the assertion test fails).
|
|
|
|
// 4. `TerminatoKind::Assert` is, however, also present in the MIR generated for this test
|
|
|
|
// (and in many other coverage tests). The `Assert` terminator is typically generated by the
|
|
|
|
// Rust compiler to check for runtime failures, such as numeric overflows.
|