diff options
| author | Jan-Mirko Otter <janmirko.otter@googlemail.com> | 2023-07-01 18:45:36 +0200 |
|---|---|---|
| committer | Jan-Mirko Otter <janmirko.otter@googlemail.com> | 2023-07-01 20:24:15 +0200 |
| commit | 65aeac610c00cdc3dfb9cc08abb910cc9011d8d5 (patch) | |
| tree | 394df75d92ac5315354e2df77c172711edfb4b48 /tests/assembly/wasm_exceptions.rs | |
| parent | db76154817be731c10cbb2680fe2b0a5880796ab (diff) | |
| download | rust-65aeac610c00cdc3dfb9cc08abb910cc9011d8d5.tar.gz rust-65aeac610c00cdc3dfb9cc08abb910cc9011d8d5.zip | |
add assembly-test: wasm-exceptions
Diffstat (limited to 'tests/assembly/wasm_exceptions.rs')
| -rw-r--r-- | tests/assembly/wasm_exceptions.rs | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/tests/assembly/wasm_exceptions.rs b/tests/assembly/wasm_exceptions.rs new file mode 100644 index 00000000000..b7d20881b62 --- /dev/null +++ b/tests/assembly/wasm_exceptions.rs @@ -0,0 +1,60 @@ +// only-wasm32-bare +// assembly-output: emit-asm +// compile-flags: -C target-feature=+exception-handling +// compile-flags: -C panic=unwind +// compile-flags: -C llvm-args=-wasm-enable-eh + +#![crate_type = "lib"] +#![feature(core_intrinsics)] +#![feature(rustc_attrs)] + +extern { + fn may_panic(); + + #[rustc_nounwind] + fn log_number(number: usize); +} + +struct LogOnDrop; + +impl Drop for LogOnDrop { + fn drop(&mut self) { + unsafe { log_number(0); } + } +} + +// CHECK-LABEL: test_cleanup: +#[no_mangle] +pub fn test_cleanup() { + let _log_on_drop = LogOnDrop; + unsafe { may_panic(); } + + // CHECK-NOT: call + // CHECK: try + // CHECK: call may_panic + // CHECK: catch_all + // CHECK: rethrow + // CHECK: end_try +} + +// CHECK-LABEL: test_rtry: +#[no_mangle] +pub fn test_rtry() { + unsafe { + core::intrinsics::r#try(|_| { + may_panic(); + }, core::ptr::null_mut(), |data, exception| { + log_number(data as usize); + log_number(exception as usize); + }); + } + + // CHECK-NOT: call + // CHECK: try + // CHECK: call may_panic + // CHECK: catch + // CHECK: call log_number + // CHECK: call log_number + // CHECK-NOT: rethrow + // CHECK: end_try +} |
