Rollup merge of #154313 - mu001999-contrib:fix/154295, r=petrochenkov

Init `self_decl` with a correct visibility

Fixes rust-lang/rust#154295

r? petrochenkov
This commit is contained in:
Jonathan Brouwer
2026-03-25 19:52:52 +01:00
committed by GitHub
4 changed files with 92 additions and 10 deletions
+24 -9
View File
@@ -547,6 +547,13 @@ fn name(&self) -> Option<Symbol> {
ModuleKind::Def(.., name) => name,
}
}
fn opt_def_id(&self) -> Option<DefId> {
match self {
ModuleKind::Def(_, def_id, _) => Some(*def_id),
_ => None,
}
}
}
/// Combination of a symbol and its macros 2.0 normalized hygiene context.
@@ -784,10 +791,7 @@ fn def_id(self) -> DefId {
}
fn opt_def_id(self) -> Option<DefId> {
match self.kind {
ModuleKind::Def(_, def_id, _) => Some(def_id),
_ => None,
}
self.kind.opt_def_id()
}
// `self` resolves to the first module ancestor that `is_normal`.
@@ -1450,14 +1454,19 @@ fn new_module(
&'ra self,
parent: Option<Module<'ra>>,
kind: ModuleKind,
vis: Visibility<DefId>,
expn_id: ExpnId,
span: Span,
no_implicit_prelude: bool,
) -> Module<'ra> {
let self_decl = match kind {
ModuleKind::Def(def_kind, def_id, _) => {
Some(self.new_pub_def_decl(Res::Def(def_kind, def_id), span, LocalExpnId::ROOT))
}
ModuleKind::Def(def_kind, def_id, _) => Some(self.new_def_decl(
Res::Def(def_kind, def_id),
vis,
span,
LocalExpnId::ROOT,
None,
)),
ModuleKind::Block => None,
};
Module(Interned::new_unchecked(self.modules.alloc(ModuleData::new(
@@ -1639,6 +1648,7 @@ pub fn new(
let graph_root = arenas.new_module(
None,
ModuleKind::Def(DefKind::Mod, root_def_id, None),
Visibility::Public,
ExpnId::root(),
crate_span,
attr::contains_name(attrs, sym::no_implicit_prelude),
@@ -1648,6 +1658,7 @@ pub fn new(
let empty_module = arenas.new_module(
None,
ModuleKind::Def(DefKind::Mod, root_def_id, None),
Visibility::Public,
ExpnId::root(),
DUMMY_SP,
true,
@@ -1749,7 +1760,9 @@ fn new_local_module(
span: Span,
no_implicit_prelude: bool,
) -> Module<'ra> {
let module = self.arenas.new_module(parent, kind, expn_id, span, no_implicit_prelude);
let vis =
kind.opt_def_id().map_or(Visibility::Public, |def_id| self.tcx.visibility(def_id));
let module = self.arenas.new_module(parent, kind, vis, expn_id, span, no_implicit_prelude);
self.local_modules.push(module);
if let Some(def_id) = module.opt_def_id() {
self.local_module_map.insert(def_id.expect_local(), module);
@@ -1765,7 +1778,9 @@ fn new_extern_module(
span: Span,
no_implicit_prelude: bool,
) -> Module<'ra> {
let module = self.arenas.new_module(parent, kind, expn_id, span, no_implicit_prelude);
let vis =
kind.opt_def_id().map_or(Visibility::Public, |def_id| self.tcx.visibility(def_id));
let module = self.arenas.new_module(parent, kind, vis, expn_id, span, no_implicit_prelude);
self.extern_module_map.borrow_mut().insert(module.def_id(), module);
module
}
+24
View File
@@ -0,0 +1,24 @@
mod foo {
pub use self as this;
//~^ ERROR `self` is only public within the crate, and cannot be re-exported outside
pub mod bar {
pub use super as parent;
//~^ ERROR `super` is only public within the crate, and cannot be re-exported outside
pub use self::super as parent2;
//~^ ERROR `super` is only public within the crate, and cannot be re-exported outside
pub use super::{self as parent3};
//~^ ERROR `super` is only public within the crate, and cannot be re-exported outside
pub use self::{super as parent4};
//~^ ERROR `super` is only public within the crate, and cannot be re-exported outside
pub use crate as root;
pub use crate::{self as root2};
pub use super::super as root3;
}
}
pub use foo::*;
pub use foo::bar::*;
pub fn main() {}
@@ -0,0 +1,43 @@
error[E0365]: `self` is only public within the crate, and cannot be re-exported outside
--> $DIR/pub-use-self-super-crate.rs:2:13
|
LL | pub use self as this;
| ^^^^^^^^^^^^ re-export of crate public `self`
|
= note: consider declaring type or module `self` with `pub`
error[E0365]: `super` is only public within the crate, and cannot be re-exported outside
--> $DIR/pub-use-self-super-crate.rs:6:17
|
LL | pub use super as parent;
| ^^^^^^^^^^^^^^^ re-export of crate public `super`
|
= note: consider declaring type or module `super` with `pub`
error[E0365]: `super` is only public within the crate, and cannot be re-exported outside
--> $DIR/pub-use-self-super-crate.rs:8:17
|
LL | pub use self::super as parent2;
| ^^^^^^^^^^^^^^^^^^^^^^ re-export of crate public `super`
|
= note: consider declaring type or module `super` with `pub`
error[E0365]: `super` is only public within the crate, and cannot be re-exported outside
--> $DIR/pub-use-self-super-crate.rs:10:25
|
LL | pub use super::{self as parent3};
| ^^^^^^^^^^^^^^^ re-export of crate public `super`
|
= note: consider declaring type or module `super` with `pub`
error[E0365]: `super` is only public within the crate, and cannot be re-exported outside
--> $DIR/pub-use-self-super-crate.rs:12:24
|
LL | pub use self::{super as parent4};
| ^^^^^^^^^^^^^^^^ re-export of crate public `super`
|
= note: consider declaring type or module `super` with `pub`
error: aborting due to 5 previous errors
For more information about this error, try `rustc --explain E0365`.
+1 -1
View File
@@ -70,7 +70,7 @@ macro_rules! macro_dollar_crate {
fn outer() {}
mod foo {
pub mod foo {
pub mod bar {
pub mod foobar {
pub mod qux {