Skip to content

Commit 17f2893

Browse files
committed
Types with reachable constructors are reachable
1 parent c52b9c1 commit 17f2893

File tree

3 files changed

+56
-1
lines changed

3 files changed

+56
-1
lines changed

compiler/rustc_privacy/src/lib.rs

+15-1
Original file line numberDiff line numberDiff line change
@@ -775,7 +775,14 @@ impl<'tcx> Visitor<'tcx> for EmbargoVisitor<'tcx> {
775775
}
776776
// Corner case: if the variant is reachable, but its
777777
// enum is not, make the enum reachable as well.
778-
self.update(item.def_id, variant_level);
778+
self.reach(item.def_id, variant_level).ty();
779+
}
780+
if let Some(hir_id) = variant.data.ctor_hir_id() {
781+
let ctor_def_id = self.tcx.hir().local_def_id(hir_id);
782+
let ctor_level = self.get(ctor_def_id);
783+
if ctor_level.is_some() {
784+
self.reach(item.def_id, ctor_level).ty();
785+
}
779786
}
780787
}
781788
}
@@ -803,6 +810,13 @@ impl<'tcx> Visitor<'tcx> for EmbargoVisitor<'tcx> {
803810
}
804811
}
805812
}
813+
if let Some(hir_id) = struct_def.ctor_hir_id() {
814+
let ctor_def_id = self.tcx.hir().local_def_id(hir_id);
815+
let ctor_level = self.get(ctor_def_id);
816+
if ctor_level.is_some() {
817+
self.reach(item.def_id, ctor_level).ty();
818+
}
819+
}
806820
}
807821
}
808822

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
// edition:2021
2+
//! Missing docs lint warns about undocumented exported items.
3+
//! Use the lint to additionally verify that items are reachable
4+
//! but not exported.
5+
#![allow(non_camel_case_types)]
6+
#![deny(missing_docs)]
7+
8+
mod hidden {
9+
pub struct s;
10+
pub enum e { x, y, z }
11+
pub use e::*;
12+
impl s {
13+
pub fn f(&self) {}
14+
}
15+
impl e {
16+
pub fn g(&self) {}
17+
}
18+
}
19+
// Hide all type definitions while reexporting their constructors:
20+
mod e {}
21+
mod x {}
22+
mod y {}
23+
mod z {}
24+
mod s {}
25+
pub use hidden::*;

src/test/ui/privacy/ctor.rs

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// Verify that a type is considered reachable when its constructor is
2+
// reachable. The auxiliary library is constructed so that all types are
3+
// shadowed and cannot be named directly, while their constructors are
4+
// reexported. Regression test for issue #96934.
5+
//
6+
// aux-build:ctor_aux.rs
7+
// edition:2021
8+
// build-pass
9+
10+
extern crate ctor_aux;
11+
12+
fn main() {
13+
ctor_aux::s.f();
14+
ctor_aux::x.g();
15+
ctor_aux::y.g();
16+
}

0 commit comments

Comments
 (0)