1 // Copyright 2017 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
11 #![feature(associated_consts)]
12 #![feature(decl_macro)]
13 #![allow(private_in_public)]
17 static PRIV_STATIC: u8 = 0;
18 enum PrivEnum { Variant }
19 pub enum PubEnum { Variant }
20 trait PrivTrait { fn method() {} }
21 impl PrivTrait for u8 {}
22 pub trait PubTrait { fn method() {} }
23 impl PubTrait for u8 {}
24 struct PrivTupleStruct(u8);
25 pub struct PubTupleStruct(u8);
26 impl PubTupleStruct { fn method() {} }
29 pub type Alias = Priv;
30 pub struct Pub<T = Alias>(pub T);
33 pub fn static_method() {}
34 pub const INHERENT_ASSOC_CONST: u8 = 0;
37 pub fn static_method_generic_self() {}
38 pub const INHERENT_ASSOC_CONST_GENERIC_SELF: u8 = 0;
41 fn priv_method(&self) {}
42 pub fn method_with_substs<T>(&self) {}
43 pub fn method_with_priv_params(&self, _: Priv) {}
45 impl TraitWithAssocConst for Priv {}
46 impl TraitWithAssocTy for Priv { type AssocTy = u8; }
49 priv_fn; //~ ERROR type `fn() {m::priv_fn}` is private
50 PRIV_STATIC; // OK, not cross-crate
51 PrivEnum::Variant; //~ ERROR type `m::PrivEnum` is private
52 PubEnum::Variant; // OK
53 <u8 as PrivTrait>::method; //~ ERROR type `fn() {<u8 as m::PrivTrait>::method}` is private
54 <u8 as PubTrait>::method; // OK
56 //~^ ERROR type `fn(u8) -> m::PrivTupleStruct {m::PrivTupleStruct::{{constructor}}}` is priv
58 //~^ ERROR type `fn(u8) -> m::PubTupleStruct {m::PubTupleStruct::{{constructor}}}` is privat
59 Pub(0u8).priv_method();
60 //~^ ERROR type `for<'r> fn(&'r m::Pub<u8>) {<m::Pub<u8>>::priv_method}` is private
64 pub trait TraitWithTyParam<T> {}
65 pub trait TraitWithTyParam2<T> { fn pub_method() {} }
66 pub trait TraitWithAssocTy { type AssocTy; }
67 pub trait TraitWithAssocConst { const TRAIT_ASSOC_CONST: u8 = 0; }
69 impl<T> TraitWithTyParam<T> for u8 {}
70 impl TraitWithTyParam2<Priv> for u8 {}
71 impl TraitWithAssocTy for u8 { type AssocTy = Priv; }
72 //~^ ERROR private type `m::Priv` in public interface
74 pub fn leak_anon1() -> impl Trait + 'static { 0 }
75 pub fn leak_anon2() -> impl TraitWithTyParam<Alias> { 0 }
76 pub fn leak_anon3() -> impl TraitWithAssocTy<AssocTy = Alias> { 0 }
78 pub fn leak_dyn1() -> Box<Trait + 'static> { Box::new(0) }
79 pub fn leak_dyn2() -> Box<TraitWithTyParam<Alias>> { Box::new(0) }
80 pub fn leak_dyn3() -> Box<TraitWithAssocTy<AssocTy = Alias>> { Box::new(0) }
84 // Construct a chain of derefs with a private type in the middle
89 pub type S2Alias = S2;
93 type Target = S2Alias; //~ ERROR private type `adjust::S2` in public interface
94 fn deref(&self) -> &Self::Target { loop {} }
98 fn deref(&self) -> &Self::Target { loop {} }
102 pub fn method_s3(&self) {}
107 let _: m::Alias; //~ ERROR type `m::Priv` is private
108 //~^ ERROR type `m::Priv` is private
109 let _: <m::Alias as m::TraitWithAssocTy>::AssocTy; //~ ERROR type `m::Priv` is private
110 m::Alias {}; //~ ERROR type `m::Priv` is private
111 m::Pub { 0: m::Alias {} }; //~ ERROR type `m::Priv` is private
112 m::Pub { 0: loop {} }; // OK, `m::Pub` is in value context, so it means Pub<_>, not Pub<Priv>
113 m::Pub::static_method; //~ ERROR type `m::Priv` is private
114 m::Pub::INHERENT_ASSOC_CONST; //~ ERROR type `m::Priv` is private
115 m::Pub(0u8).method_with_substs::<m::Alias>(); //~ ERROR type `m::Priv` is private
116 m::Pub(0u8).method_with_priv_params(loop{}); //~ ERROR type `m::Priv` is private
117 <m::Alias as m::TraitWithAssocConst>::TRAIT_ASSOC_CONST; //~ ERROR type `m::Priv` is private
118 <m::Pub<m::Alias>>::INHERENT_ASSOC_CONST; //~ ERROR type `m::Priv` is private
119 <m::Pub<m::Alias>>::INHERENT_ASSOC_CONST_GENERIC_SELF; //~ ERROR type `m::Priv` is private
120 <m::Pub<m::Alias>>::static_method_generic_self; //~ ERROR type `m::Priv` is private
121 use m::TraitWithTyParam2;
122 u8::pub_method; //~ ERROR type `m::Priv` is private
124 adjust::S1.method_s3(); //~ ERROR type `adjust::S2` is private
128 m::leak_anon1(); //~ ERROR trait `m::Trait` is private
129 m::leak_anon2(); //~ ERROR type `m::Priv` is private
130 m::leak_anon3(); //~ ERROR type `m::Priv` is private
132 m::leak_dyn1(); //~ ERROR type `m::Trait + 'static` is private
133 m::leak_dyn2(); //~ ERROR type `m::Priv` is private
134 m::leak_dyn3(); //~ ERROR type `m::Priv` is private
136 // Check that messages are not duplicated for various kinds of assignments
137 let a = m::Alias {}; //~ ERROR type `m::Priv` is private
138 let mut b = a; //~ ERROR type `m::Priv` is private
139 b = a; //~ ERROR type `m::Priv` is private
140 match a { //~ ERROR type `m::Priv` is private