c8b76bcf58
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 rust-lang/lang-team#235, this turns out to very easily lead to unsound code. This commit makes it a post-monomorphization future-incompat warning 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. Part of #116558
25 lines
349 B
Rust
25 lines
349 B
Rust
//@ build-fail
|
|
//~^ cycle detected when computing layout of `Wrapper<()>`
|
|
|
|
trait Trait {
|
|
type Assoc;
|
|
}
|
|
|
|
impl Trait for () {
|
|
type Assoc = Wrapper<()>;
|
|
}
|
|
|
|
struct Wrapper<T: Trait> {
|
|
_x: <T as Trait>::Assoc,
|
|
}
|
|
|
|
fn abi<T: Trait>(_: Option<Wrapper<T>>) {}
|
|
|
|
fn indirect<T: Trait>() {
|
|
abi::<T>(None);
|
|
}
|
|
|
|
fn main() {
|
|
indirect::<()>();
|
|
}
|