about summary refs log tree commit diff
path: root/tests
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2024-10-25 15:17:47 +0000
committerbors <bors@rust-lang.org>2024-10-25 15:17:47 +0000
commit6faf0bd3e561f1a0c81f3eafe0ce0e688385d70e (patch)
tree54fce6cbbbdf6ce5b564da5d87ae4c078fc97c32 /tests
parent45089ec19ebebec88bace6ec237244ff0eaa7ad3 (diff)
parent5af56cac38fa48e4228e5e123d060e85eb1acbf7 (diff)
Auto merge of #127731 - veluca93:abi_checks, r=RalfJung
Emit future-incompatibility lint when calling/declaring functions with vectors that require missing target feature

On some architectures, vector types may have a different ABI depending on whether the relevant target features are enabled. (The ABI when the feature is disabled is often not specified, but LLVM implements some de-facto ABI.)

As discussed in https://github.com/rust-lang/lang-team/issues/235, this turns out to very easily lead to unsound code.

This commit makes it a post-monomorphization error to declare or call functions using those vector types in a context in which the corresponding target features are disabled, if using an ABI for which the difference is relevant. This ensures that these functions are always called with a consistent ABI.

See the [nomination comment](https://github.com/rust-lang/rust/pull/127731#issuecomment-2288558187) for more discussion.

r? RalfJung

Part of https://github.com/rust-lang/rust/issues/116558
Diffstat (limited to 'tests')
-rw-r--r--tests/crashes/131342-2.rs40
-rw-r--r--tests/crashes/131342.rs1
-rw-r--r--tests/ui/layout/post-mono-layout-cycle-2.rs1
-rw-r--r--tests/ui/layout/post-mono-layout-cycle-2.stderr10
-rw-r--r--tests/ui/layout/post-mono-layout-cycle.rs1
-rw-r--r--tests/ui/layout/post-mono-layout-cycle.stderr10
-rw-r--r--tests/ui/simd-abi-checks.rs81
-rw-r--r--tests/ui/simd-abi-checks.stderr93
-rw-r--r--tests/ui/sse-abi-checks.rs24
-rw-r--r--tests/ui/sse-abi-checks.stderr13
10 files changed, 221 insertions, 53 deletions
diff --git a/tests/crashes/131342-2.rs b/tests/crashes/131342-2.rs
deleted file mode 100644
index 79b6a837a49..00000000000
--- a/tests/crashes/131342-2.rs
+++ /dev/null
@@ -1,40 +0,0 @@
-//@ known-bug: #131342
-// see also: 131342.rs
-
-fn main() {
-    problem_thingy(Once);
-}
-
-struct Once;
-
-impl Iterator for Once {
-    type Item = ();
-}
-
-fn problem_thingy(items: impl Iterator) {
-    let peeker = items.peekable();
-    problem_thingy(&peeker);
-}
-
-trait Iterator {
-    type Item;
-
-    fn peekable(self) -> Peekable<Self>
-    where
-        Self: Sized,
-    {
-        loop {}
-    }
-}
-
-struct Peekable<I: Iterator> {
-    _peeked: I::Item,
-}
-
-impl<I: Iterator> Iterator for Peekable<I> {
-    type Item = I::Item;
-}
-
-impl<I: Iterator + ?Sized> Iterator for &I {
-    type Item = I::Item;
-}
diff --git a/tests/crashes/131342.rs b/tests/crashes/131342.rs
index 7f7ee9c9ac1..266aa0da97d 100644
--- a/tests/crashes/131342.rs
+++ b/tests/crashes/131342.rs
@@ -1,5 +1,4 @@
 //@ known-bug: #131342
-// see also: 131342-2.rs
 
 fn main() {
   let mut items = vec![1, 2, 3, 4, 5].into_iter();
diff --git a/tests/ui/layout/post-mono-layout-cycle-2.rs b/tests/ui/layout/post-mono-layout-cycle-2.rs
index 356f1e777c7..e9a5292fbbd 100644
--- a/tests/ui/layout/post-mono-layout-cycle-2.rs
+++ b/tests/ui/layout/post-mono-layout-cycle-2.rs
@@ -45,7 +45,6 @@ where
     T: Blah,
 {
     async fn ice(&mut self) {
-        //~^ ERROR a cycle occurred during layout computation
         let arr: [(); 0] = [];
         self.t.iter(arr.into_iter()).await;
     }
diff --git a/tests/ui/layout/post-mono-layout-cycle-2.stderr b/tests/ui/layout/post-mono-layout-cycle-2.stderr
index ad01c2694fa..ea69b39706f 100644
--- a/tests/ui/layout/post-mono-layout-cycle-2.stderr
+++ b/tests/ui/layout/post-mono-layout-cycle-2.stderr
@@ -12,12 +12,12 @@ LL |           Blah::iter(self, iterator).await
    |
    = note: a recursive `async fn` call must introduce indirection such as `Box::pin` to avoid an infinitely sized future
 
-error: a cycle occurred during layout computation
-  --> $DIR/post-mono-layout-cycle-2.rs:47:5
+note: the above error was encountered while instantiating `fn main::{closure#0}`
+  --> $DIR/post-mono-layout-cycle-2.rs:16:15
    |
-LL |     async fn ice(&mut self) {
-   |     ^^^^^^^^^^^^^^^^^^^^^^^
+LL |         match fut.as_mut().poll(ctx) {
+   |               ^^^^^^^^^^^^^^^^^^^^^^
 
-error: aborting due to 2 previous errors
+error: aborting due to 1 previous error
 
 For more information about this error, try `rustc --explain E0733`.
diff --git a/tests/ui/layout/post-mono-layout-cycle.rs b/tests/ui/layout/post-mono-layout-cycle.rs
index 8d136190c00..6753c01267e 100644
--- a/tests/ui/layout/post-mono-layout-cycle.rs
+++ b/tests/ui/layout/post-mono-layout-cycle.rs
@@ -14,7 +14,6 @@ struct Wrapper<T: Trait> {
 }
 
 fn abi<T: Trait>(_: Option<Wrapper<T>>) {}
-//~^ ERROR a cycle occurred during layout computation
 
 fn indirect<T: Trait>() {
     abi::<T>(None);
diff --git a/tests/ui/layout/post-mono-layout-cycle.stderr b/tests/ui/layout/post-mono-layout-cycle.stderr
index 47f7f30b1cb..e2f6ac595d0 100644
--- a/tests/ui/layout/post-mono-layout-cycle.stderr
+++ b/tests/ui/layout/post-mono-layout-cycle.stderr
@@ -5,12 +5,12 @@ error[E0391]: cycle detected when computing layout of `Wrapper<()>`
    = note: cycle used when computing layout of `core::option::Option<Wrapper<()>>`
    = note: see https://rustc-dev-guide.rust-lang.org/overview.html#queries and https://rustc-dev-guide.rust-lang.org/query.html for more information
 
-error: a cycle occurred during layout computation
-  --> $DIR/post-mono-layout-cycle.rs:16:1
+note: the above error was encountered while instantiating `fn indirect::<()>`
+  --> $DIR/post-mono-layout-cycle.rs:23:5
    |
-LL | fn abi<T: Trait>(_: Option<Wrapper<T>>) {}
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+LL |     indirect::<()>();
+   |     ^^^^^^^^^^^^^^^^
 
-error: aborting due to 2 previous errors
+error: aborting due to 1 previous error
 
 For more information about this error, try `rustc --explain E0391`.
diff --git a/tests/ui/simd-abi-checks.rs b/tests/ui/simd-abi-checks.rs
new file mode 100644
index 00000000000..094c89930b7
--- /dev/null
+++ b/tests/ui/simd-abi-checks.rs
@@ -0,0 +1,81 @@
+//@ only-x86_64
+//@ build-pass
+//@ ignore-pass (test emits codegen-time warnings)
+
+#![feature(avx512_target_feature)]
+#![feature(portable_simd)]
+#![allow(improper_ctypes_definitions)]
+
+use std::arch::x86_64::*;
+
+#[repr(transparent)]
+struct Wrapper(__m256);
+
+unsafe extern "C" fn w(_: Wrapper) {
+    //~^ ABI error: this function definition uses a vector type that requires the `avx` target feature, which is not enabled
+    //~| WARNING this was previously accepted by the compiler
+    todo!()
+}
+
+unsafe extern "C" fn f(_: __m256) {
+    //~^ ABI error: this function definition uses a vector type that requires the `avx` target feature, which is not enabled
+    //~| WARNING this was previously accepted by the compiler
+    todo!()
+}
+
+unsafe extern "C" fn g() -> __m256 {
+    //~^ ABI error: this function definition uses a vector type that requires the `avx` target feature, which is not enabled
+    //~| WARNING this was previously accepted by the compiler
+    todo!()
+}
+
+#[target_feature(enable = "avx")]
+unsafe extern "C" fn favx() -> __m256 {
+    todo!()
+}
+
+// avx2 implies avx, so no error here.
+#[target_feature(enable = "avx2")]
+unsafe extern "C" fn gavx(_: __m256) {
+    todo!()
+}
+
+// No error because of "Rust" ABI.
+fn as_f64x8(d: __m512d) -> std::simd::f64x8 {
+    unsafe { std::mem::transmute(d) }
+}
+
+unsafe fn test() {
+    let arg = std::mem::transmute([0.0f64; 8]);
+    as_f64x8(arg);
+}
+
+fn main() {
+    unsafe {
+        f(g());
+        //~^ WARNING ABI error: this function call uses a vector type that requires the `avx` target feature, which is not enabled in the caller
+        //~| WARNING ABI error: this function call uses a vector type that requires the `avx` target feature, which is not enabled in the caller
+        //~| WARNING this was previously accepted by the compiler
+        //~| WARNING this was previously accepted by the compiler
+    }
+
+    unsafe {
+        gavx(favx());
+        //~^ WARNING ABI error: this function call uses a vector type that requires the `avx` target feature, which is not enabled in the caller
+        //~| WARNING ABI error: this function call uses a vector type that requires the `avx` target feature, which is not enabled in the caller
+        //~| WARNING this was previously accepted by the compiler
+        //~| WARNING this was previously accepted by the compiler
+    }
+
+    unsafe {
+        test();
+    }
+
+    unsafe {
+        w(Wrapper(g()));
+        //~^ WARNING ABI error: this function call uses a vector type that requires the `avx` target feature, which is not enabled in the caller
+        //~| WARNING ABI error: this function call uses a vector type that requires the `avx` target feature, which is not enabled in the caller
+        //~| WARNING this was previously accepted by the compiler
+        //~| WARNING this was previously accepted by the compiler
+    }
+}
diff --git a/tests/ui/simd-abi-checks.stderr b/tests/ui/simd-abi-checks.stderr
new file mode 100644
index 00000000000..aa7e9400169
--- /dev/null
+++ b/tests/ui/simd-abi-checks.stderr
@@ -0,0 +1,93 @@
+warning: ABI error: this function call uses a vector type that requires the `avx` target feature, which is not enabled in the caller
+  --> $DIR/simd-abi-checks.rs:55:11
+   |
+LL |         f(g());
+   |           ^^^ function called here
+   |
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #116558 <https://github.com/rust-lang/rust/issues/116558>
+   = help: consider enabling it globally (`-C target-feature=+avx`) or locally (`#[target_feature(enable="avx")]`)
+   = note: `#[warn(abi_unsupported_vector_types)]` on by default
+
+warning: ABI error: this function call uses a vector type that requires the `avx` target feature, which is not enabled in the caller
+  --> $DIR/simd-abi-checks.rs:55:9
+   |
+LL |         f(g());
+   |         ^^^^^^ function called here
+   |
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #116558 <https://github.com/rust-lang/rust/issues/116558>
+   = help: consider enabling it globally (`-C target-feature=+avx`) or locally (`#[target_feature(enable="avx")]`)
+
+warning: ABI error: this function call uses a vector type that requires the `avx` target feature, which is not enabled in the caller
+  --> $DIR/simd-abi-checks.rs:63:14
+   |
+LL |         gavx(favx());
+   |              ^^^^^^ function called here
+   |
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #116558 <https://github.com/rust-lang/rust/issues/116558>
+   = help: consider enabling it globally (`-C target-feature=+avx`) or locally (`#[target_feature(enable="avx")]`)
+
+warning: ABI error: this function call uses a vector type that requires the `avx` target feature, which is not enabled in the caller
+  --> $DIR/simd-abi-checks.rs:63:9
+   |
+LL |         gavx(favx());
+   |         ^^^^^^^^^^^^ function called here
+   |
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #116558 <https://github.com/rust-lang/rust/issues/116558>
+   = help: consider enabling it globally (`-C target-feature=+avx`) or locally (`#[target_feature(enable="avx")]`)
+
+warning: ABI error: this function call uses a vector type that requires the `avx` target feature, which is not enabled in the caller
+  --> $DIR/simd-abi-checks.rs:75:19
+   |
+LL |         w(Wrapper(g()));
+   |                   ^^^ function called here
+   |
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #116558 <https://github.com/rust-lang/rust/issues/116558>
+   = help: consider enabling it globally (`-C target-feature=+avx`) or locally (`#[target_feature(enable="avx")]`)
+
+warning: ABI error: this function call uses a vector type that requires the `avx` target feature, which is not enabled in the caller
+  --> $DIR/simd-abi-checks.rs:75:9
+   |
+LL |         w(Wrapper(g()));
+   |         ^^^^^^^^^^^^^^^ function called here
+   |
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #116558 <https://github.com/rust-lang/rust/issues/116558>
+   = help: consider enabling it globally (`-C target-feature=+avx`) or locally (`#[target_feature(enable="avx")]`)
+
+warning: ABI error: this function definition uses a vector type that requires the `avx` target feature, which is not enabled
+  --> $DIR/simd-abi-checks.rs:26:1
+   |
+LL | unsafe extern "C" fn g() -> __m256 {
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ function defined here
+   |
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #116558 <https://github.com/rust-lang/rust/issues/116558>
+   = help: consider enabling it globally (`-C target-feature=+avx`) or locally (`#[target_feature(enable="avx")]`)
+
+warning: ABI error: this function definition uses a vector type that requires the `avx` target feature, which is not enabled
+  --> $DIR/simd-abi-checks.rs:20:1
+   |
+LL | unsafe extern "C" fn f(_: __m256) {
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ function defined here
+   |
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #116558 <https://github.com/rust-lang/rust/issues/116558>
+   = help: consider enabling it globally (`-C target-feature=+avx`) or locally (`#[target_feature(enable="avx")]`)
+
+warning: ABI error: this function definition uses a vector type that requires the `avx` target feature, which is not enabled
+  --> $DIR/simd-abi-checks.rs:14:1
+   |
+LL | unsafe extern "C" fn w(_: Wrapper) {
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ function defined here
+   |
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #116558 <https://github.com/rust-lang/rust/issues/116558>
+   = help: consider enabling it globally (`-C target-feature=+avx`) or locally (`#[target_feature(enable="avx")]`)
+
+warning: 9 warnings emitted
+
diff --git a/tests/ui/sse-abi-checks.rs b/tests/ui/sse-abi-checks.rs
new file mode 100644
index 00000000000..d2afd38fcc8
--- /dev/null
+++ b/tests/ui/sse-abi-checks.rs
@@ -0,0 +1,24 @@
+//! Ensure we trigger abi_unsupported_vector_types for target features that are usually enabled
+//! on a target, but disabled in this file via a `-C` flag.
+//@ compile-flags: --crate-type=rlib --target=i686-unknown-linux-gnu -C target-feature=-sse,-sse2
+//@ build-pass
+//@ ignore-pass (test emits codegen-time warnings)
+//@ needs-llvm-components: x86
+#![feature(no_core, lang_items, repr_simd)]
+#![no_core]
+#![allow(improper_ctypes_definitions)]
+
+#[lang = "sized"]
+trait Sized {}
+
+#[lang = "copy"]
+trait Copy {}
+
+#[repr(simd)]
+pub struct SseVector([i64; 2]);
+
+#[no_mangle]
+pub unsafe extern "C" fn f(_: SseVector) {
+    //~^ ABI error: this function definition uses a vector type that requires the `sse` target feature, which is not enabled
+    //~| WARNING this was previously accepted by the compiler
+}
diff --git a/tests/ui/sse-abi-checks.stderr b/tests/ui/sse-abi-checks.stderr
new file mode 100644
index 00000000000..77c4e1fc07a
--- /dev/null
+++ b/tests/ui/sse-abi-checks.stderr
@@ -0,0 +1,13 @@
+warning: ABI error: this function definition uses a vector type that requires the `sse` target feature, which is not enabled
+  --> $DIR/sse-abi-checks.rs:21:1
+   |
+LL | pub unsafe extern "C" fn f(_: SseVector) {
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ function defined here
+   |
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #116558 <https://github.com/rust-lang/rust/issues/116558>
+   = help: consider enabling it globally (`-C target-feature=+sse`) or locally (`#[target_feature(enable="sse")]`)
+   = note: `#[warn(abi_unsupported_vector_types)]` on by default
+
+warning: 1 warning emitted
+