From ac84af24dbdb2b18c548e772ba7427bb7e91f9ed Mon Sep 17 00:00:00 2001 From: Jorge Aparicio Date: Mon, 2 Mar 2015 23:26:14 -0500 Subject: [PATCH 1/2] privacy: walk associated types in trait impls --- src/librustc_privacy/lib.rs | 13 ++++++++- src/test/compile-fail/issue-22912.rs | 41 ++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 src/test/compile-fail/issue-22912.rs diff --git a/src/librustc_privacy/lib.rs b/src/librustc_privacy/lib.rs index 46729988bb6bd..ab3b56c31b62a 100644 --- a/src/librustc_privacy/lib.rs +++ b/src/librustc_privacy/lib.rs @@ -1376,10 +1376,11 @@ impl<'a, 'tcx, 'v> Visitor<'v> for VisiblePrivateTypesVisitor<'a, 'tcx> { } } Some(ref tr) => { - // Any private types in a trait impl fall into two + // Any private types in a trait impl fall into three // categories. // 1. mentioned in the trait definition // 2. mentioned in the type params/generics + // 3. mentioned in the associated types of the impl // // Those in 1. can only occur if the trait is in // this crate and will've been warned about on the @@ -1389,6 +1390,16 @@ impl<'a, 'tcx, 'v> Visitor<'v> for VisiblePrivateTypesVisitor<'a, 'tcx> { // Those in 2. are warned via walk_generics and this // call here. visit::walk_path(self, &tr.path); + + // Those in 3. are warned with this call. + for impl_item in impl_items { + match *impl_item { + ast::MethodImplItem(..) => {}, + ast::TypeImplItem(ref typedef) => { + self.visit_ty(&typedef.typ); + } + } + } } } } else if trait_ref.is_none() && self_is_public_path { diff --git a/src/test/compile-fail/issue-22912.rs b/src/test/compile-fail/issue-22912.rs new file mode 100644 index 0000000000000..f4536ceb8ed69 --- /dev/null +++ b/src/test/compile-fail/issue-22912.rs @@ -0,0 +1,41 @@ +// Copyright 2015 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +pub struct PublicType; +struct PrivateType; + +pub trait PublicTrait { + type Item; +} + +trait PrivateTrait { + type Item; +} + +impl PublicTrait for PublicType { + type Item = PrivateType; //~ ERROR private type in exported type signature +} + +// OK +impl PublicTrait for PrivateType { + type Item = PrivateType; +} + +// OK +impl PrivateTrait for PublicType { + type Item = PrivateType; +} + +// OK +impl PrivateTrait for PrivateType { + type Item = PrivateType; +} + +fn main() {} From 89776aee49a8d896521c62eb6e33b88b9122880c Mon Sep 17 00:00:00 2001 From: Jorge Aparicio Date: Tue, 3 Mar 2015 00:25:14 -0500 Subject: [PATCH 2/2] fix fallout --- src/test/run-pass/associated-types-binding-in-where-clause.rs | 2 +- src/test/run-pass/associated-types-eq-obj.rs | 2 +- src/test/run-pass/associated-types-return.rs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/run-pass/associated-types-binding-in-where-clause.rs b/src/test/run-pass/associated-types-binding-in-where-clause.rs index 2f9a0b328b5d4..c6c66f1c75c54 100644 --- a/src/test/run-pass/associated-types-binding-in-where-clause.rs +++ b/src/test/run-pass/associated-types-binding-in-where-clause.rs @@ -16,7 +16,7 @@ pub trait Foo { } #[derive(PartialEq)] -struct Bar; +pub struct Bar; impl Foo for int { type A = uint; diff --git a/src/test/run-pass/associated-types-eq-obj.rs b/src/test/run-pass/associated-types-eq-obj.rs index 0ec8a3661906f..901b3c0d96b01 100644 --- a/src/test/run-pass/associated-types-eq-obj.rs +++ b/src/test/run-pass/associated-types-eq-obj.rs @@ -15,7 +15,7 @@ pub trait Foo { fn boo(&self) -> ::A; } -struct Bar; +pub struct Bar; impl Foo for char { type A = Bar; diff --git a/src/test/run-pass/associated-types-return.rs b/src/test/run-pass/associated-types-return.rs index fe24ab6bbeb1b..8ae550be3fc66 100644 --- a/src/test/run-pass/associated-types-return.rs +++ b/src/test/run-pass/associated-types-return.rs @@ -16,7 +16,7 @@ pub trait Foo { } #[derive(PartialEq)] -struct Bar; +pub struct Bar; impl Foo for int { type A = uint;