about summary refs log tree commit diff
path: root/compiler/rustc_resolve/src
diff options
context:
space:
mode:
authorVadim Petrochenkov <vadim.petrochenkov@gmail.com>2022-11-23 20:13:44 +0300
committerVadim Petrochenkov <vadim.petrochenkov@gmail.com>2022-11-24 00:03:51 +0300
commita45a302be536126accf29764b6a3dca39d57d0fe (patch)
tree1a5de866f2d6baad6857e7e26665ddf8d1fc42ce /compiler/rustc_resolve/src
parentf0843b89d1336962e9cb0572a40a790cd60ef4d9 (diff)
downloadrust-a45a302be536126accf29764b6a3dca39d57d0fe.tar.gz
rust-a45a302be536126accf29764b6a3dca39d57d0fe.zip
effective visibility: Fix private visibility calculation for modules
Optimizations removed in the previous commit required this function to behave incorrectly, but now those optimizations are gone so we can fix the bug.

Fixes https://github.com/rust-lang/rust/issues/104249
Diffstat (limited to 'compiler/rustc_resolve/src')
-rw-r--r--compiler/rustc_resolve/src/effective_visibilities.rs10
1 files changed, 6 insertions, 4 deletions
diff --git a/compiler/rustc_resolve/src/effective_visibilities.rs b/compiler/rustc_resolve/src/effective_visibilities.rs
index 32ab58b459a..56959586d11 100644
--- a/compiler/rustc_resolve/src/effective_visibilities.rs
+++ b/compiler/rustc_resolve/src/effective_visibilities.rs
@@ -9,7 +9,7 @@ use rustc_hir::def_id::LocalDefId;
 use rustc_hir::def_id::CRATE_DEF_ID;
 use rustc_middle::middle::privacy::{EffectiveVisibilities, EffectiveVisibility};
 use rustc_middle::middle::privacy::{IntoDefIdTree, Level};
-use rustc_middle::ty::Visibility;
+use rustc_middle::ty::{DefIdTree, Visibility};
 
 type ImportId<'a> = Interned<'a, NameBinding<'a>>;
 
@@ -54,10 +54,12 @@ impl Resolver<'_> {
     }
 
     fn private_vis_def(&mut self, def_id: LocalDefId) -> Visibility {
-        if def_id == CRATE_DEF_ID {
-            Visibility::Public
+        // For mod items `nearest_normal_mod` returns its argument, but we actually need its parent.
+        let normal_mod_id = self.nearest_normal_mod(def_id);
+        if normal_mod_id == def_id {
+            self.opt_local_parent(def_id).map_or(Visibility::Public, Visibility::Restricted)
         } else {
-            Visibility::Restricted(self.nearest_normal_mod(def_id))
+            Visibility::Restricted(normal_mod_id)
         }
     }
 }