| //@ revisions: emscripten wasi seh |
| //@[emscripten] compile-flags: --target wasm32-unknown-emscripten -Z emscripten-wasm-eh |
| //@[wasi] compile-flags: --target wasm32-wasip1 -C panic=unwind |
| //@[seh] compile-flags: --target x86_64-pc-windows-msvc |
| //@[emscripten] needs-llvm-components: webassembly |
| //@[wasi] needs-llvm-components: webassembly |
| //@[seh] needs-llvm-components: x86 |
| |
| // Ensure a catch-all generates: |
| // - `catchpad ... [ptr null]` on Wasm (otherwise LLVM gets confused) |
| // - `catchpad ... [ptr null, i32 64, ptr null]` on Windows (otherwise we catch SEH exceptions) |
| |
| #![feature(no_core, lang_items, rustc_attrs)] |
| #![crate_type = "lib"] |
| #![no_std] |
| #![no_core] |
| |
| #[lang = "pointee_sized"] |
| pub trait PointeeSized {} |
| |
| #[lang = "meta_sized"] |
| pub trait MetaSized: PointeeSized {} |
| |
| #[lang = "sized"] |
| pub trait Sized: MetaSized {} |
| |
| unsafe extern "C-unwind" { |
| safe fn unwinds(); |
| } |
| |
| #[lang = "panic_cannot_unwind"] |
| fn panic_cannot_unwind() -> ! { |
| loop {} |
| } |
| |
| #[no_mangle] |
| #[rustc_nounwind] |
| pub fn doesnt_unwind() { |
| // emscripten: %catchpad = catchpad within %catchswitch [ptr null] |
| // wasi: %catchpad = catchpad within %catchswitch [ptr null] |
| // seh: %catchpad = catchpad within %catchswitch [ptr null, i32 64, ptr null] |
| unwinds(); |
| } |