// Private types and traits are not allowed in public interfaces. // This test also ensures that the checks are performed even inside private modules. #![feature(associated_type_defaults)] #![deny(private_interfaces, private_bounds)] #![allow(improper_ctypes)] mod types { struct Priv; pub struct Pub; pub trait PubTr { type Alias; } pub type Alias = Priv; //~ ERROR type `types::Priv` is more private than the item `types::Alias` pub enum E { V1(Priv), //~ ERROR type `types::Priv` is more private than the item `E::V1::0` V2 { field: Priv }, //~ ERROR type `types::Priv` is more private than the item `E::V2::field` } pub trait Tr { const C: Priv = Priv; //~ ERROR type `types::Priv` is more private than the item `Tr::C` type Alias = Priv; //~ ERROR private type `types::Priv` in public interface fn f1(arg: Priv) {} //~ ERROR type `types::Priv` is more private than the item `Tr::f1` fn f2() -> Priv { panic!() } //~ ERROR type `types::Priv` is more private than the item `Tr::f2` } extern "C" { pub static ES: Priv; //~ ERROR type `types::Priv` is more private than the item `types::ES` pub fn ef1(arg: Priv); //~ ERROR type `types::Priv` is more private than the item `types::ef1` pub fn ef2() -> Priv; //~ ERROR type `types::Priv` is more private than the item `types::ef2` } impl PubTr for Pub { type Alias = Priv; //~ ERROR private type `types::Priv` in public interface } } mod traits { trait PrivTr {} pub struct Pub(T); pub trait PubTr {} pub type Alias = T; //~ ERROR trait `traits::PrivTr` is more private than the item `traits::Alias` //~^ WARNING bounds on generic parameters are not enforced in type aliases pub trait Tr1: PrivTr {} //~ ERROR trait `traits::PrivTr` is more private than the item `traits::Tr1` pub trait Tr2 {} //~ ERROR trait `traits::PrivTr` is more private than the item `traits::Tr2` pub trait Tr3 { type Alias: PrivTr; //~^ ERROR trait `traits::PrivTr` is more private than the item `traits::Tr3::Alias` fn f(arg: T) {} //~ ERROR trait `traits::PrivTr` is more private than the item `traits::Tr3::f` } impl Pub {} //~ ERROR trait `traits::PrivTr` is more private than the item `traits::Pub` impl PubTr for Pub {} // OK, trait impl predicates } mod traits_where { trait PrivTr {} pub struct Pub(T); pub trait PubTr {} pub type Alias where T: PrivTr = T; //~^ ERROR trait `traits_where::PrivTr` is more private than the item `traits_where::Alias` //~| WARNING where clauses are not enforced in type aliases pub trait Tr2 where T: PrivTr {} //~^ ERROR trait `traits_where::PrivTr` is more private than the item `traits_where::Tr2` pub trait Tr3 { fn f(arg: T) where T: PrivTr {} //~^ ERROR trait `traits_where::PrivTr` is more private than the item `traits_where::Tr3::f` } impl Pub where T: PrivTr {} //~^ ERROR trait `traits_where::PrivTr` is more private than the item `traits_where::Pub` impl PubTr for Pub where T: PrivTr {} // OK, trait impl predicates } mod generics { struct Priv(T); pub struct Pub(T); trait PrivTr {} pub trait PubTr {} pub trait Tr1: PrivTr {} //~^ ERROR trait `generics::PrivTr` is more private than the item `generics::Tr1` pub trait Tr2: PubTr {} //~ ERROR type `generics::Priv` is more private than the item `generics::Tr2` pub trait Tr3: PubTr<[Priv; 1]> {} //~ ERROR type `generics::Priv` is more private than the item `generics::Tr3` pub trait Tr4: PubTr> {} //~ ERROR type `generics::Priv` is more private than the item `Tr4` } mod impls { struct Priv; pub struct Pub; trait PrivTr { type Alias; } pub trait PubTr { type Alias; } impl Priv { pub fn f(arg: Priv) {} // OK } impl PrivTr for Priv { type Alias = Priv; // OK } impl PubTr for Priv { type Alias = Priv; // OK } impl PrivTr for Pub { type Alias = Priv; // OK } impl PubTr for Pub { type Alias = Priv; //~ ERROR private type `impls::Priv` in public interface } } mod impls_generics { struct Priv(T); pub struct Pub(T); trait PrivTr { type Alias; } pub trait PubTr { type Alias; } impl Priv { pub fn f(arg: Priv) {} // OK } impl Pub { pub fn f(arg: Priv) {} // OK } impl PrivTr for Priv { type Alias = Priv; // OK } impl PubTr for Priv { type Alias = Priv; // OK } impl PubTr for Priv { type Alias = Priv; // OK } impl PubTr for [Priv; 1] { type Alias = Priv; // OK } impl PubTr for Pub { type Alias = Priv; // OK } impl PrivTr for Pub { type Alias = Priv; // OK } impl PubTr for Pub { type Alias = Priv; // OK } } mod aliases_pub { struct Priv; mod m { pub struct Pub1; pub struct Pub2; pub struct Pub3; pub trait PubTr { type Check = u8; } } use self::m::Pub1 as PrivUseAlias; use self::m::PubTr as PrivUseAliasTr; type PrivAlias = m::Pub2; trait PrivTr { type AssocAlias; } impl PrivTr for Priv { type AssocAlias = m::Pub3; } pub fn f1(arg: PrivUseAlias) {} // OK pub fn f2(arg: PrivAlias) {} // OK pub trait Tr1: PrivUseAliasTr {} // OK pub trait Tr2: PrivUseAliasTr {} // OK impl PrivAlias { pub fn f(arg: Priv) {} //~ ERROR type `aliases_pub::Priv` is more private than the item `aliases_pub::::f` } impl PrivUseAliasTr for PrivUseAlias { type Check = Priv; //~ ERROR private type `aliases_pub::Priv` in public interface } impl PrivUseAliasTr for PrivAlias { type Check = Priv; //~ ERROR private type `aliases_pub::Priv` in public interface } impl PrivUseAliasTr for ::AssocAlias { type Check = Priv; //~ ERROR private type `aliases_pub::Priv` in public interface } impl PrivUseAliasTr for Option<::AssocAlias> { type Check = Priv; //~ ERROR private type `aliases_pub::Priv` in public interface } impl PrivUseAliasTr for (::AssocAlias, Priv) { type Check = Priv; // OK } impl PrivUseAliasTr for Option<(::AssocAlias, Priv)> { type Check = Priv; // OK } } mod aliases_priv { struct Priv; struct Priv1; struct Priv2; struct Priv3; trait PrivTr1 { type Check = u8; } use self::Priv1 as PrivUseAlias; use self::PrivTr1 as PrivUseAliasTr; type PrivAlias = Priv2; trait PrivTr { type AssocAlias; } impl PrivTr for Priv { type AssocAlias = Priv3; } pub trait Tr1: PrivUseAliasTr {} //~^ ERROR trait `PrivTr1` is more private than the item `aliases_priv::Tr1` pub trait Tr2: PrivUseAliasTr {} //~^ ERROR trait `PrivTr1` is more private than the item `aliases_priv::Tr2` //~| ERROR type `Priv2` is more private than the item `aliases_priv::Tr2` impl PrivUseAlias { pub fn f(arg: Priv) {} // OK } impl PrivAlias { pub fn f(arg: Priv) {} // OK } impl PrivUseAliasTr for PrivUseAlias { type Check = Priv; // OK } impl PrivUseAliasTr for PrivAlias { type Check = Priv; // OK } impl PrivUseAliasTr for ::AssocAlias { type Check = Priv; // OK } } mod aliases_params { struct Priv; type PrivAliasGeneric = T; type Result = ::std::result::Result; pub fn f1(arg: PrivAliasGeneric) {} // OK, not an error } fn main() {}