mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-10-30 20:44:34 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			67 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			67 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| #![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 `UnwindAction::Terminate`.
 | |
| //   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.
 | |
| */
 | 
