2020-05-01 08:32:28 -05:00
|
|
|
// Tests the new rules added by RFC 2396, including:
|
|
|
|
// - applying `#[target_feature]` to safe functions is allowed
|
|
|
|
// - calling functions with `#[target_feature]` is allowed in
|
|
|
|
// functions which have (at least) the same features
|
|
|
|
// - calling functions with `#[target_feature]` is allowed in
|
|
|
|
// unsafe contexts
|
|
|
|
// - functions with `#[target_feature]` can coerce to unsafe fn pointers
|
|
|
|
|
|
|
|
// check-pass
|
|
|
|
// only-x86_64
|
2021-05-14 16:52:34 -05:00
|
|
|
// revisions: mir thir
|
|
|
|
// [thir]compile-flags: -Z thir-unsafeck
|
2020-05-01 08:32:28 -05:00
|
|
|
|
2023-03-02 06:41:17 -06:00
|
|
|
#![feature(target_feature_11)]
|
|
|
|
|
2020-05-01 08:32:28 -05:00
|
|
|
#[target_feature(enable = "sse2")]
|
|
|
|
const fn sse2() {}
|
|
|
|
|
|
|
|
#[cfg(target_feature = "sse2")]
|
|
|
|
const SSE2_ONLY: () = unsafe {
|
|
|
|
sse2();
|
|
|
|
};
|
|
|
|
|
|
|
|
#[target_feature(enable = "sse2")]
|
|
|
|
fn also_sse2() {
|
|
|
|
sse2();
|
|
|
|
}
|
|
|
|
|
|
|
|
#[target_feature(enable = "sse2")]
|
|
|
|
#[target_feature(enable = "avx")]
|
|
|
|
fn sse2_and_avx() {
|
|
|
|
sse2();
|
|
|
|
}
|
|
|
|
|
|
|
|
struct Foo;
|
|
|
|
|
|
|
|
impl Foo {
|
|
|
|
#[target_feature(enable = "sse2")]
|
|
|
|
fn sse2(&self) {
|
|
|
|
sse2();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn main() {
|
|
|
|
if cfg!(target_feature = "sse2") {
|
|
|
|
unsafe {
|
|
|
|
sse2();
|
|
|
|
Foo.sse2();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
let sse2_ptr: unsafe fn() = sse2;
|
|
|
|
}
|