From acb9f9ba385a9207a5f60448a1c374f2eceff13d Mon Sep 17 00:00:00 2001
From: Takayuki Maeda <takoyaki0316@gmail.com>
Date: Wed, 3 Nov 2021 01:44:01 +0900
Subject: [PATCH 1/2] add a suggestion about undeclared `alloc` module

---
 compiler/rustc_resolve/src/diagnostics.rs     |  4 +++
 compiler/rustc_resolve/src/lib.rs             | 28 +++++++++++++------
 .../ui/suggestions/undeclared-module-alloc.rs |  5 ++++
 .../undeclared-module-alloc.stderr            | 11 ++++++++
 4 files changed, 39 insertions(+), 9 deletions(-)
 create mode 100644 src/test/ui/suggestions/undeclared-module-alloc.rs
 create mode 100644 src/test/ui/suggestions/undeclared-module-alloc.stderr

diff --git a/compiler/rustc_resolve/src/diagnostics.rs b/compiler/rustc_resolve/src/diagnostics.rs
index 163acebcceacf..ff0d76e94fdf5 100644
--- a/compiler/rustc_resolve/src/diagnostics.rs
+++ b/compiler/rustc_resolve/src/diagnostics.rs
@@ -420,6 +420,10 @@ impl<'a> Resolver<'a> {
                 err.span_label(span, label);
 
                 if let Some((suggestions, msg, applicability)) = suggestion {
+                    if suggestions.is_empty() {
+                        err.help(&msg);
+                        return err;
+                    }
                     err.multipart_suggestion(&msg, suggestions, applicability);
                 }
 
diff --git a/compiler/rustc_resolve/src/lib.rs b/compiler/rustc_resolve/src/lib.rs
index 23eb2d1aebb7c..55de096d1a458 100644
--- a/compiler/rustc_resolve/src/lib.rs
+++ b/compiler/rustc_resolve/src/lib.rs
@@ -2523,19 +2523,29 @@ impl<'a> Resolver<'a> {
                         } else {
                             (
                                 format!("use of undeclared crate or module `{}`", ident),
-                                self.find_similarly_named_module_or_crate(
-                                    ident.name,
-                                    &parent_scope.module,
-                                )
-                                .map(|sugg| {
-                                    (
-                                        vec![(ident.span, sugg.to_string())],
+                                if ident.name == sym::alloc {
+                                    Some((
+                                        vec![],
                                         String::from(
-                                            "there is a crate or module with a similar name",
+                                            "add `extern crate alloc` to use the builtin `alloc` module",
                                         ),
                                         Applicability::MaybeIncorrect,
+                                    ))
+                                } else {
+                                    self.find_similarly_named_module_or_crate(
+                                        ident.name,
+                                        &parent_scope.module,
                                     )
-                                }),
+                                    .map(|sugg| {
+                                        (
+                                            vec![(ident.span, sugg.to_string())],
+                                            String::from(
+                                                "there is a crate or module with a similar name",
+                                            ),
+                                            Applicability::MaybeIncorrect,
+                                        )
+                                    })
+                                },
                             )
                         }
                     } else {
diff --git a/src/test/ui/suggestions/undeclared-module-alloc.rs b/src/test/ui/suggestions/undeclared-module-alloc.rs
new file mode 100644
index 0000000000000..1defa1cef2863
--- /dev/null
+++ b/src/test/ui/suggestions/undeclared-module-alloc.rs
@@ -0,0 +1,5 @@
+// edition:2018
+
+use alloc::rc::Rc; //~ ERROR failed to resolve: use of undeclared crate or module `alloc`
+
+fn main() {}
diff --git a/src/test/ui/suggestions/undeclared-module-alloc.stderr b/src/test/ui/suggestions/undeclared-module-alloc.stderr
new file mode 100644
index 0000000000000..4da0619af9879
--- /dev/null
+++ b/src/test/ui/suggestions/undeclared-module-alloc.stderr
@@ -0,0 +1,11 @@
+error[E0433]: failed to resolve: use of undeclared crate or module `alloc`
+  --> $DIR/undeclared-module-alloc.rs:3:5
+   |
+LL | use alloc::rc::Rc;
+   |     ^^^^^ use of undeclared crate or module `alloc`
+   |
+   = help: add `extern crate alloc` to use the builtin `alloc` module
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0433`.

From 6c1e194534ab91ecdb3aa953089964c364b6b2e2 Mon Sep 17 00:00:00 2001
From: Takayuki Maeda <takoyaki0316@gmail.com>
Date: Wed, 3 Nov 2021 13:53:57 +0900
Subject: [PATCH 2/2] fix message

---
 compiler/rustc_resolve/src/lib.rs                      | 2 +-
 src/test/ui/suggestions/undeclared-module-alloc.stderr | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/compiler/rustc_resolve/src/lib.rs b/compiler/rustc_resolve/src/lib.rs
index 55de096d1a458..5f3620b247e26 100644
--- a/compiler/rustc_resolve/src/lib.rs
+++ b/compiler/rustc_resolve/src/lib.rs
@@ -2527,7 +2527,7 @@ impl<'a> Resolver<'a> {
                                     Some((
                                         vec![],
                                         String::from(
-                                            "add `extern crate alloc` to use the builtin `alloc` module",
+                                            "add `extern crate alloc` to use the `alloc` crate",
                                         ),
                                         Applicability::MaybeIncorrect,
                                     ))
diff --git a/src/test/ui/suggestions/undeclared-module-alloc.stderr b/src/test/ui/suggestions/undeclared-module-alloc.stderr
index 4da0619af9879..39169dfa9f777 100644
--- a/src/test/ui/suggestions/undeclared-module-alloc.stderr
+++ b/src/test/ui/suggestions/undeclared-module-alloc.stderr
@@ -4,7 +4,7 @@ error[E0433]: failed to resolve: use of undeclared crate or module `alloc`
 LL | use alloc::rc::Rc;
    |     ^^^^^ use of undeclared crate or module `alloc`
    |
-   = help: add `extern crate alloc` to use the builtin `alloc` module
+   = help: add `extern crate alloc` to use the `alloc` crate
 
 error: aborting due to previous error