aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/rust
diff options
context:
space:
mode:
authorArthur Cohen <arthur.cohen@embecosm.com>2022-10-26 15:57:54 +0200
committerArthur Cohen <arthur.cohen@embecosm.com>2023-02-21 12:36:42 +0100
commit1c586a1d1c12dce2a65fb117b577a73ad5cf45ea (patch)
treee17a7e330a6e97e19f5506bcb54128f31be3306d /gcc/testsuite/rust
parenta7c8f7ee34334edec4b57db547de1c8b5d0ad31d (diff)
downloadgcc-1c586a1d1c12dce2a65fb117b577a73ad5cf45ea.zip
gcc-1c586a1d1c12dce2a65fb117b577a73ad5cf45ea.tar.gz
gcc-1c586a1d1c12dce2a65fb117b577a73ad5cf45ea.tar.bz2
gccrs: intrinsics: Add unchecked operation intrinsics
gcc/rust/ChangeLog: * backend/rust-compile-intrinsic.cc (is_basic_integer_type): New function. (unchecked_op_inner): New handler. (unchecked_op_handler): New handler. gcc/testsuite/ChangeLog: * rust/compile/torture/intrinsics-6.rs: New test. * rust/compile/torture/intrinsics-7.rs: New test.
Diffstat (limited to 'gcc/testsuite/rust')
-rw-r--r--gcc/testsuite/rust/compile/torture/intrinsics-6.rs21
-rw-r--r--gcc/testsuite/rust/compile/torture/intrinsics-7.rs10
2 files changed, 31 insertions, 0 deletions
diff --git a/gcc/testsuite/rust/compile/torture/intrinsics-6.rs b/gcc/testsuite/rust/compile/torture/intrinsics-6.rs
new file mode 100644
index 0000000..143b62a
--- /dev/null
+++ b/gcc/testsuite/rust/compile/torture/intrinsics-6.rs
@@ -0,0 +1,21 @@
+extern "rust-intrinsic" {
+ pub fn unchecked_add<T>(x: T, y: T) -> T;
+ pub fn unchecked_sub<T>(x: T, y: T) -> T;
+ pub fn unchecked_mul<T>(x: T, y: T) -> T;
+ pub fn unchecked_div<T>(x: T, y: T) -> T;
+ pub fn unchecked_rem<T>(x: T, y: T) -> T;
+ pub fn unchecked_shl<T>(x: T, y: T) -> T;
+ pub fn unchecked_shr<T>(x: T, y: T) -> T;
+}
+
+fn main() -> i32 {
+ let zero0 = unsafe { (1 + 5) - unchecked_add(1, 5) };
+ let zero1 = unsafe { (1 - 5) - unchecked_sub(1, 5) };
+ let zero2 = unsafe { (1 * 5) - unchecked_mul(1, 5) };
+ let zero3 = unsafe { (1 / 5) - unchecked_div(1, 5) };
+ let zero4 = unsafe { (1 % 5) - unchecked_rem(1, 5) };
+ let zero5 = unsafe { (1 << 5) - unchecked_shl(1, 5) };
+ let zero6 = unsafe { (1 >> 5) - unchecked_shr(1, 5) };
+
+ zero0 + zero1 + zero2 + zero3 + zero4 + zero5 + zero6
+}
diff --git a/gcc/testsuite/rust/compile/torture/intrinsics-7.rs b/gcc/testsuite/rust/compile/torture/intrinsics-7.rs
new file mode 100644
index 0000000..8e8c5fe
--- /dev/null
+++ b/gcc/testsuite/rust/compile/torture/intrinsics-7.rs
@@ -0,0 +1,10 @@
+extern "rust-intrinsic" {
+ pub fn unchecked_add<T>(x: T, y: T) -> T;
+ // { dg-error "unchecked operation intrinsics can only be used with basic integer types .got .NotAdd.." "" { target *-*-* } .-1 }
+}
+
+fn main() {
+ struct NotAdd;
+
+ unsafe { unchecked_add(NotAdd, NotAdd) };
+}