mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-10-31 04:57:19 +00:00 
			
		
		
		
	 87c2f9a5be
			
		
	
	
		87c2f9a5be
		
	
	
	
	
		
			
			This reverts commit 1d35638dc38dbfbf1cc2a9823135dfcf3c650169, reversing changes made to f23a80a4c2fbca593b64e70f5970368824b4c5e9.
		
			
				
	
	
		
			37 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			37 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| #![feature(core_intrinsics, coverage_attribute)]
 | |
| //@ edition: 2021
 | |
| 
 | |
| // <https://github.com/rust-lang/rust/issues/116171>
 | |
| // If we instrument a function for coverage, but all of its counter-increment
 | |
| // statements are removed by MIR optimizations, LLVM will think it isn't
 | |
| // instrumented and it will disappear from coverage maps and coverage reports.
 | |
| // Most MIR opts won't cause this because they tend not to remove statements
 | |
| // from bb0, but `UnreachablePropagation` can do so if it sees that bb0 ends
 | |
| // with `TerminatorKind::Unreachable`.
 | |
| 
 | |
| use std::hint::{black_box, unreachable_unchecked};
 | |
| 
 | |
| static UNREACHABLE_CLOSURE: fn() = || unsafe { unreachable_unchecked() };
 | |
| 
 | |
| fn unreachable_function() {
 | |
|     unsafe { unreachable_unchecked() }
 | |
| }
 | |
| 
 | |
| // Use an intrinsic to more reliably trigger unreachable-propagation.
 | |
| fn unreachable_intrinsic() {
 | |
|     unsafe { std::intrinsics::unreachable() }
 | |
| }
 | |
| 
 | |
| #[coverage(off)]
 | |
| fn main() {
 | |
|     if black_box(false) {
 | |
|         UNREACHABLE_CLOSURE();
 | |
|     }
 | |
|     if black_box(false) {
 | |
|         unreachable_function();
 | |
|     }
 | |
|     if black_box(false) {
 | |
|         unreachable_intrinsic();
 | |
|     }
 | |
| }
 |