about summary refs log tree commit diff
diff options
context:
space:
mode:
authoryukang <moorekang@gmail.com>2024-02-17 17:54:06 +0800
committeryukang <moorekang@gmail.com>2024-02-25 11:29:13 +0800
commit3bcef2dc1b145ebe32d317e331579fd4c20e0bd8 (patch)
treec99235cf9b907ccba6cac89836fd076e5595d80d
parent2ae1bb671183a072b54ed8ed39abfcd72990a3e7 (diff)
downloadrust-3bcef2dc1b145ebe32d317e331579fd4c20e0bd8.tar.gz
rust-3bcef2dc1b145ebe32d317e331579fd4c20e0bd8.zip
Fix issues in suggesting importing extern crate paths
-rw-r--r--compiler/rustc_resolve/src/diagnostics.rs12
-rw-r--r--tests/ui/imports/auxiliary/import-alias-issue-121168-extern.rs1
-rw-r--r--tests/ui/imports/import-alias-issue-121168.edition2015.stderr14
-rw-r--r--tests/ui/imports/import-alias-issue-121168.edition2018.stderr16
-rw-r--r--tests/ui/imports/import-alias-issue-121168.edition2021.stderr16
-rw-r--r--tests/ui/imports/import-alias-issue-121168.rs14
6 files changed, 72 insertions, 1 deletions
diff --git a/compiler/rustc_resolve/src/diagnostics.rs b/compiler/rustc_resolve/src/diagnostics.rs
index d64a3b43aad..0b545ce6a89 100644
--- a/compiler/rustc_resolve/src/diagnostics.rs
+++ b/compiler/rustc_resolve/src/diagnostics.rs
@@ -1290,10 +1290,20 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
                     let mut path_segments = path_segments.clone();
                     path_segments.push(ast::PathSegment::from_ident(ident));
 
+                    let alias_import = if let NameBindingKind::Import { import, .. } =
+                        name_binding.kind
+                        && let ImportKind::ExternCrate { source: Some(_), .. } = import.kind
+                        && import.parent_scope.expansion == parent_scope.expansion
+                    {
+                        true
+                    } else {
+                        false
+                    };
+
                     let is_extern_crate_that_also_appears_in_prelude =
                         name_binding.is_extern_crate() && lookup_ident.span.at_least_rust_2018();
 
-                    if !is_extern_crate_that_also_appears_in_prelude {
+                    if !is_extern_crate_that_also_appears_in_prelude || alias_import {
                         // add the module to the lookup
                         if seen_modules.insert(module.def_id()) {
                             if via_import { &mut worklist_via_import } else { &mut worklist }
diff --git a/tests/ui/imports/auxiliary/import-alias-issue-121168-extern.rs b/tests/ui/imports/auxiliary/import-alias-issue-121168-extern.rs
new file mode 100644
index 00000000000..a665eb8eb96
--- /dev/null
+++ b/tests/ui/imports/auxiliary/import-alias-issue-121168-extern.rs
@@ -0,0 +1 @@
+pub struct Foo<T>(pub core::ptr::NonNull<T>);
diff --git a/tests/ui/imports/import-alias-issue-121168.edition2015.stderr b/tests/ui/imports/import-alias-issue-121168.edition2015.stderr
new file mode 100644
index 00000000000..47001fc1a52
--- /dev/null
+++ b/tests/ui/imports/import-alias-issue-121168.edition2015.stderr
@@ -0,0 +1,14 @@
+error[E0412]: cannot find type `Foo` in this scope
+  --> $DIR/import-alias-issue-121168.rs:11:12
+   |
+LL |     let _: Foo<i32> = todo!();
+   |            ^^^ not found in this scope
+   |
+help: consider importing this struct
+   |
+LL + use nice_crate_name::Foo;
+   |
+
+error: aborting due to 1 previous error
+
+For more information about this error, try `rustc --explain E0412`.
diff --git a/tests/ui/imports/import-alias-issue-121168.edition2018.stderr b/tests/ui/imports/import-alias-issue-121168.edition2018.stderr
new file mode 100644
index 00000000000..b61a0e3edd5
--- /dev/null
+++ b/tests/ui/imports/import-alias-issue-121168.edition2018.stderr
@@ -0,0 +1,16 @@
+error[E0412]: cannot find type `Foo` in this scope
+  --> $DIR/import-alias-issue-121168.rs:11:12
+   |
+LL |     let _: Foo<i32> = todo!();
+   |            ^^^ not found in this scope
+   |
+help: consider importing one of these items
+   |
+LL + use crate::nice_crate_name::Foo;
+   |
+LL + use import_alias_issue_121168_extern::Foo;
+   |
+
+error: aborting due to 1 previous error
+
+For more information about this error, try `rustc --explain E0412`.
diff --git a/tests/ui/imports/import-alias-issue-121168.edition2021.stderr b/tests/ui/imports/import-alias-issue-121168.edition2021.stderr
new file mode 100644
index 00000000000..b61a0e3edd5
--- /dev/null
+++ b/tests/ui/imports/import-alias-issue-121168.edition2021.stderr
@@ -0,0 +1,16 @@
+error[E0412]: cannot find type `Foo` in this scope
+  --> $DIR/import-alias-issue-121168.rs:11:12
+   |
+LL |     let _: Foo<i32> = todo!();
+   |            ^^^ not found in this scope
+   |
+help: consider importing one of these items
+   |
+LL + use crate::nice_crate_name::Foo;
+   |
+LL + use import_alias_issue_121168_extern::Foo;
+   |
+
+error: aborting due to 1 previous error
+
+For more information about this error, try `rustc --explain E0412`.
diff --git a/tests/ui/imports/import-alias-issue-121168.rs b/tests/ui/imports/import-alias-issue-121168.rs
new file mode 100644
index 00000000000..826a6765b03
--- /dev/null
+++ b/tests/ui/imports/import-alias-issue-121168.rs
@@ -0,0 +1,14 @@
+//@ revisions: edition2015 edition2018 edition2021
+//@ [edition2015] edition:2015
+//@ [edition2018] edition:2018
+//@ [edition2021] edition:2021
+//@ compile-flags: --extern import_alias_issue_121168_extern
+//@ aux-build: import-alias-issue-121168-extern.rs
+
+extern crate import_alias_issue_121168_extern as nice_crate_name;
+
+fn use_foo_from_another_crate_without_importing_it_first() {
+    let _: Foo<i32> = todo!(); //~ ERROR cannot find type `Foo` in this scope
+}
+
+fn main() {}