about summary refs log tree commit diff
path: root/compiler/rustc_resolve/src
diff options
context:
space:
mode:
authorbohan <bohan-zhang@foxmail.com>2023-06-14 00:55:36 +0800
committerbohan <bohan-zhang@foxmail.com>2023-06-14 01:38:35 +0800
commitf7330eb752cdd83a9b944d1d64a092c7d2454c17 (patch)
tree474d4ef8c1c9e0a2bb395aaaf5074b9a904ce665 /compiler/rustc_resolve/src
parent4bd4e2ea824f4f458cae8917047ebb6b88853fe6 (diff)
downloadrust-f7330eb752cdd83a9b944d1d64a092c7d2454c17.tar.gz
rust-f7330eb752cdd83a9b944d1d64a092c7d2454c17.zip
fix(resolve): update `shadowed_glob` more precision
Diffstat (limited to 'compiler/rustc_resolve/src')
-rw-r--r--compiler/rustc_resolve/src/imports.rs16
1 files changed, 15 insertions, 1 deletions
diff --git a/compiler/rustc_resolve/src/imports.rs b/compiler/rustc_resolve/src/imports.rs
index 7f944fb5745..47d8e5993fd 100644
--- a/compiler/rustc_resolve/src/imports.rs
+++ b/compiler/rustc_resolve/src/imports.rs
@@ -338,7 +338,21 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
                         } else {
                             resolution.binding = Some(nonglob_binding);
                         }
-                        resolution.shadowed_glob = Some(glob_binding);
+
+                        if let Some(old_binding) = resolution.shadowed_glob {
+                            assert!(old_binding.is_glob_import());
+                            if glob_binding.res() != old_binding.res() {
+                                resolution.shadowed_glob = Some(this.ambiguity(
+                                    AmbiguityKind::GlobVsGlob,
+                                    old_binding,
+                                    glob_binding,
+                                ));
+                            } else if !old_binding.vis.is_at_least(binding.vis, this.tcx) {
+                                resolution.shadowed_glob = Some(glob_binding);
+                            }
+                        } else {
+                            resolution.shadowed_glob = Some(glob_binding);
+                        }
                     }
                     (false, false) => {
                         return Err(old_binding);