[COMMITTED 110/146] gccrs: add two more tests to test try-catch (unwind) code generation

arthur.cohen@embecosm.com arthur.cohen@embecosm.com
Fri Mar 21 12:06:51 GMT 2025


From: liushuyu <liushuyu011@gmail.com>

gcc/testsuite/ChangeLog:
	* rust/compile/try-catch-unwind-old.rs: add a test to test the older
	try intrinsics from plain old Rust to v1.78.0
	* rust/compile/try-catch-unwind-new.rs: add a test to test the newer
	catch_unwind instrinsics since Rust v1.78.0
---
 .../rust/compile/try-catch-unwind-new.rs      | 20 ++++++++++++++++++
 .../rust/compile/try-catch-unwind-old.rs      | 21 +++++++++++++++++++
 2 files changed, 41 insertions(+)
 create mode 100644 gcc/testsuite/rust/compile/try-catch-unwind-new.rs
 create mode 100644 gcc/testsuite/rust/compile/try-catch-unwind-old.rs

diff --git a/gcc/testsuite/rust/compile/try-catch-unwind-new.rs b/gcc/testsuite/rust/compile/try-catch-unwind-new.rs
new file mode 100644
index 00000000000..b176f7a100b
--- /dev/null
+++ b/gcc/testsuite/rust/compile/try-catch-unwind-new.rs
@@ -0,0 +1,20 @@
+// { dg-options "-O2 -w -fdump-tree-optimized" }
+#![feature(intrinsics)]
+
+extern "rust-intrinsic" {
+    // { dg-final { scan-tree-dump-times "__builtin_eh_pointer" 1 "optimized" } }
+    fn catch_unwind(try_fn: fn(_: *mut u8), data: *mut u8, catch_fn: fn(_: *mut u8, _: *mut u8));
+}
+
+extern "C" {
+    fn try_fn(data: *mut u8);
+    fn catch_fn(data: *mut u8, ex: *mut u8);
+}
+
+pub fn not_main(d: &mut u8) {
+    unsafe {
+        // { dg-final { scan-tree-dump-times "try_fn" 1 "optimized" } }
+        catch_unwind(try_fn, d, catch_fn);
+        // { dg-final { scan-tree-dump-times "catch_fn" 1 "optimized" } }
+    }
+}
diff --git a/gcc/testsuite/rust/compile/try-catch-unwind-old.rs b/gcc/testsuite/rust/compile/try-catch-unwind-old.rs
new file mode 100644
index 00000000000..e97d52cd64e
--- /dev/null
+++ b/gcc/testsuite/rust/compile/try-catch-unwind-old.rs
@@ -0,0 +1,21 @@
+// { dg-options "-O2 -w -fdump-tree-optimized" }
+#![feature(intrinsics)]
+
+extern "rust-intrinsic" {
+    // { dg-final { scan-tree-dump-times "__builtin_eh_pointer" 1 "optimized" } }
+    fn r#try(try_fn: fn(_: *mut u8), data: *mut u8, catch_fn: fn(_: *mut u8, _: *mut u8)) -> i32;
+}
+
+extern "C" {
+    fn try_fn(data: *mut u8);
+    fn catch_fn(data: *mut u8, ex: *mut u8);
+}
+
+pub fn not_main(d: &mut u8) -> i32 {
+    unsafe {
+        // { dg-final { scan-tree-dump-times "try_fn" 1 "optimized" } }
+        let _: i32 = r#try(try_fn, d, catch_fn);
+        // { dg-final { scan-tree-dump-times "catch_fn" 1 "optimized" } }
+    }
+    42
+}
-- 
2.45.2



More information about the Gcc-rust mailing list