1 // Copyright 2015 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 // Private types and traits are not allowed in public interfaces.
12 // This test also ensures that the checks are performed even inside private modules.
14 #![feature(associated_consts)]
15 #![feature(associated_type_defaults)]
24 pub const C: Priv = Priv; //~ ERROR private type `types::Priv` in public interface
25 pub static S: Priv = Priv; //~ ERROR private type `types::Priv` in public interface
26 pub fn f1(arg: Priv) {} //~ ERROR private type `types::Priv` in public interface
27 pub fn f2() -> Priv { panic!() } //~ ERROR private type `types::Priv` in public interface
28 pub struct S1(pub Priv); //~ ERROR private type `types::Priv` in public interface
29 pub struct S2 { pub field: Priv } //~ ERROR private type `types::Priv` in public interface
31 pub const C: Priv = Priv; //~ ERROR private type `types::Priv` in public interface
32 pub fn f1(arg: Priv) {} //~ ERROR private type `types::Priv` in public interface
33 pub fn f2() -> Priv { panic!() } //~ ERROR private type `types::Priv` in public interface
42 pub enum E<T: PrivTr> { V(T) } //~ ERROR private trait `traits::PrivTr` in public interface
43 pub fn f<T: PrivTr>(arg: T) {} //~ ERROR private trait `traits::PrivTr` in public interface
44 pub struct S1<T: PrivTr>(T); //~ ERROR private trait `traits::PrivTr` in public interface
45 impl<T: PrivTr> Pub<T> { //~ ERROR private trait `traits::PrivTr` in public interface
46 pub fn f<U: PrivTr>(arg: U) {} //~ ERROR private trait `traits::PrivTr` in public interface
55 pub enum E<T> where T: PrivTr { V(T) }
56 //~^ ERROR private trait `traits_where::PrivTr` in public interface
57 pub fn f<T>(arg: T) where T: PrivTr {}
58 //~^ ERROR private trait `traits_where::PrivTr` in public interface
59 pub struct S1<T>(T) where T: PrivTr;
60 //~^ ERROR private trait `traits_where::PrivTr` in public interface
61 impl<T> Pub<T> where T: PrivTr {
62 //~^ ERROR private trait `traits_where::PrivTr` in public interface
63 pub fn f<U>(arg: U) where U: PrivTr {}
64 //~^ ERROR private trait `traits_where::PrivTr` in public interface
69 struct Priv<T = u8>(T);
70 pub struct Pub<T = u8>(T);
74 pub fn f1(arg: [Priv; 1]) {} //~ ERROR private type `generics::Priv` in public interface
75 pub fn f2(arg: Pub<Priv>) {} //~ ERROR private type `generics::Priv` in public interface
76 pub fn f3(arg: Priv<Pub>) {}
77 //~^ ERROR private type `generics::Priv<generics::Pub>` in public interface
91 pub fn f(arg: Priv) {} //~ ERROR private type `impls::Priv` in public interface
101 pub trait PubTr<T = u8> {
106 use self::m::Pub1 as PrivUseAlias;
107 use self::m::PubTr as PrivUseAliasTr;
108 type PrivAlias = m::Pub2;
110 type Assoc = m::Pub3;
112 impl PrivTr for Priv {}
114 // This should be OK, but associated type aliases are not substituted yet
115 pub fn f3(arg: <Priv as PrivTr>::Assoc) {}
116 //~^ ERROR private type `<aliases_pub::Priv as aliases_pub::PrivTr>::Assoc` in public interface
117 //~| ERROR private type `aliases_pub::Priv` in public interface
120 pub fn f(arg: Priv) {} //~ ERROR private type `aliases_pub::Priv` in public interface
130 trait PrivTr1<T = u8> {
134 use self::Priv1 as PrivUseAlias;
135 use self::PrivTr1 as PrivUseAliasTr;
136 type PrivAlias = Priv2;
140 impl PrivTr for Priv {}
142 pub fn f1(arg: PrivUseAlias) {} //~ ERROR private type `aliases_priv::Priv1` in public interface
143 pub fn f2(arg: PrivAlias) {} //~ ERROR private type `aliases_priv::Priv2` in public interface
144 pub fn f3(arg: <Priv as PrivTr>::Assoc) {}
145 //~^ ERROR private type `<aliases_priv::Priv as aliases_priv::PrivTr>::Assoc` in public
146 //~| ERROR private type `aliases_priv::Priv` in public interface
151 type PrivAliasGeneric<T = Priv> = T;
152 type Result<T> = ::std::result::Result<T, Priv>;
154 pub fn f2(arg: PrivAliasGeneric) {}
155 //~^ ERROR private type `aliases_params::Priv` in public interface
156 pub fn f3(arg: Result<u8>) {} //~ ERROR private type `aliases_params::Priv` in public interface