diff options
Diffstat (limited to 'tests/ui/asm/x86_64/may_unwind.rs')
-rw-r--r-- | tests/ui/asm/x86_64/may_unwind.rs | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/tests/ui/asm/x86_64/may_unwind.rs b/tests/ui/asm/x86_64/may_unwind.rs new file mode 100644 index 000000000..c11f0938d --- /dev/null +++ b/tests/ui/asm/x86_64/may_unwind.rs @@ -0,0 +1,38 @@ +// 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" 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); +} |