Adds a clearer message for when the async keyword is missing from a function
Signed-off-by: Nell Shamrell <nellshamrell@gmail.com>
This commit is contained in:
parent
50fc24d8a1
commit
5e28eb580f
@ -27,6 +27,7 @@ use crate::task::{Context, Poll};
|
|||||||
#[must_use = "futures do nothing unless you `.await` or poll them"]
|
#[must_use = "futures do nothing unless you `.await` or poll them"]
|
||||||
#[stable(feature = "futures_api", since = "1.36.0")]
|
#[stable(feature = "futures_api", since = "1.36.0")]
|
||||||
#[lang = "future_trait"]
|
#[lang = "future_trait"]
|
||||||
|
#[rustc_on_unimplemented(label = "`{Self}` is not a future", message = "`{Self}` is not a future")]
|
||||||
pub trait Future {
|
pub trait Future {
|
||||||
/// The type of value produced on completion.
|
/// The type of value produced on completion.
|
||||||
#[stable(feature = "futures_api", since = "1.36.0")]
|
#[stable(feature = "futures_api", since = "1.36.0")]
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
use std::future::Future;
|
use std::future::Future;
|
||||||
|
|
||||||
fn get_future() -> impl Future<Output = ()> {
|
fn get_future() -> impl Future<Output = ()> {
|
||||||
//~^ ERROR the trait bound `(): std::future::Future` is not satisfied
|
//~^ ERROR `()` is not a future
|
||||||
panic!()
|
panic!()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,12 +1,13 @@
|
|||||||
error[E0277]: the trait bound `(): std::future::Future` is not satisfied
|
error[E0277]: `()` is not a future
|
||||||
--> $DIR/async-error-span.rs:7:20
|
--> $DIR/async-error-span.rs:7:20
|
||||||
|
|
|
|
||||||
LL | fn get_future() -> impl Future<Output = ()> {
|
LL | fn get_future() -> impl Future<Output = ()> {
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^ the trait `std::future::Future` is not implemented for `()`
|
| ^^^^^^^^^^^^^^^^^^^^^^^^ `()` is not a future
|
||||||
LL |
|
LL |
|
||||||
LL | panic!()
|
LL | panic!()
|
||||||
| -------- this returned value is of type `!`
|
| -------- this returned value is of type `!`
|
||||||
|
|
|
|
||||||
|
= help: the trait `std::future::Future` is not implemented for `()`
|
||||||
= note: the return type of a function must have a statically known size
|
= note: the return type of a function must have a statically known size
|
||||||
|
|
||||||
error[E0698]: type inside `async fn` body must be known in this context
|
error[E0698]: type inside `async fn` body must be known in this context
|
||||||
|
@ -6,7 +6,7 @@ async fn fun() {
|
|||||||
//~| error: `.await` is not allowed in a `const`
|
//~| error: `.await` is not allowed in a `const`
|
||||||
//~| error: `loop` is not allowed in a `const`
|
//~| error: `loop` is not allowed in a `const`
|
||||||
//~| error: `.await` is not allowed in a `const`
|
//~| error: `.await` is not allowed in a `const`
|
||||||
//~| error: the trait bound `(): std::future::Future` is not satisfied
|
//~| error: `()` is not a future
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
@ -27,12 +27,13 @@ error[E0744]: `.await` is not allowed in a `const`
|
|||||||
LL | [1; ().await];
|
LL | [1; ().await];
|
||||||
| ^^^^^^^^
|
| ^^^^^^^^
|
||||||
|
|
||||||
error[E0277]: the trait bound `(): std::future::Future` is not satisfied
|
error[E0277]: `()` is not a future
|
||||||
--> $DIR/issue-70594.rs:4:9
|
--> $DIR/issue-70594.rs:4:9
|
||||||
|
|
|
|
||||||
LL | [1; ().await];
|
LL | [1; ().await];
|
||||||
| ^^^^^^^^ the trait `std::future::Future` is not implemented for `()`
|
| ^^^^^^^^ `()` is not a future
|
||||||
|
|
|
|
||||||
|
= help: the trait `std::future::Future` is not implemented for `()`
|
||||||
= note: required by `std::future::Future::poll`
|
= note: required by `std::future::Future::poll`
|
||||||
|
|
||||||
error: aborting due to 5 previous errors
|
error: aborting due to 5 previous errors
|
||||||
|
@ -27,12 +27,13 @@ LL | fn main() {
|
|||||||
LL | (|_| 2333).await;
|
LL | (|_| 2333).await;
|
||||||
| ^^^^^^^^^^^^^^^^ only allowed inside `async` functions and blocks
|
| ^^^^^^^^^^^^^^^^ only allowed inside `async` functions and blocks
|
||||||
|
|
||||||
error[E0277]: the trait bound `[closure@$DIR/issue-62009-1.rs:12:5: 12:15]: std::future::Future` is not satisfied
|
error[E0277]: `[closure@$DIR/issue-62009-1.rs:12:5: 12:15]` is not a future
|
||||||
--> $DIR/issue-62009-1.rs:12:5
|
--> $DIR/issue-62009-1.rs:12:5
|
||||||
|
|
|
|
||||||
LL | (|_| 2333).await;
|
LL | (|_| 2333).await;
|
||||||
| ^^^^^^^^^^^^^^^^ the trait `std::future::Future` is not implemented for `[closure@$DIR/issue-62009-1.rs:12:5: 12:15]`
|
| ^^^^^^^^^^^^^^^^ `[closure@$DIR/issue-62009-1.rs:12:5: 12:15]` is not a future
|
||||||
|
|
|
|
||||||
|
= help: the trait `std::future::Future` is not implemented for `[closure@$DIR/issue-62009-1.rs:12:5: 12:15]`
|
||||||
= note: required by `std::future::Future::poll`
|
= note: required by `std::future::Future::poll`
|
||||||
|
|
||||||
error: aborting due to 4 previous errors
|
error: aborting due to 4 previous errors
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
fn test_ref(x: &u32) -> impl std::future::Future<Output = u32> + '_ {
|
fn test_ref(x: &u32) -> impl std::future::Future<Output = u32> + '_ {
|
||||||
*x //~^ ERROR the trait bound `u32: std::future::Future` is not satisfied
|
*x //~^ ERROR `u32` is not a future
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
@ -4,14 +4,15 @@ error[E0425]: cannot find value `u` in this scope
|
|||||||
LL | let _ = test_ref & u;
|
LL | let _ = test_ref & u;
|
||||||
| ^ not found in this scope
|
| ^ not found in this scope
|
||||||
|
|
||||||
error[E0277]: the trait bound `u32: std::future::Future` is not satisfied
|
error[E0277]: `u32` is not a future
|
||||||
--> $DIR/issues-71798.rs:1:25
|
--> $DIR/issues-71798.rs:1:25
|
||||||
|
|
|
|
||||||
LL | fn test_ref(x: &u32) -> impl std::future::Future<Output = u32> + '_ {
|
LL | fn test_ref(x: &u32) -> impl std::future::Future<Output = u32> + '_ {
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `std::future::Future` is not implemented for `u32`
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `u32` is not a future
|
||||||
LL | *x
|
LL | *x
|
||||||
| -- this returned value is of type `u32`
|
| -- this returned value is of type `u32`
|
||||||
|
|
|
|
||||||
|
= help: the trait `std::future::Future` is not implemented for `u32`
|
||||||
= note: the return type of a function must have a statically known size
|
= note: the return type of a function must have a statically known size
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
error: aborting due to 2 previous errors
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
error[E0277]: the trait bound `fn() -> impl std::future::Future {foo}: std::future::Future` is not satisfied
|
error[E0277]: `fn() -> impl std::future::Future {foo}` is not a future
|
||||||
--> $DIR/async-fn-ctor-passed-as-arg-where-it-should-have-been-called.rs:10:9
|
--> $DIR/async-fn-ctor-passed-as-arg-where-it-should-have-been-called.rs:10:9
|
||||||
|
|
|
|
||||||
LL | async fn foo() {}
|
LL | async fn foo() {}
|
||||||
@ -8,14 +8,15 @@ LL | fn bar(f: impl Future<Output=()>) {}
|
|||||||
| ----------------- required by this bound in `bar`
|
| ----------------- required by this bound in `bar`
|
||||||
...
|
...
|
||||||
LL | bar(foo);
|
LL | bar(foo);
|
||||||
| ^^^ the trait `std::future::Future` is not implemented for `fn() -> impl std::future::Future {foo}`
|
| ^^^ `fn() -> impl std::future::Future {foo}` is not a future
|
||||||
|
|
|
|
||||||
|
= help: the trait `std::future::Future` is not implemented for `fn() -> impl std::future::Future {foo}`
|
||||||
help: use parentheses to call the function
|
help: use parentheses to call the function
|
||||||
|
|
|
|
||||||
LL | bar(foo());
|
LL | bar(foo());
|
||||||
| ^^
|
| ^^
|
||||||
|
|
||||||
error[E0277]: the trait bound `[closure@$DIR/async-fn-ctor-passed-as-arg-where-it-should-have-been-called.rs:11:25: 11:36]: std::future::Future` is not satisfied
|
error[E0277]: `[closure@$DIR/async-fn-ctor-passed-as-arg-where-it-should-have-been-called.rs:11:25: 11:36]` is not a future
|
||||||
--> $DIR/async-fn-ctor-passed-as-arg-where-it-should-have-been-called.rs:12:9
|
--> $DIR/async-fn-ctor-passed-as-arg-where-it-should-have-been-called.rs:12:9
|
||||||
|
|
|
|
||||||
LL | fn bar(f: impl Future<Output=()>) {}
|
LL | fn bar(f: impl Future<Output=()>) {}
|
||||||
@ -24,8 +25,9 @@ LL | fn bar(f: impl Future<Output=()>) {}
|
|||||||
LL | let async_closure = async || ();
|
LL | let async_closure = async || ();
|
||||||
| -------- consider calling this closure
|
| -------- consider calling this closure
|
||||||
LL | bar(async_closure);
|
LL | bar(async_closure);
|
||||||
| ^^^^^^^^^^^^^ the trait `std::future::Future` is not implemented for `[closure@$DIR/async-fn-ctor-passed-as-arg-where-it-should-have-been-called.rs:11:25: 11:36]`
|
| ^^^^^^^^^^^^^ `[closure@$DIR/async-fn-ctor-passed-as-arg-where-it-should-have-been-called.rs:11:25: 11:36]` is not a future
|
||||||
|
|
|
|
||||||
|
= help: the trait `std::future::Future` is not implemented for `[closure@$DIR/async-fn-ctor-passed-as-arg-where-it-should-have-been-called.rs:11:25: 11:36]`
|
||||||
help: use parentheses to call the closure
|
help: use parentheses to call the closure
|
||||||
|
|
|
|
||||||
LL | bar(async_closure());
|
LL | bar(async_closure());
|
||||||
|
Loading…
x
Reference in New Issue
Block a user