about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMatthias Krüger <matthias.krueger@famsik.de>2024-06-17 15:43:32 +0200
committerGitHub <noreply@github.com>2024-06-17 15:43:32 +0200
commitba26af3e832745bb8be93097df3f93932ff3718c (patch)
tree369182f912df9910e946c6d53028a1c9080f32e0
parent3baa20b783474330adb7ba7b3ddb02ac9facdf49 (diff)
parent2f17535584947abdfa75c8ba7d7e01056790b686 (diff)
downloadrust-ba26af3e832745bb8be93097df3f93932ff3718c.tar.gz
rust-ba26af3e832745bb8be93097df3f93932ff3718c.zip
Rollup merge of #126568 - bvanjoi:fix-126376, r=petrochenkov
mark undetermined if target binding in current ns is not got

Fixes #126376
Fixes #126389

Add a branch to handle more cases...

r? `@petrochenkov`
-rw-r--r--compiler/rustc_resolve/src/ident.rs25
-rw-r--r--tests/crashes/126376.rs14
-rw-r--r--tests/crashes/126389.rs15
-rw-r--r--tests/ui/imports/shadow-glob-module-resolution-3.rs19
-rw-r--r--tests/ui/imports/shadow-glob-module-resolution-3.stderr23
-rw-r--r--tests/ui/imports/shadow-glob-module-resolution-4.rs20
-rw-r--r--tests/ui/imports/shadow-glob-module-resolution-4.stderr23
7 files changed, 101 insertions, 38 deletions
diff --git a/compiler/rustc_resolve/src/ident.rs b/compiler/rustc_resolve/src/ident.rs
index b6a23317dc9..7d531385e21 100644
--- a/compiler/rustc_resolve/src/ident.rs
+++ b/compiler/rustc_resolve/src/ident.rs
@@ -966,7 +966,7 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
         for single_import in &resolution.single_imports {
             let Some(import_vis) = single_import.vis.get() else {
                 // This branch handles a cycle in single imports, which occurs
-                // when we've previously captured the `vis` value during an import
+                // when we've previously **steal** the `vis` value during an import
                 // process.
                 //
                 // For example:
@@ -998,21 +998,28 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
             let Some(module) = single_import.imported_module.get() else {
                 return Err((Undetermined, Weak::No));
             };
-            let ImportKind::Single { source: ident, target, target_bindings, .. } =
-                &single_import.kind
+            let ImportKind::Single { source, target, target_bindings, .. } = &single_import.kind
             else {
                 unreachable!();
             };
-            if (ident != target) && target_bindings.iter().all(|binding| binding.get().is_none()) {
+            if source != target {
                 // This branch allows the binding to be defined or updated later if the target name
-                // can hide the source but these bindings are not obtained.
-                // avoiding module inconsistency between the resolve process and the finalize process.
-                // See more details in #124840
-                return Err((Undetermined, Weak::No));
+                // can hide the source.
+                if target_bindings.iter().all(|binding| binding.get().is_none()) {
+                    // None of the target bindings are available, so we can't determine
+                    // if this binding is correct or not.
+                    // See more details in #124840
+                    return Err((Undetermined, Weak::No));
+                } else if target_bindings[ns].get().is_none() && binding.is_some() {
+                    // `binding.is_some()` avoids the condition where the binding
+                    // truly doesn't exist in this namespace and should return `Err(Determined)`.
+                    return Err((Undetermined, Weak::No));
+                }
             }
+
             match self.resolve_ident_in_module(
                 module,
-                *ident,
+                *source,
                 ns,
                 &single_import.parent_scope,
                 None,
diff --git a/tests/crashes/126376.rs b/tests/crashes/126376.rs
deleted file mode 100644
index 028dde6d438..00000000000
--- a/tests/crashes/126376.rs
+++ /dev/null
@@ -1,14 +0,0 @@
-//@ known-bug: rust-lang/rust#126376
-mod a {
-    pub mod b {
-        pub mod c {
-            pub trait D {}
-        }
-    }
-}
-
-use a::*;
-use e as b;
-use b::c::D as e;
-
-fn e() {}
diff --git a/tests/crashes/126389.rs b/tests/crashes/126389.rs
deleted file mode 100644
index 7aa6ecad9a3..00000000000
--- a/tests/crashes/126389.rs
+++ /dev/null
@@ -1,15 +0,0 @@
-//@ known-bug: rust-lang/rust#126389
-
-mod a {
-    pub mod b {
-        pub mod c {}
-    }
-}
-
-use a::*;
-
-use b::c;
-
-use c as b;
-
-fn c() {}
diff --git a/tests/ui/imports/shadow-glob-module-resolution-3.rs b/tests/ui/imports/shadow-glob-module-resolution-3.rs
new file mode 100644
index 00000000000..f5a43373261
--- /dev/null
+++ b/tests/ui/imports/shadow-glob-module-resolution-3.rs
@@ -0,0 +1,19 @@
+// https://github.com/rust-lang/rust/issues/126389
+
+mod a {
+    pub mod b {
+        pub mod c {}
+    }
+}
+
+use a::*;
+
+use b::c;
+//~^ ERROR: unresolved import `b::c`
+//~| ERROR: cannot determine resolution for the import
+//~| ERROR: cannot determine resolution for the import
+use c as b;
+
+fn c() {}
+
+fn main() { }
diff --git a/tests/ui/imports/shadow-glob-module-resolution-3.stderr b/tests/ui/imports/shadow-glob-module-resolution-3.stderr
new file mode 100644
index 00000000000..ab853c71582
--- /dev/null
+++ b/tests/ui/imports/shadow-glob-module-resolution-3.stderr
@@ -0,0 +1,23 @@
+error: cannot determine resolution for the import
+  --> $DIR/shadow-glob-module-resolution-3.rs:11:5
+   |
+LL | use b::c;
+   |     ^^^^
+
+error: cannot determine resolution for the import
+  --> $DIR/shadow-glob-module-resolution-3.rs:11:5
+   |
+LL | use b::c;
+   |     ^^^^
+   |
+   = note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
+
+error[E0432]: unresolved import `b::c`
+  --> $DIR/shadow-glob-module-resolution-3.rs:11:5
+   |
+LL | use b::c;
+   |     ^^^^
+
+error: aborting due to 3 previous errors
+
+For more information about this error, try `rustc --explain E0432`.
diff --git a/tests/ui/imports/shadow-glob-module-resolution-4.rs b/tests/ui/imports/shadow-glob-module-resolution-4.rs
new file mode 100644
index 00000000000..581cdc185d3
--- /dev/null
+++ b/tests/ui/imports/shadow-glob-module-resolution-4.rs
@@ -0,0 +1,20 @@
+// https://github.com/rust-lang/rust/issues/126376
+
+mod a {
+    pub mod b {
+        pub trait C {}
+    }
+}
+
+use a::*;
+
+use e as b;
+
+use b::C as e;
+//~^ ERROR: unresolved import `b::C`
+//~| ERROR: cannot determine resolution for the import
+//~| ERROR: cannot determine resolution for the import
+
+fn e() {}
+
+fn main() { }
diff --git a/tests/ui/imports/shadow-glob-module-resolution-4.stderr b/tests/ui/imports/shadow-glob-module-resolution-4.stderr
new file mode 100644
index 00000000000..063beb612b1
--- /dev/null
+++ b/tests/ui/imports/shadow-glob-module-resolution-4.stderr
@@ -0,0 +1,23 @@
+error: cannot determine resolution for the import
+  --> $DIR/shadow-glob-module-resolution-4.rs:13:5
+   |
+LL | use b::C as e;
+   |     ^^^^^^^^^
+
+error: cannot determine resolution for the import
+  --> $DIR/shadow-glob-module-resolution-4.rs:13:5
+   |
+LL | use b::C as e;
+   |     ^^^^^^^^^
+   |
+   = note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
+
+error[E0432]: unresolved import `b::C`
+  --> $DIR/shadow-glob-module-resolution-4.rs:13:5
+   |
+LL | use b::C as e;
+   |     ^^^^^^^^^
+
+error: aborting due to 3 previous errors
+
+For more information about this error, try `rustc --explain E0432`.