mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-11-04 15:05:30 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			34 lines
		
	
	
		
			718 B
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			34 lines
		
	
	
		
			718 B
		
	
	
	
		
			Rust
		
	
	
	
	
	
// compile-flags: -O
 | 
						|
 | 
						|
// On x86 the closure is inlined in foo() producing something like
 | 
						|
// define i32 @foo() [...] {
 | 
						|
// tail call void @bar() [...]
 | 
						|
// ret i32 0
 | 
						|
// }
 | 
						|
// On riscv the closure is another function, placed before fn foo so CHECK can't
 | 
						|
// find it
 | 
						|
// ignore-riscv64 FIXME
 | 
						|
// On s390x the closure is also in another function
 | 
						|
// ignore-s390x FIXME
 | 
						|
// On loongarch64 the closure is also in another function
 | 
						|
// ignore-loongarch64 FIXME
 | 
						|
 | 
						|
#![crate_type = "lib"]
 | 
						|
#![feature(c_unwind)]
 | 
						|
 | 
						|
extern "C" {
 | 
						|
    fn bar();
 | 
						|
}
 | 
						|
 | 
						|
// CHECK-LABEL: @foo
 | 
						|
#[no_mangle]
 | 
						|
pub unsafe fn foo() -> i32 {
 | 
						|
    // CHECK: call void @bar
 | 
						|
    // CHECK: ret i32 0
 | 
						|
    std::panic::catch_unwind(|| {
 | 
						|
        bar();
 | 
						|
        0
 | 
						|
    })
 | 
						|
    .unwrap()
 | 
						|
}
 |