Skip to content

Commit

Permalink
feat: impl better help for .poll() not found on impl Future
Browse files Browse the repository at this point in the history
  • Loading branch information
Ezrashaw committed Mar 4, 2023
1 parent 0fbfc3e commit aaaffa9
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 0 deletions.
10 changes: 10 additions & 0 deletions compiler/rustc_hir_typeck/src/method/suggest.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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),
Expand Down
12 changes: 12 additions & 0 deletions tests/ui/async-await/issue-108572.rs
Original file line number Diff line number Diff line change
@@ -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]
}
12 changes: 12 additions & 0 deletions tests/ui/async-await/issue-108572.stderr
Original file line number Diff line number Diff line change
@@ -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`.

0 comments on commit aaaffa9

Please sign in to comment.