From: Mohamed Ali <[email protected]>
gcc/testsuite/ChangeLog:
* rust/compile/cttz.rs: New test.
* rust/compile/cttz_nonzero.rs: New test.
* rust/execute/torture/cttz.rs: New test.
* rust/execute/torture/cttz_nonzero.rs: New test.
Signed-off-by: Mohamed Ali <[email protected]>
---
gcc/testsuite/rust/compile/cttz.rs | 17 ++++
gcc/testsuite/rust/compile/cttz_nonzero.rs | 19 ++++
gcc/testsuite/rust/execute/torture/cttz.rs | 97 +++++++++++++++++++
.../rust/execute/torture/cttz_nonzero.rs | 74 ++++++++++++++
4 files changed, 207 insertions(+)
create mode 100644 gcc/testsuite/rust/compile/cttz.rs
create mode 100644 gcc/testsuite/rust/compile/cttz_nonzero.rs
create mode 100644 gcc/testsuite/rust/execute/torture/cttz.rs
create mode 100644 gcc/testsuite/rust/execute/torture/cttz_nonzero.rs
diff --git a/gcc/testsuite/rust/compile/cttz.rs
b/gcc/testsuite/rust/compile/cttz.rs
new file mode 100644
index 00000000000..b072167ac60
--- /dev/null
+++ b/gcc/testsuite/rust/compile/cttz.rs
@@ -0,0 +1,17 @@
+// { dg-do compile }
+#![feature(intrinsics, lang_items, no_core)]
+#![no_core]
+
+#[lang = "sized"]
+pub trait Sized {}
+
+#[lang = "copy"]
+pub trait Copy {}
+
+extern "rust-intrinsic" {
+ pub fn cttz<T>(x: T) -> u32; // { dg-error "cttz intrinsics can only be
used with basic integer types .got 'bool'." }
+}
+
+fn main() {
+ let _ = cttz(true);
+}
diff --git a/gcc/testsuite/rust/compile/cttz_nonzero.rs
b/gcc/testsuite/rust/compile/cttz_nonzero.rs
new file mode 100644
index 00000000000..210bd8bd2e5
--- /dev/null
+++ b/gcc/testsuite/rust/compile/cttz_nonzero.rs
@@ -0,0 +1,19 @@
+// { dg-do compile }
+#![feature(intrinsics, lang_items, no_core)]
+#![no_core]
+
+#[lang = "sized"]
+pub trait Sized {}
+
+#[lang = "copy"]
+pub trait Copy {}
+
+extern "rust-intrinsic" {
+ pub fn cttz_nonzero<T>(x: T) -> u32; // { dg-error "cttz intrinsics can
only be used with basic integer types .got 'bool'." }
+}
+
+fn main() {
+ unsafe {
+ let _ = cttz_nonzero(true);
+ }
+}
diff --git a/gcc/testsuite/rust/execute/torture/cttz.rs
b/gcc/testsuite/rust/execute/torture/cttz.rs
new file mode 100644
index 00000000000..d9f4656decb
--- /dev/null
+++ b/gcc/testsuite/rust/execute/torture/cttz.rs
@@ -0,0 +1,97 @@
+#![feature(no_core)]
+#![no_core]
+#![feature(intrinsics)]
+#![feature(lang_items)]
+
+#[lang = "sized"]
+pub trait Sized {}
+
+extern "rust-intrinsic" {
+ pub fn cttz<T>(x: T) -> u32;
+ pub fn abort() -> !;
+}
+
+fn main() -> i32 {
+ // cttz(0) must return bit_size per the Rust reference
+ if cttz(0u8) != 8 {
+ abort();
+ }
+ if cttz(1u8) != 0 {
+ abort();
+ }
+ if cttz(0xFFu8) != 0 {
+ abort();
+ }
+
+ if cttz(0u16) != 16 {
+ abort();
+ }
+ if cttz(1u16) != 0 {
+ abort();
+ }
+ if cttz(0xFFFFu16) != 0 {
+ abort();
+ }
+
+ if cttz(0u32) != 32 {
+ abort();
+ }
+ if cttz(1u32) != 0 {
+ abort();
+ }
+ if cttz(0xFFFFFFFFu32) != 0 {
+ abort();
+ }
+
+ if cttz(0u64) != 64 {
+ abort();
+ }
+ if cttz(1u64) != 0 {
+ abort();
+ }
+ if cttz(!0u64) != 0 {
+ abort();
+ }
+
+ if cttz(0i8) != 8 {
+ abort();
+ }
+ if cttz(1i8) != 0 {
+ abort();
+ }
+ if cttz(-1i8) != 0 {
+ abort();
+ }
+
+ if cttz(0i16) != 16 {
+ abort();
+ }
+ if cttz(1i16) != 0 {
+ abort();
+ }
+ if cttz(-1i16) != 0 {
+ abort();
+ }
+
+ if cttz(0i32) != 32 {
+ abort();
+ }
+ if cttz(1i32) != 0 {
+ abort();
+ }
+ if cttz(-1i32) != 0 {
+ abort();
+ }
+
+ if cttz(0i64) != 64 {
+ abort();
+ }
+ if cttz(1i64) != 0 {
+ abort();
+ }
+ if cttz(-1i64) != 0 {
+ abort();
+ }
+
+ 0
+}
diff --git a/gcc/testsuite/rust/execute/torture/cttz_nonzero.rs
b/gcc/testsuite/rust/execute/torture/cttz_nonzero.rs
new file mode 100644
index 00000000000..749dffaf6f6
--- /dev/null
+++ b/gcc/testsuite/rust/execute/torture/cttz_nonzero.rs
@@ -0,0 +1,74 @@
+#![feature(no_core)]
+#![no_core]
+#![feature(intrinsics)]
+#![feature(lang_items)]
+
+#[lang = "sized"]
+pub trait Sized {}
+
+extern "rust-intrinsic" {
+ pub fn cttz_nonzero<T>(x: T) -> u32;
+ pub fn abort() -> !;
+}
+
+fn main() -> i32 {
+ unsafe {
+ if cttz_nonzero(1u8) != 0 {
+ abort();
+ }
+ if cttz_nonzero(0xFFu8) != 0 {
+ abort();
+ }
+
+ if cttz_nonzero(1u16) != 0 {
+ abort();
+ }
+ if cttz_nonzero(0xFFFFu16) != 0 {
+ abort();
+ }
+
+ if cttz_nonzero(1u32) != 0 {
+ abort();
+ }
+ if cttz_nonzero(0xFFFFFFFFu32) != 0 {
+ abort();
+ }
+
+ if cttz_nonzero(1u64) != 0 {
+ abort();
+ }
+ if cttz_nonzero(!0u64) != 0 {
+ abort();
+ }
+
+ if cttz_nonzero(1i8) != 0 {
+ abort();
+ }
+ if cttz_nonzero(-1i8) != 0 {
+ abort();
+ }
+
+ if cttz_nonzero(1i16) != 0 {
+ abort();
+ }
+ if cttz_nonzero(-1i16) != 0 {
+ abort();
+ }
+
+ if cttz_nonzero(1i32) != 0 {
+ abort();
+ }
+ if cttz_nonzero(-1i32) != 0 {
+ abort();
+ }
+
+ if cttz_nonzero(1i64) != 0 {
+ abort();
+ }
+ if cttz_nonzero(-1i64) != 0 {
+ abort();
+ }
+ }
+
+ 0
+}
--
2.50.1