From a45a302be536126accf29764b6a3dca39d57d0fe Mon Sep 17 00:00:00 2001 From: Vadim Petrochenkov Date: Wed, 23 Nov 2022 20:13:44 +0300 Subject: [PATCH] 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 --- compiler/rustc_resolve/src/effective_visibilities.rs | 10 ++++++---- .../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 32ab58b459a6..56959586d117 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 8c524d32815b..af5a2bed6ab2 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; }