| //@ compile-flags: -Z panic-in-drop=abort -Copt-level=3 | 
 | //@ ignore-msvc | 
 |  | 
 | // Ensure that unwinding code paths are eliminated from the output after | 
 | // optimization. | 
 |  | 
 | // This test uses ignore-msvc, because the expected optimization does not happen on targets using | 
 | // SEH exceptions with the new LLVM pass manager anymore, see | 
 | // https://github.com/llvm/llvm-project/issues/51311. | 
 |  | 
 | // CHECK-NOT: {{(call|invoke).*}}should_not_appear_in_output | 
 |  | 
 | #![crate_type = "lib"] | 
 | use std::any::Any; | 
 | use std::mem::forget; | 
 |  | 
 | pub struct ExternDrop; | 
 | impl Drop for ExternDrop { | 
 |     #[inline(always)] | 
 |     fn drop(&mut self) { | 
 |         // This call may potentially unwind. | 
 |         extern "Rust" { | 
 |             fn extern_drop(); | 
 |         } | 
 |         unsafe { | 
 |             extern_drop(); | 
 |         } | 
 |     } | 
 | } | 
 |  | 
 | struct AssertNeverDrop; | 
 | impl Drop for AssertNeverDrop { | 
 |     #[inline(always)] | 
 |     fn drop(&mut self) { | 
 |         // This call should be optimized away as unreachable. | 
 |         extern "C" { | 
 |             fn should_not_appear_in_output(); | 
 |         } | 
 |         unsafe { | 
 |             should_not_appear_in_output(); | 
 |         } | 
 |     } | 
 | } | 
 |  | 
 | #[no_mangle] | 
 | pub fn normal_drop(x: ExternDrop) { | 
 |     let guard = AssertNeverDrop; | 
 |     drop(x); | 
 |     forget(guard); | 
 | } | 
 |  | 
 | #[no_mangle] | 
 | pub fn indirect_drop(x: Box<dyn Any>) { | 
 |     let guard = AssertNeverDrop; | 
 |     drop(x); | 
 |     forget(guard); | 
 | } |