feat: impl better help for `.poll()` not found on `impl Future`

This commit is contained in:
Ezra Shaw 2023-03-04 21:08:15 +13:00
parent 0fbfc3e769
commit aaaffa9a3e
No known key found for this signature in database
GPG Key ID: 67ABF16FB0ECD870
3 changed files with 34 additions and 0 deletions

View File

@ -348,6 +348,16 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
err.downgrade_to_delayed_bug();
}
if tcx.ty_is_opaque_future(rcvr_ty) && item_name.name == sym::poll {
err.help(&format!(
"method `poll` found on `Pin<&mut {ty_str}>`, \
see documentation for `std::pin::Pin`"
));
err.help("self type must be pinned to call `Future::poll`, \
see https://rust-lang.github.io/async-book/04_pinning/01_chapter.html#pinning-in-practice"
);
}
if let Mode::MethodCall = mode && let SelfSource::MethodCall(cal) = source {
self.suggest_await_before_method(
&mut err, item_name, rcvr_ty, cal, span, expected.only_has_type(self),

View File

@ -0,0 +1,12 @@
// edition: 2021
use std::future::Future;
fn foo() -> impl Future<Output=()> {
async { }
}
fn main() {
let fut = foo();
fut.poll();
//~^ ERROR no method named `poll` found for opaque type `impl Future<Output = ()>` in the current scope [E0599]
}

View File

@ -0,0 +1,12 @@
error[E0599]: no method named `poll` found for opaque type `impl Future<Output = ()>` in the current scope
--> $DIR/issue-108572.rs:10:9
|
LL | fut.poll();
| ^^^^ method not found in `impl Future<Output = ()>`
|
= help: method `poll` found on `Pin<&mut impl Future<Output = ()>>`, see documentation for `std::pin::Pin`
= help: self type must be pinned to call `Future::poll`, see https://rust-lang.github.io/async-book/04_pinning/01_chapter.html#pinning-in-practice
error: aborting due to previous error
For more information about this error, try `rustc --explain E0599`.