1
Fork 0

Rollup merge of #96617 - ken-matsui:fix-incorrect-syntax-suggestion-with-pub-async-fn, r=cjgillot

Fix incorrect syntax suggestion with `pub async fn`

This PR closes: https://github.com/rust-lang/rust/issues/96555
This commit is contained in:
Matthias Krüger 2022-05-08 21:31:16 +02:00 committed by GitHub
commit cdaa5c03c9
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 104 additions and 9 deletions

View file

@ -1085,18 +1085,28 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> {
self.in_progress_typeck_results.map(|t| t.borrow()) self.in_progress_typeck_results.map(|t| t.borrow())
&& let ty = typeck_results.expr_ty_adjusted(base) && let ty = typeck_results.expr_ty_adjusted(base)
&& let ty::FnDef(def_id, _substs) = ty.kind() && let ty::FnDef(def_id, _substs) = ty.kind()
&& let Some(hir::Node::Item(hir::Item { span, ident, .. })) = && let Some(hir::Node::Item(hir::Item { ident, span, vis_span, .. })) =
hir.get_if_local(*def_id) hir.get_if_local(*def_id)
{ {
err.span_suggestion_verbose( let msg = format!(
span.shrink_to_lo(), "alternatively, consider making `fn {}` asynchronous",
&format!( ident
"alternatively, consider making `fn {}` asynchronous",
ident
),
"async ".to_string(),
Applicability::MaybeIncorrect,
); );
if vis_span.is_empty() {
err.span_suggestion_verbose(
span.shrink_to_lo(),
&msg,
"async ".to_string(),
Applicability::MaybeIncorrect,
);
} else {
err.span_suggestion_verbose(
vis_span.shrink_to_hi(),
&msg,
" async".to_string(),
Applicability::MaybeIncorrect,
);
}
} }
} }
} }

View file

@ -0,0 +1,19 @@
// edition:2018
async fn f() {
m::f1().await; //~ ERROR `()` is not a future
m::f2().await; //~ ERROR `()` is not a future
m::f3().await; //~ ERROR `()` is not a future
}
mod m {
pub fn f1() {}
pub(crate) fn f2() {}
pub
fn
f3() {}
}
fn main() {}

View file

@ -0,0 +1,66 @@
error[E0277]: `()` is not a future
--> $DIR/issue-96555.rs:4:12
|
LL | m::f1().await;
| -------^^^^^^ `()` is not a future
| |
| this call returns `()`
|
= help: the trait `Future` is not implemented for `()`
= note: () must be a future or must implement `IntoFuture` to be awaited
= note: required because of the requirements on the impl of `IntoFuture` for `()`
help: remove the `.await`
|
LL - m::f1().await;
LL + m::f1();
|
help: alternatively, consider making `fn f1` asynchronous
|
LL | pub async fn f1() {}
| +++++
error[E0277]: `()` is not a future
--> $DIR/issue-96555.rs:5:12
|
LL | m::f2().await;
| -------^^^^^^ `()` is not a future
| |
| this call returns `()`
|
= help: the trait `Future` is not implemented for `()`
= note: () must be a future or must implement `IntoFuture` to be awaited
= note: required because of the requirements on the impl of `IntoFuture` for `()`
help: remove the `.await`
|
LL - m::f2().await;
LL + m::f2();
|
help: alternatively, consider making `fn f2` asynchronous
|
LL | pub(crate) async fn f2() {}
| +++++
error[E0277]: `()` is not a future
--> $DIR/issue-96555.rs:6:12
|
LL | m::f3().await;
| -------^^^^^^ `()` is not a future
| |
| this call returns `()`
|
= help: the trait `Future` is not implemented for `()`
= note: () must be a future or must implement `IntoFuture` to be awaited
= note: required because of the requirements on the impl of `IntoFuture` for `()`
help: remove the `.await`
|
LL - m::f3().await;
LL + m::f3();
|
help: alternatively, consider making `fn f3` asynchronous
|
LL | pub async
| +++++
error: aborting due to 3 previous errors
For more information about this error, try `rustc --explain E0277`.