From f8028b0b6c3c5c1d6498cf780366641a7c047abf Mon Sep 17 00:00:00 2001 From: Vadim Petrochenkov Date: Sun, 13 Jan 2019 00:41:11 +0300 Subject: [PATCH] privacy: Fix private-in-public check for existential types --- src/librustc_privacy/lib.rs | 11 ++++++++--- .../ui/privacy/private-in-public-existential.rs | 15 +++++++++++++++ 2 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 src/test/ui/privacy/private-in-public-existential.rs diff --git a/src/librustc_privacy/lib.rs b/src/librustc_privacy/lib.rs index 5015ed027cc3c..4890369e13f20 100644 --- a/src/librustc_privacy/lib.rs +++ b/src/librustc_privacy/lib.rs @@ -48,7 +48,7 @@ mod diagnostics; /// Default type visitor (`TypeVisitor`) does most of the job, but it has some shortcomings. /// First, it doesn't have overridable `fn visit_trait_ref`, so we have to catch trait def-ids /// manually. Second, it doesn't visit some type components like signatures of fn types, or traits -/// in `impl Trait`, see individual commits in `DefIdVisitorSkeleton::visit_ty`. +/// in `impl Trait`, see individual comments in `DefIdVisitorSkeleton::visit_ty`. trait DefIdVisitor<'a, 'tcx: 'a> { fn tcx(&self) -> TyCtxt<'a, 'tcx, 'tcx>; fn shallow(&self) -> bool { false } @@ -1579,10 +1579,15 @@ impl<'a, 'tcx> Visitor<'tcx> for PrivateItemsInPublicInterfacesVisitor<'a, 'tcx> // No subitems. hir::ItemKind::GlobalAsm(..) => {} // Subitems of these items have inherited publicity. - hir::ItemKind::Const(..) | hir::ItemKind::Static(..) | hir::ItemKind::Fn(..) | - hir::ItemKind::Existential(..) | hir::ItemKind::Ty(..) => { + hir::ItemKind::Const(..) | hir::ItemKind::Static(..) | + hir::ItemKind::Fn(..) | hir::ItemKind::Ty(..) => { self.check(item.id, item_visibility).generics().predicates().ty(); } + hir::ItemKind::Existential(..) => { + // `ty()` for existential types is the underlying type, + // it's not a part of interface, so we skip it. + self.check(item.id, item_visibility).generics().predicates(); + } hir::ItemKind::Trait(.., ref trait_item_refs) => { self.check(item.id, item_visibility).generics().predicates(); diff --git a/src/test/ui/privacy/private-in-public-existential.rs b/src/test/ui/privacy/private-in-public-existential.rs new file mode 100644 index 0000000000000..95658f45df6f5 --- /dev/null +++ b/src/test/ui/privacy/private-in-public-existential.rs @@ -0,0 +1,15 @@ +// compile-pass + +#![feature(existential_type)] +#![deny(private_in_public)] + +pub existential type Pub: Default; + +#[derive(Default)] +struct Priv; + +fn check() -> Pub { + Priv +} + +fn main() {}