Skip to content

Commit

Permalink
Auto merge of #3099 - RalfJung:abi-target-feature, r=RalfJung
Browse files Browse the repository at this point in the history
add test for a function ABI mismatch due to target features

Cc #3095
  • Loading branch information
bors committed Oct 2, 2023
2 parents 7555cbb + cacf9f9 commit 114f814
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 0 deletions.
30 changes: 30 additions & 0 deletions tests/fail/function_calls/simd_feature_flag_difference.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
//@only-target-x86_64
#![allow(improper_ctypes_definitions)]
use std::arch::x86_64::*;
use std::mem::transmute;

#[no_mangle]
#[target_feature(enable = "avx")]
pub unsafe extern "C" fn foo(_y: f32, x: __m256) -> __m256 {
x
}

pub fn bar(x: __m256) -> __m256 {
// The first and second argument get mixed up here since caller
// and callee do not have the same feature flags.
// In Miri, we don't have a concept of "dynamically available feature flags",
// so this will always lead to an error due to calling a function that requires
// an unavailable feature. If we ever support dynamically available features,
// this will need some dedicated checks.
unsafe { foo(0.0, x) } //~ERROR: unavailable target features
}

fn assert_eq_m256(a: __m256, b: __m256) {
unsafe { assert_eq!(transmute::<_, [f32; 8]>(a), transmute::<_, [f32; 8]>(b)) }
}

fn main() {
let input = unsafe { transmute::<_, __m256>([1.0f32; 8]) };
let copy = bar(input);
assert_eq_m256(input, copy);
}
20 changes: 20 additions & 0 deletions tests/fail/function_calls/simd_feature_flag_difference.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
error: Undefined Behavior: calling a function that requires unavailable target features: avx
--> $DIR/simd_feature_flag_difference.rs:LL:CC
|
LL | unsafe { foo(0.0, x) }
| ^^^^^^^^^^^ calling a function that requires unavailable target features: avx
|
= help: this indicates a bug in the program: it performed an invalid operation, and caused Undefined Behavior
= help: see https://doc.rust-lang.org/nightly/reference/behavior-considered-undefined.html for further information
= note: BACKTRACE:
= note: inside `bar` at $DIR/simd_feature_flag_difference.rs:LL:CC
note: inside `main`
--> $DIR/simd_feature_flag_difference.rs:LL:CC
|
LL | let copy = bar(input);
| ^^^^^^^^^^

note: some details are omitted, run with `MIRIFLAGS=-Zmiri-backtrace=full` for a verbose backtrace

error: aborting due to previous error

0 comments on commit 114f814

Please sign in to comment.