//@ only-x86_64 //@ run-pass //@ needs-asm-support //@ needs-unwind #![feature(asm_unwind)] use std::arch::asm; use std::panic::{catch_unwind, resume_unwind, AssertUnwindSafe}; struct Foo<'a>(&'a mut bool); impl Drop for Foo<'_> { fn drop(&mut self) { *self.0 = false; } } extern "C-unwind" fn panicky() { resume_unwind(Box::new(())); } fn main() { let flag = &mut true; catch_unwind(AssertUnwindSafe(|| { let _foo = Foo(flag); unsafe { asm!( "call {}", sym panicky, clobber_abi("C"), options(may_unwind) ); } })) .expect_err("expected a panic"); assert_eq!(*flag, false); }