//@ 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 } }