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:
commit
cdaa5c03c9
3 changed files with 104 additions and 9 deletions
|
@ -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,
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
19
src/test/ui/suggestions/issue-96555.rs
Normal file
19
src/test/ui/suggestions/issue-96555.rs
Normal 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() {}
|
66
src/test/ui/suggestions/issue-96555.stderr
Normal file
66
src/test/ui/suggestions/issue-96555.stderr
Normal 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`.
|
Loading…
Add table
Add a link
Reference in a new issue