forked from rust-lang/rust
-
Notifications
You must be signed in to change notification settings - Fork 6
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
f9b9ba5
commit 8d9f73a
Showing
12 changed files
with
286 additions
and
12 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,50 @@ | ||
// 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 | ||
|
||
#![feature(target_feature_11)] | ||
|
||
#[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; | ||
} |
6 changes: 6 additions & 0 deletions
6
src/test/ui/rfcs/rfc-2396-target_feature-11/feature-gate-target_feature_11.rs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
// only-x86_64 | ||
|
||
#[target_feature(enable = "sse2")] //~ ERROR can only be applied to `unsafe` functions | ||
fn foo() {} | ||
|
||
fn main() {} |
14 changes: 14 additions & 0 deletions
14
src/test/ui/rfcs/rfc-2396-target_feature-11/feature-gate-target_feature_11.stderr
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
error[E0658]: `#[target_feature(..)]` can only be applied to `unsafe` functions | ||
--> $DIR/feature-gate-target_feature_11.rs:3:1 | ||
| | ||
LL | #[target_feature(enable = "sse2")] | ||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ||
LL | fn foo() {} | ||
| ----------- not an `unsafe` function | ||
| | ||
= note: see issue #69098 <https://github.com/rust-lang/rust/issues/69098> for more information | ||
= help: add `#![feature(target_feature_11)]` to the crate attributes to enable | ||
|
||
error: aborting due to previous error | ||
|
||
For more information about this error, try `rustc --explain E0658`. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
// only-x86_64 | ||
|
||
#![feature(target_feature_11)] | ||
|
||
#[target_feature(enable = "sse2")] | ||
fn foo() {} | ||
|
||
fn main() { | ||
let foo: fn() = foo; //~ ERROR mismatched types | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
error[E0308]: mismatched types | ||
--> $DIR/fn-ptr.rs:9:21 | ||
| | ||
LL | #[target_feature(enable = "sse2")] | ||
| ---------------------------------- `#[target_feature]` added here | ||
... | ||
LL | let foo: fn() = foo; | ||
| ---- ^^^ cannot coerce functions with `#[target_feature]` to safe function pointers | ||
| | | ||
| expected due to this | ||
| | ||
= note: expected fn pointer `fn()` | ||
found fn item `fn() {foo}` | ||
= note: functions with `#[target_feature]` can only be coerced to `unsafe` function pointers | ||
|
||
error: aborting due to previous error | ||
|
||
For more information about this error, try `rustc --explain E0308`. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,47 @@ | ||
// only-x86_64 | ||
|
||
#![feature(target_feature_11)] | ||
|
||
#[target_feature(enable = "sse2")] | ||
const fn sse2() {} | ||
|
||
#[target_feature(enable = "avx")] | ||
#[target_feature(enable = "bmi2")] | ||
fn avx_bmi2() {} | ||
|
||
struct Quux; | ||
|
||
impl Quux { | ||
#[target_feature(enable = "avx")] | ||
#[target_feature(enable = "bmi2")] | ||
fn avx_bmi2(&self) {} | ||
} | ||
|
||
fn foo() { | ||
sse2(); //~ ERROR call to function with `#[target_feature]` is unsafe | ||
avx_bmi2(); //~ ERROR call to function with `#[target_feature]` is unsafe | ||
Quux.avx_bmi2(); //~ ERROR call to function with `#[target_feature]` is unsafe | ||
} | ||
|
||
#[target_feature(enable = "sse2")] | ||
fn bar() { | ||
avx_bmi2(); //~ ERROR call to function with `#[target_feature]` is unsafe | ||
Quux.avx_bmi2(); //~ ERROR call to function with `#[target_feature]` is unsafe | ||
} | ||
|
||
#[target_feature(enable = "avx")] | ||
fn baz() { | ||
sse2(); //~ ERROR call to function with `#[target_feature]` is unsafe | ||
avx_bmi2(); //~ ERROR call to function with `#[target_feature]` is unsafe | ||
Quux.avx_bmi2(); //~ ERROR call to function with `#[target_feature]` is unsafe | ||
} | ||
|
||
#[target_feature(enable = "avx")] | ||
#[target_feature(enable = "bmi2")] | ||
fn qux() { | ||
sse2(); //~ ERROR call to function with `#[target_feature]` is unsafe | ||
} | ||
|
||
const name: () = sse2(); //~ ERROR call to function with `#[target_feature]` is unsafe | ||
|
||
fn main() {} |
83 changes: 83 additions & 0 deletions
83
src/test/ui/rfcs/rfc-2396-target_feature-11/safe-calls.stderr
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,83 @@ | ||
error[E0133]: call to function with `#[target_feature]` is unsafe and requires unsafe function or block | ||
--> $DIR/safe-calls.rs:21:5 | ||
| | ||
LL | sse2(); | ||
| ^^^^^^ call to function with `#[target_feature]` | ||
| | ||
= note: can only be called if the required target features are available | ||
|
||
error[E0133]: call to function with `#[target_feature]` is unsafe and requires unsafe function or block | ||
--> $DIR/safe-calls.rs:22:5 | ||
| | ||
LL | avx_bmi2(); | ||
| ^^^^^^^^^^ call to function with `#[target_feature]` | ||
| | ||
= note: can only be called if the required target features are available | ||
|
||
error[E0133]: call to function with `#[target_feature]` is unsafe and requires unsafe function or block | ||
--> $DIR/safe-calls.rs:23:5 | ||
| | ||
LL | Quux.avx_bmi2(); | ||
| ^^^^^^^^^^^^^^^ call to function with `#[target_feature]` | ||
| | ||
= note: can only be called if the required target features are available | ||
|
||
error[E0133]: call to function with `#[target_feature]` is unsafe and requires unsafe function or block | ||
--> $DIR/safe-calls.rs:28:5 | ||
| | ||
LL | avx_bmi2(); | ||
| ^^^^^^^^^^ call to function with `#[target_feature]` | ||
| | ||
= note: can only be called if the required target features are available | ||
|
||
error[E0133]: call to function with `#[target_feature]` is unsafe and requires unsafe function or block | ||
--> $DIR/safe-calls.rs:29:5 | ||
| | ||
LL | Quux.avx_bmi2(); | ||
| ^^^^^^^^^^^^^^^ call to function with `#[target_feature]` | ||
| | ||
= note: can only be called if the required target features are available | ||
|
||
error[E0133]: call to function with `#[target_feature]` is unsafe and requires unsafe function or block | ||
--> $DIR/safe-calls.rs:34:5 | ||
| | ||
LL | sse2(); | ||
| ^^^^^^ call to function with `#[target_feature]` | ||
| | ||
= note: can only be called if the required target features are available | ||
|
||
error[E0133]: call to function with `#[target_feature]` is unsafe and requires unsafe function or block | ||
--> $DIR/safe-calls.rs:35:5 | ||
| | ||
LL | avx_bmi2(); | ||
| ^^^^^^^^^^ call to function with `#[target_feature]` | ||
| | ||
= note: can only be called if the required target features are available | ||
|
||
error[E0133]: call to function with `#[target_feature]` is unsafe and requires unsafe function or block | ||
--> $DIR/safe-calls.rs:36:5 | ||
| | ||
LL | Quux.avx_bmi2(); | ||
| ^^^^^^^^^^^^^^^ call to function with `#[target_feature]` | ||
| | ||
= note: can only be called if the required target features are available | ||
|
||
error[E0133]: call to function with `#[target_feature]` is unsafe and requires unsafe function or block | ||
--> $DIR/safe-calls.rs:42:5 | ||
| | ||
LL | sse2(); | ||
| ^^^^^^ call to function with `#[target_feature]` | ||
| | ||
= note: can only be called if the required target features are available | ||
|
||
error[E0133]: call to function with `#[target_feature]` is unsafe and requires unsafe function or block | ||
--> $DIR/safe-calls.rs:45:18 | ||
| | ||
LL | const name: () = sse2(); | ||
| ^^^^^^ call to function with `#[target_feature]` | ||
| | ||
= note: can only be called if the required target features are available | ||
|
||
error: aborting due to 10 previous errors | ||
|
||
For more information about this error, try `rustc --explain E0133`. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
// only-x86_64 | ||
|
||
#![feature(target_feature_11)] | ||
|
||
trait Foo { | ||
fn foo(&self); | ||
unsafe fn unsf_foo(&self); | ||
} | ||
|
||
struct Bar; | ||
|
||
impl Foo for Bar { | ||
#[target_feature(enable = "sse2")] | ||
//~^ ERROR cannot be applied to safe trait method | ||
fn foo(&self) {} | ||
|
||
#[target_feature(enable = "sse2")] | ||
unsafe fn unsf_foo(&self) {} | ||
} | ||
|
||
fn main() {} |
11 changes: 11 additions & 0 deletions
11
src/test/ui/rfcs/rfc-2396-target_feature-11/trait-impl.stderr
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
error: `#[target_feature(..)]` cannot be applied to safe trait method | ||
--> $DIR/trait-impl.rs:13:5 | ||
| | ||
LL | #[target_feature(enable = "sse2")] | ||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot be applied to safe trait method | ||
LL | | ||
LL | fn foo(&self) {} | ||
| ---------------- not an `unsafe` function | ||
|
||
error: aborting due to previous error | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters