diff options
| -rw-r--r-- | compiler/rustc_resolve/src/effective_visibilities.rs | 10 | ||||
| -rw-r--r-- | src/test/ui/privacy/effective_visibilities_invariants.rs | 2 |
2 files changed, 7 insertions, 5 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) } } } diff --git a/src/test/ui/privacy/effective_visibilities_invariants.rs b/src/test/ui/privacy/effective_visibilities_invariants.rs index 8c524d32815..af5a2bed6ab 100644 --- a/src/test/ui/privacy/effective_visibilities_invariants.rs +++ b/src/test/ui/privacy/effective_visibilities_invariants.rs @@ -5,7 +5,7 @@ pub mod m {} //~ ERROR module has missing stability attribute pub mod m { //~ ERROR the name `m` is defined multiple times - // mod inner {} - ICE + mod inner {} type Inner = u8; } |
