diff options
| author | Jorge Aparicio <japaricious@gmail.com> | 2015-03-02 23:26:14 -0500 |
|---|---|---|
| committer | Jorge Aparicio <japaricious@gmail.com> | 2015-03-03 01:28:20 -0500 |
| commit | ac84af24dbdb2b18c548e772ba7427bb7e91f9ed (patch) | |
| tree | 5a19bfc8396554ad4fa17cdcdf1bd9f833e5f306 /src | |
| parent | b4c965ee803a4521d8b4575f634e036f93e408f3 (diff) | |
| download | rust-ac84af24dbdb2b18c548e772ba7427bb7e91f9ed.tar.gz rust-ac84af24dbdb2b18c548e772ba7427bb7e91f9ed.zip | |
privacy: walk associated types in trait impls
Diffstat (limited to 'src')
| -rw-r--r-- | src/librustc_privacy/lib.rs | 13 | ||||
| -rw-r--r-- | src/test/compile-fail/issue-22912.rs | 41 |
2 files changed, 53 insertions, 1 deletions
diff --git a/src/librustc_privacy/lib.rs b/src/librustc_privacy/lib.rs index 46729988bb6..ab3b56c31b6 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 00000000000..f4536ceb8ed --- /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 <LICENSE-APACHE or +// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +// <LICENSE-MIT or http://opensource.org/licenses/MIT>, 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() {} |
