#![feature(c_unwind)] #![allow(unused_assignments)] extern "C" fn might_abort(should_abort: bool) { if should_abort { println!("aborting..."); panic!("panics and aborts"); } else { println!("Don't Panic"); } } fn main() -> Result<(), u8> { let mut countdown = 10; while countdown > 0 { if countdown < 5 { might_abort(false); } // See discussion (below the `Notes` section) on coverage results for the closing brace. if countdown < 5 { might_abort(false); } // Counts for different regions on one 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 // character is a newline. if countdown < 5 { might_abort(false); } countdown -= 1; } Ok(()) } // Notes: // 1. Compare this program and its coverage results to those of the similar tests // `panic_unwind.rs` and `try_error_result.rs`. // 2. This test confirms the coverage generated when a program includes `TerminatorKind::Abort`. // 3. The test does not invoke the abort. By executing to a successful completion, the coverage // results show where the program did and did not execute. // 4. If the program actually aborted, the coverage counters would not be saved (which "works as // intended"). Coverage results would show no executed coverage regions. // 6. If `should_abort` is `true` and the program aborts, the program exits with a `132` status // (on Linux at least). /* Expect the following coverage results: ```text 16| 11| while countdown > 0 { 17| 10| if countdown < 5 { 18| 4| might_abort(false); 19| 6| } ``` This is actually correct. The condition `countdown < 5` executed 10 times (10 loop iterations). It evaluated to `true` 4 times, and executed the `might_abort()` call. It skipped the body of the `might_abort()` call 6 times. If an `if` does not include an explicit `else`, the coverage implementation injects a counter, at the character immediately after the `if`s closing brace, to count the "implicit" `else`. This is the only way to capture the coverage of the non-true condition. As another example of why this is important, say the condition was `countdown < 50`, which is always `true`. In that case, we wouldn't have a test for what happens if `might_abort()` is not called. The closing brace would have a count of `0`, highlighting the missed coverage. */