forked from rust-lang/rust
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Rollup merge of rust-lang#73306 - calebzulawski:target-feature-11-fn-…
…trait-soundness, r=nikomatsakis Don't implement Fn* traits for #[target_feature] functions Closes rust-lang#72012.
- Loading branch information
Showing
4 changed files
with
148 additions
and
1 deletion.
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
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,34 @@ | ||
// only-x86_64 | ||
|
||
#![feature(target_feature_11)] | ||
|
||
#[target_feature(enable = "avx")] | ||
fn foo() {} | ||
|
||
#[target_feature(enable = "avx")] | ||
unsafe fn foo_unsafe() {} | ||
|
||
fn call(f: impl Fn()) { | ||
f() | ||
} | ||
|
||
fn call_mut(f: impl FnMut()) { | ||
f() | ||
} | ||
|
||
fn call_once(f: impl FnOnce()) { | ||
f() | ||
} | ||
|
||
fn main() { | ||
call(foo); //~ ERROR expected a `std::ops::Fn<()>` closure, found `fn() {foo}` | ||
call_mut(foo); //~ ERROR expected a `std::ops::FnMut<()>` closure, found `fn() {foo}` | ||
call_once(foo); //~ ERROR expected a `std::ops::FnOnce<()>` closure, found `fn() {foo}` | ||
|
||
call(foo_unsafe); | ||
//~^ ERROR expected a `std::ops::Fn<()>` closure, found `unsafe fn() {foo_unsafe}` | ||
call_mut(foo_unsafe); | ||
//~^ ERROR expected a `std::ops::FnMut<()>` closure, found `unsafe fn() {foo_unsafe}` | ||
call_once(foo_unsafe); | ||
//~^ ERROR expected a `std::ops::FnOnce<()>` closure, found `unsafe fn() {foo_unsafe}` | ||
} |
81 changes: 81 additions & 0 deletions
81
src/test/ui/rfcs/rfc-2396-target_feature-11/fn-traits.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,81 @@ | ||
error[E0277]: expected a `std::ops::Fn<()>` closure, found `fn() {foo}` | ||
--> $DIR/fn-traits.rs:24:10 | ||
| | ||
LL | fn call(f: impl Fn()) { | ||
| ---- required by this bound in `call` | ||
... | ||
LL | call(foo); | ||
| ^^^ expected an `Fn<()>` closure, found `fn() {foo}` | ||
| | ||
= help: the trait `std::ops::Fn<()>` is not implemented for `fn() {foo}` | ||
= note: wrap the `fn() {foo}` in a closure with no arguments: `|| { /* code */ } | ||
= note: `#[target_feature]` functions do not implement the `Fn` traits | ||
|
||
error[E0277]: expected a `std::ops::FnMut<()>` closure, found `fn() {foo}` | ||
--> $DIR/fn-traits.rs:25:14 | ||
| | ||
LL | fn call_mut(f: impl FnMut()) { | ||
| ------- required by this bound in `call_mut` | ||
... | ||
LL | call_mut(foo); | ||
| ^^^ expected an `FnMut<()>` closure, found `fn() {foo}` | ||
| | ||
= help: the trait `std::ops::FnMut<()>` is not implemented for `fn() {foo}` | ||
= note: wrap the `fn() {foo}` in a closure with no arguments: `|| { /* code */ } | ||
= note: `#[target_feature]` functions do not implement the `Fn` traits | ||
|
||
error[E0277]: expected a `std::ops::FnOnce<()>` closure, found `fn() {foo}` | ||
--> $DIR/fn-traits.rs:26:15 | ||
| | ||
LL | fn call_once(f: impl FnOnce()) { | ||
| -------- required by this bound in `call_once` | ||
... | ||
LL | call_once(foo); | ||
| ^^^ expected an `FnOnce<()>` closure, found `fn() {foo}` | ||
| | ||
= help: the trait `std::ops::FnOnce<()>` is not implemented for `fn() {foo}` | ||
= note: wrap the `fn() {foo}` in a closure with no arguments: `|| { /* code */ } | ||
= note: `#[target_feature]` functions do not implement the `Fn` traits | ||
|
||
error[E0277]: expected a `std::ops::Fn<()>` closure, found `unsafe fn() {foo_unsafe}` | ||
--> $DIR/fn-traits.rs:28:10 | ||
| | ||
LL | fn call(f: impl Fn()) { | ||
| ---- required by this bound in `call` | ||
... | ||
LL | call(foo_unsafe); | ||
| ^^^^^^^^^^ expected an `Fn<()>` closure, found `unsafe fn() {foo_unsafe}` | ||
| | ||
= help: the trait `std::ops::Fn<()>` is not implemented for `unsafe fn() {foo_unsafe}` | ||
= note: wrap the `unsafe fn() {foo_unsafe}` in a closure with no arguments: `|| { /* code */ } | ||
= note: `#[target_feature]` functions do not implement the `Fn` traits | ||
|
||
error[E0277]: expected a `std::ops::FnMut<()>` closure, found `unsafe fn() {foo_unsafe}` | ||
--> $DIR/fn-traits.rs:30:14 | ||
| | ||
LL | fn call_mut(f: impl FnMut()) { | ||
| ------- required by this bound in `call_mut` | ||
... | ||
LL | call_mut(foo_unsafe); | ||
| ^^^^^^^^^^ expected an `FnMut<()>` closure, found `unsafe fn() {foo_unsafe}` | ||
| | ||
= help: the trait `std::ops::FnMut<()>` is not implemented for `unsafe fn() {foo_unsafe}` | ||
= note: wrap the `unsafe fn() {foo_unsafe}` in a closure with no arguments: `|| { /* code */ } | ||
= note: `#[target_feature]` functions do not implement the `Fn` traits | ||
|
||
error[E0277]: expected a `std::ops::FnOnce<()>` closure, found `unsafe fn() {foo_unsafe}` | ||
--> $DIR/fn-traits.rs:32:15 | ||
| | ||
LL | fn call_once(f: impl FnOnce()) { | ||
| -------- required by this bound in `call_once` | ||
... | ||
LL | call_once(foo_unsafe); | ||
| ^^^^^^^^^^ expected an `FnOnce<()>` closure, found `unsafe fn() {foo_unsafe}` | ||
| | ||
= help: the trait `std::ops::FnOnce<()>` is not implemented for `unsafe fn() {foo_unsafe}` | ||
= note: wrap the `unsafe fn() {foo_unsafe}` in a closure with no arguments: `|| { /* code */ } | ||
= note: `#[target_feature]` functions do not implement the `Fn` traits | ||
|
||
error: aborting due to 6 previous errors | ||
|
||
For more information about this error, try `rustc --explain E0277`. |