about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMatthias Krüger <matthias.krueger@famsik.de>2022-05-08 21:31:16 +0200
committerGitHub <noreply@github.com>2022-05-08 21:31:16 +0200
commitcdaa5c03c92e172d7777347dc2f55432ac45b4f7 (patch)
tree25b99b9035aab0f273f7460c8d34d0d1fcd05cfa
parent83322c557fcaa9b6750955ceb6b9591df6c53a65 (diff)
parent8b89a1280c929f7aaf11386f8f1a9ecdbef2f539 (diff)
downloadrust-cdaa5c03c92e172d7777347dc2f55432ac45b4f7.tar.gz
rust-cdaa5c03c92e172d7777347dc2f55432ac45b4f7.zip
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
-rw-r--r--compiler/rustc_trait_selection/src/traits/error_reporting/suggestions.rs28
-rw-r--r--src/test/ui/suggestions/issue-96555.rs19
-rw-r--r--src/test/ui/suggestions/issue-96555.stderr66
3 files changed, 104 insertions, 9 deletions
diff --git a/compiler/rustc_trait_selection/src/traits/error_reporting/suggestions.rs b/compiler/rustc_trait_selection/src/traits/error_reporting/suggestions.rs
index bfb8ce6f105..d20ba99ebc9 100644
--- a/compiler/rustc_trait_selection/src/traits/error_reporting/suggestions.rs
+++ b/compiler/rustc_trait_selection/src/traits/error_reporting/suggestions.rs
@@ -1085,18 +1085,28 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> {
                             self.in_progress_typeck_results.map(|t| t.borrow())
                             && let ty = typeck_results.expr_ty_adjusted(base)
                             && 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)
                         {
-                            err.span_suggestion_verbose(
-                                span.shrink_to_lo(),
-                                &format!(
-                                    "alternatively, consider making `fn {}` asynchronous",
-                                    ident
-                                ),
-                                "async ".to_string(),
-                                Applicability::MaybeIncorrect,
+                            let msg = format!(
+                                "alternatively, consider making `fn {}` asynchronous",
+                                ident
                             );
+                            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,
+                                );
+                            }
                         }
                     }
                 }
diff --git a/src/test/ui/suggestions/issue-96555.rs b/src/test/ui/suggestions/issue-96555.rs
new file mode 100644
index 00000000000..9f0a047c6e9
--- /dev/null
+++ b/src/test/ui/suggestions/issue-96555.rs
@@ -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() {}
diff --git a/src/test/ui/suggestions/issue-96555.stderr b/src/test/ui/suggestions/issue-96555.stderr
new file mode 100644
index 00000000000..6d3b8844d95
--- /dev/null
+++ b/src/test/ui/suggestions/issue-96555.stderr
@@ -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`.