Rollup merge of #121044 - compiler-errors:mbe-async-trait-bounds, r=fmease
Support async trait bounds in macros r? fmease This is similar to your work on const trait bounds. This theoretically regresses `impl async $ident:ident` in macros, but I doubt this is occurring in practice.
This commit is contained in:
commit
082b97ad05
16 changed files with 229 additions and 31 deletions
|
@ -3,6 +3,10 @@
|
|||
struct F;
|
||||
|
||||
impl async Fn<()> for F {}
|
||||
//~^ ERROR expected type, found keyword `async`
|
||||
//~^ ERROR `async` trait implementations are unsupported
|
||||
//~| ERROR the precise format of `Fn`-family traits' type parameters is subject to change
|
||||
//~| ERROR manual implementations of `Fn` are experimental
|
||||
//~| ERROR expected a `FnMut()` closure, found `F`
|
||||
//~| ERROR not all trait items implemented, missing: `call`
|
||||
|
||||
fn main() {}
|
||||
|
|
|
@ -1,8 +1,47 @@
|
|||
error: expected type, found keyword `async`
|
||||
error: `async` trait implementations are unsupported
|
||||
--> $DIR/impl-header.rs:5:6
|
||||
|
|
||||
LL | impl async Fn<()> for F {}
|
||||
| ^^^^^ expected type
|
||||
| ^^^^^
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
error[E0658]: the precise format of `Fn`-family traits' type parameters is subject to change
|
||||
--> $DIR/impl-header.rs:5:12
|
||||
|
|
||||
LL | impl async Fn<()> for F {}
|
||||
| ^^^^^^
|
||||
|
|
||||
= note: see issue #29625 <https://github.com/rust-lang/rust/issues/29625> for more information
|
||||
= help: add `#![feature(unboxed_closures)]` to the crate attributes to enable
|
||||
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
|
||||
|
||||
error[E0183]: manual implementations of `Fn` are experimental
|
||||
--> $DIR/impl-header.rs:5:12
|
||||
|
|
||||
LL | impl async Fn<()> for F {}
|
||||
| ^^^^^^ manual implementations of `Fn` are experimental
|
||||
|
|
||||
= help: add `#![feature(unboxed_closures)]` to the crate attributes to enable
|
||||
|
||||
error[E0277]: expected a `FnMut()` closure, found `F`
|
||||
--> $DIR/impl-header.rs:5:23
|
||||
|
|
||||
LL | impl async Fn<()> for F {}
|
||||
| ^ expected an `FnMut()` closure, found `F`
|
||||
|
|
||||
= help: the trait `FnMut<()>` is not implemented for `F`
|
||||
= note: wrap the `F` in a closure with no arguments: `|| { /* code */ }`
|
||||
note: required by a bound in `Fn`
|
||||
--> $SRC_DIR/core/src/ops/function.rs:LL:COL
|
||||
|
||||
error[E0046]: not all trait items implemented, missing: `call`
|
||||
--> $DIR/impl-header.rs:5:1
|
||||
|
|
||||
LL | impl async Fn<()> for F {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^ missing `call` in implementation
|
||||
|
|
||||
= help: implement the missing item: `fn call(&self, _: ()) -> <Self as FnOnce<()>>::Output { todo!() }`
|
||||
|
||||
error: aborting due to 5 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0046, E0183, E0277, E0658.
|
||||
For more information about an error, try `rustc --explain E0046`.
|
||||
|
|
|
@ -0,0 +1,21 @@
|
|||
// Demonstrates and records a theoretical regressions / breaking changes caused by the
|
||||
// introduction of async trait bounds.
|
||||
|
||||
// Setting the edition to 2018 since we don't regress `demo! { dyn async }` in Rust <2018.
|
||||
//@ edition:2018
|
||||
|
||||
macro_rules! demo {
|
||||
($ty:ty) => { compile_error!("ty"); };
|
||||
//~^ ERROR ty
|
||||
//~| ERROR ty
|
||||
(impl $c:ident Trait) => {};
|
||||
(dyn $c:ident Trait) => {};
|
||||
}
|
||||
|
||||
demo! { impl async Trait }
|
||||
//~^ ERROR async closures are unstable
|
||||
|
||||
demo! { dyn async Trait }
|
||||
//~^ ERROR async closures are unstable
|
||||
|
||||
fn main() {}
|
|
@ -0,0 +1,47 @@
|
|||
error: ty
|
||||
--> $DIR/mbe-async-trait-bound-theoretical-regression.rs:8:19
|
||||
|
|
||||
LL | ($ty:ty) => { compile_error!("ty"); };
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
...
|
||||
LL | demo! { impl async Trait }
|
||||
| -------------------------- in this macro invocation
|
||||
|
|
||||
= note: this error originates in the macro `demo` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: ty
|
||||
--> $DIR/mbe-async-trait-bound-theoretical-regression.rs:8:19
|
||||
|
|
||||
LL | ($ty:ty) => { compile_error!("ty"); };
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
...
|
||||
LL | demo! { dyn async Trait }
|
||||
| ------------------------- in this macro invocation
|
||||
|
|
||||
= note: this error originates in the macro `demo` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0658]: async closures are unstable
|
||||
--> $DIR/mbe-async-trait-bound-theoretical-regression.rs:15:14
|
||||
|
|
||||
LL | demo! { impl async Trait }
|
||||
| ^^^^^
|
||||
|
|
||||
= note: see issue #62290 <https://github.com/rust-lang/rust/issues/62290> for more information
|
||||
= help: add `#![feature(async_closure)]` to the crate attributes to enable
|
||||
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
|
||||
= help: to use an async block, remove the `||`: `async {`
|
||||
|
||||
error[E0658]: async closures are unstable
|
||||
--> $DIR/mbe-async-trait-bound-theoretical-regression.rs:18:13
|
||||
|
|
||||
LL | demo! { dyn async Trait }
|
||||
| ^^^^^
|
||||
|
|
||||
= note: see issue #62290 <https://github.com/rust-lang/rust/issues/62290> for more information
|
||||
= help: add `#![feature(async_closure)]` to the crate attributes to enable
|
||||
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
|
||||
= help: to use an async block, remove the `||`: `async {`
|
||||
|
||||
error: aborting due to 4 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0658`.
|
12
tests/ui/async-await/async-fn/trait-bounds-in-macro.rs
Normal file
12
tests/ui/async-await/async-fn/trait-bounds-in-macro.rs
Normal file
|
@ -0,0 +1,12 @@
|
|||
//@ edition: 2021
|
||||
|
||||
macro_rules! x {
|
||||
($x:item) => {}
|
||||
}
|
||||
|
||||
x! {
|
||||
async fn foo() -> impl async Fn() { }
|
||||
//~^ ERROR async closures are unstable
|
||||
}
|
||||
|
||||
fn main() {}
|
14
tests/ui/async-await/async-fn/trait-bounds-in-macro.stderr
Normal file
14
tests/ui/async-await/async-fn/trait-bounds-in-macro.stderr
Normal file
|
@ -0,0 +1,14 @@
|
|||
error[E0658]: async closures are unstable
|
||||
--> $DIR/trait-bounds-in-macro.rs:8:28
|
||||
|
|
||||
LL | async fn foo() -> impl async Fn() { }
|
||||
| ^^^^^
|
||||
|
|
||||
= note: see issue #62290 <https://github.com/rust-lang/rust/issues/62290> for more information
|
||||
= help: add `#![feature(async_closure)]` to the crate attributes to enable
|
||||
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
|
||||
= help: to use an async block, remove the `||`: `async {`
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0658`.
|
Loading…
Add table
Add a link
Reference in a new issue