Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 0 additions & 8 deletions compiler/rustc_privacy/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1632,10 +1632,6 @@ impl<'tcx> PrivateItemsInPublicInterfacesChecker<'_, 'tcx> {
self.check(def_id, item_visibility, effective_vis).generics().predicates();

for assoc_item in tcx.associated_items(id.owner_id).in_definition_order() {
if assoc_item.is_impl_trait_in_trait() {
continue;
}

self.check_assoc_item(assoc_item, item_visibility, effective_vis);

if assoc_item.is_type() {
Expand Down Expand Up @@ -1711,10 +1707,6 @@ impl<'tcx> PrivateItemsInPublicInterfacesChecker<'_, 'tcx> {
check.ty().trait_ref();

for assoc_item in tcx.associated_items(id.owner_id).in_definition_order() {
if assoc_item.is_impl_trait_in_trait() {
continue;
}

let impl_item_vis = if !of_trait {
min(tcx.local_visibility(assoc_item.def_id.expect_local()), impl_vis, tcx)
} else {
Expand Down
9 changes: 9 additions & 0 deletions tests/ui/privacy/private-in-public-warn.rs
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,10 @@ mod traits {
fn f<T: PrivTr>(arg: T) {}
//~^ ERROR trait `traits::PrivTr` is more private than the item `traits::Tr3::f`
fn g() -> impl PrivTr;
//~^ ERROR trait `traits::PrivTr` is more private than the item `traits::Tr3::g::{anon_assoc#0}`
fn h() -> impl PrivTr {}
//~^ ERROR private trait `traits::PrivTr` in public interface
//~| ERROR trait `traits::PrivTr` is more private than the item `traits::Tr3::h::{anon_assoc#0}`
}
impl<T: PrivTr> Pub<T> {} //~ ERROR trait `traits::PrivTr` is more private than the item `traits::Pub<T>`
impl<T: PrivTr> PubTr for Pub<T> {} // OK, trait impl predicates
Expand Down Expand Up @@ -89,7 +92,13 @@ mod generics {

pub trait Tr5 {
fn required() -> impl PrivTr<Priv<()>>;
//~^ ERROR trait `generics::PrivTr<generics::Priv<()>>` is more private than the item `Tr5::required::{anon_assoc#0}`
//~| ERROR type `generics::Priv<()>` is more private than the item `Tr5::required::{anon_assoc#0}`
fn provided() -> impl PrivTr<Priv<()>> {}
//~^ ERROR private trait `generics::PrivTr<generics::Priv<()>>` in public interface
//~| ERROR private type `generics::Priv<()>` in public interface
//~| ERROR trait `generics::PrivTr<generics::Priv<()>>` is more private than the item `Tr5::provided::{anon_assoc#0}`
//~| ERROR type `generics::Priv<()>` is more private than the item `Tr5::provided::{anon_assoc#0}`
}
}

Expand Down
163 changes: 131 additions & 32 deletions tests/ui/privacy/private-in-public-warn.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -194,8 +194,41 @@ note: but trait `traits::PrivTr` is only usable at visibility `pub(self)`
LL | trait PrivTr {}
| ^^^^^^^^^^^^

error: trait `traits::PrivTr` is more private than the item `traits::Tr3::g::{anon_assoc#0}`
--> $DIR/private-in-public-warn.rs:51:19
|
LL | fn g() -> impl PrivTr;
| ^^^^^^^^^^^ opaque type `traits::Tr3::g::{anon_assoc#0}` is reachable at visibility `pub(crate)`
|
note: but trait `traits::PrivTr` is only usable at visibility `pub(self)`
--> $DIR/private-in-public-warn.rs:37:5
|
LL | trait PrivTr {}
| ^^^^^^^^^^^^

error[E0446]: private trait `traits::PrivTr` in public interface
--> $DIR/private-in-public-warn.rs:53:19
|
LL | trait PrivTr {}
| ------------ `traits::PrivTr` declared as private
...
LL | fn h() -> impl PrivTr {}
| ^^^^^^^^^^^ can't leak private trait

error: trait `traits::PrivTr` is more private than the item `traits::Tr3::h::{anon_assoc#0}`
--> $DIR/private-in-public-warn.rs:53:19
|
LL | fn h() -> impl PrivTr {}
| ^^^^^^^^^^^ opaque type `traits::Tr3::h::{anon_assoc#0}` is reachable at visibility `pub(crate)`
|
note: but trait `traits::PrivTr` is only usable at visibility `pub(self)`
--> $DIR/private-in-public-warn.rs:37:5
|
LL | trait PrivTr {}
| ^^^^^^^^^^^^

error: trait `traits::PrivTr` is more private than the item `traits::Pub<T>`
--> $DIR/private-in-public-warn.rs:54:5
--> $DIR/private-in-public-warn.rs:57:5
|
LL | impl<T: PrivTr> Pub<T> {}
| ^^^^^^^^^^^^^^^^^^^^^^ implementation `traits::Pub<T>` is reachable at visibility `pub(crate)`
Expand All @@ -207,103 +240,169 @@ LL | trait PrivTr {}
| ^^^^^^^^^^^^

error: trait `traits_where::PrivTr` is more private than the item `traits_where::Alias`
--> $DIR/private-in-public-warn.rs:63:5
--> $DIR/private-in-public-warn.rs:66:5
|
LL | pub type Alias<T> where T: PrivTr = T;
| ^^^^^^^^^^^^^^^^^ type alias `traits_where::Alias` is reachable at visibility `pub(crate)`
|
note: but trait `traits_where::PrivTr` is only usable at visibility `pub(self)`
--> $DIR/private-in-public-warn.rs:59:5
--> $DIR/private-in-public-warn.rs:62:5
|
LL | trait PrivTr {}
| ^^^^^^^^^^^^

error: trait `traits_where::PrivTr` is more private than the item `traits_where::Tr2`
--> $DIR/private-in-public-warn.rs:66:5
--> $DIR/private-in-public-warn.rs:69:5
|
LL | pub trait Tr2<T> where T: PrivTr {}
| ^^^^^^^^^^^^^^^^ trait `traits_where::Tr2` is reachable at visibility `pub(crate)`
|
note: but trait `traits_where::PrivTr` is only usable at visibility `pub(self)`
--> $DIR/private-in-public-warn.rs:59:5
--> $DIR/private-in-public-warn.rs:62:5
|
LL | trait PrivTr {}
| ^^^^^^^^^^^^

error: trait `traits_where::PrivTr` is more private than the item `traits_where::Tr3::f`
--> $DIR/private-in-public-warn.rs:69:9
--> $DIR/private-in-public-warn.rs:72:9
|
LL | fn f<T>(arg: T) where T: PrivTr {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ associated function `traits_where::Tr3::f` is reachable at visibility `pub(crate)`
|
note: but trait `traits_where::PrivTr` is only usable at visibility `pub(self)`
--> $DIR/private-in-public-warn.rs:59:5
--> $DIR/private-in-public-warn.rs:62:5
|
LL | trait PrivTr {}
| ^^^^^^^^^^^^

error: trait `traits_where::PrivTr` is more private than the item `traits_where::Pub<T>`
--> $DIR/private-in-public-warn.rs:72:5
--> $DIR/private-in-public-warn.rs:75:5
|
LL | impl<T> Pub<T> where T: PrivTr {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ implementation `traits_where::Pub<T>` is reachable at visibility `pub(crate)`
|
note: but trait `traits_where::PrivTr` is only usable at visibility `pub(self)`
--> $DIR/private-in-public-warn.rs:59:5
--> $DIR/private-in-public-warn.rs:62:5
|
LL | trait PrivTr {}
| ^^^^^^^^^^^^

error: trait `generics::PrivTr<generics::Pub>` is more private than the item `generics::Tr1`
--> $DIR/private-in-public-warn.rs:84:5
--> $DIR/private-in-public-warn.rs:87:5
|
LL | pub trait Tr1: PrivTr<Pub> {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ trait `generics::Tr1` is reachable at visibility `pub(crate)`
|
note: but trait `generics::PrivTr<generics::Pub>` is only usable at visibility `pub(self)`
--> $DIR/private-in-public-warn.rs:80:5
--> $DIR/private-in-public-warn.rs:83:5
|
LL | trait PrivTr<T> {}
| ^^^^^^^^^^^^^^^

error: type `generics::Priv` is more private than the item `generics::Tr2`
--> $DIR/private-in-public-warn.rs:86:5
--> $DIR/private-in-public-warn.rs:89:5
|
LL | pub trait Tr2: PubTr<Priv> {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ trait `generics::Tr2` is reachable at visibility `pub(crate)`
|
note: but type `generics::Priv` is only usable at visibility `pub(self)`
--> $DIR/private-in-public-warn.rs:78:5
--> $DIR/private-in-public-warn.rs:81:5
|
LL | struct Priv<T = u8>(T);
| ^^^^^^^^^^^^^^^^^^^

error: type `generics::Priv` is more private than the item `generics::Tr3`
--> $DIR/private-in-public-warn.rs:87:5
--> $DIR/private-in-public-warn.rs:90:5
|
LL | pub trait Tr3: PubTr<[Priv; 1]> {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ trait `generics::Tr3` is reachable at visibility `pub(crate)`
|
note: but type `generics::Priv` is only usable at visibility `pub(self)`
--> $DIR/private-in-public-warn.rs:78:5
--> $DIR/private-in-public-warn.rs:81:5
|
LL | struct Priv<T = u8>(T);
| ^^^^^^^^^^^^^^^^^^^

error: type `generics::Priv` is more private than the item `Tr4`
--> $DIR/private-in-public-warn.rs:88:5
--> $DIR/private-in-public-warn.rs:91:5
|
LL | pub trait Tr4: PubTr<Pub<Priv>> {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ trait `Tr4` is reachable at visibility `pub(crate)`
|
note: but type `generics::Priv` is only usable at visibility `pub(self)`
--> $DIR/private-in-public-warn.rs:78:5
--> $DIR/private-in-public-warn.rs:81:5
|
LL | struct Priv<T = u8>(T);
| ^^^^^^^^^^^^^^^^^^^

error: trait `generics::PrivTr<generics::Priv<()>>` is more private than the item `Tr5::required::{anon_assoc#0}`
--> $DIR/private-in-public-warn.rs:94:26
|
LL | fn required() -> impl PrivTr<Priv<()>>;
| ^^^^^^^^^^^^^^^^^^^^^ opaque type `Tr5::required::{anon_assoc#0}` is reachable at visibility `pub(crate)`
|
note: but trait `generics::PrivTr<generics::Priv<()>>` is only usable at visibility `pub(self)`
--> $DIR/private-in-public-warn.rs:83:5
|
LL | trait PrivTr<T> {}
| ^^^^^^^^^^^^^^^

error: type `generics::Priv<()>` is more private than the item `Tr5::required::{anon_assoc#0}`
--> $DIR/private-in-public-warn.rs:94:26
|
LL | fn required() -> impl PrivTr<Priv<()>>;
| ^^^^^^^^^^^^^^^^^^^^^ opaque type `Tr5::required::{anon_assoc#0}` is reachable at visibility `pub(crate)`
|
note: but type `generics::Priv<()>` is only usable at visibility `pub(self)`
--> $DIR/private-in-public-warn.rs:81:5
|
LL | struct Priv<T = u8>(T);
| ^^^^^^^^^^^^^^^^^^^

error[E0446]: private trait `generics::PrivTr<generics::Priv<()>>` in public interface
--> $DIR/private-in-public-warn.rs:97:26
|
LL | trait PrivTr<T> {}
| --------------- `generics::PrivTr<generics::Priv<()>>` declared as private
...
LL | fn provided() -> impl PrivTr<Priv<()>> {}
| ^^^^^^^^^^^^^^^^^^^^^ can't leak private trait

error[E0446]: private type `generics::Priv<()>` in public interface
--> $DIR/private-in-public-warn.rs:97:26
|
LL | struct Priv<T = u8>(T);
| ------------------- `generics::Priv<()>` declared as private
...
LL | fn provided() -> impl PrivTr<Priv<()>> {}
| ^^^^^^^^^^^^^^^^^^^^^ can't leak private type

error: trait `generics::PrivTr<generics::Priv<()>>` is more private than the item `Tr5::provided::{anon_assoc#0}`
--> $DIR/private-in-public-warn.rs:97:26
|
LL | fn provided() -> impl PrivTr<Priv<()>> {}
| ^^^^^^^^^^^^^^^^^^^^^ opaque type `Tr5::provided::{anon_assoc#0}` is reachable at visibility `pub(crate)`
|
note: but trait `generics::PrivTr<generics::Priv<()>>` is only usable at visibility `pub(self)`
--> $DIR/private-in-public-warn.rs:83:5
|
LL | trait PrivTr<T> {}
| ^^^^^^^^^^^^^^^

error: type `generics::Priv<()>` is more private than the item `Tr5::provided::{anon_assoc#0}`
--> $DIR/private-in-public-warn.rs:97:26
|
LL | fn provided() -> impl PrivTr<Priv<()>> {}
| ^^^^^^^^^^^^^^^^^^^^^ opaque type `Tr5::provided::{anon_assoc#0}` is reachable at visibility `pub(crate)`
|
note: but type `generics::Priv<()>` is only usable at visibility `pub(self)`
--> $DIR/private-in-public-warn.rs:81:5
|
LL | struct Priv<T = u8>(T);
| ^^^^^^^^^^^^^^^^^^^

error[E0446]: private type `impls::Priv` in public interface
--> $DIR/private-in-public-warn.rs:119:9
--> $DIR/private-in-public-warn.rs:128:9
|
LL | struct Priv;
| ----------- `impls::Priv` declared as private
Expand All @@ -312,19 +411,19 @@ LL | type Alias = Priv;
| ^^^^^^^^^^ can't leak private type

error: type `aliases_pub::Priv` is more private than the item `aliases_pub::<impl Pub2>::f`
--> $DIR/private-in-public-warn.rs:190:9
--> $DIR/private-in-public-warn.rs:199:9
|
LL | pub fn f(arg: Priv) {}
| ^^^^^^^^^^^^^^^^^^^ associated function `aliases_pub::<impl Pub2>::f` is reachable at visibility `pub(crate)`
|
note: but type `aliases_pub::Priv` is only usable at visibility `pub(self)`
--> $DIR/private-in-public-warn.rs:163:5
--> $DIR/private-in-public-warn.rs:172:5
|
LL | struct Priv;
| ^^^^^^^^^^^

error[E0446]: private type `aliases_pub::Priv` in public interface
--> $DIR/private-in-public-warn.rs:193:9
--> $DIR/private-in-public-warn.rs:202:9
|
LL | struct Priv;
| ----------- `aliases_pub::Priv` declared as private
Expand All @@ -333,7 +432,7 @@ LL | type Check = Priv;
| ^^^^^^^^^^ can't leak private type

error[E0446]: private type `aliases_pub::Priv` in public interface
--> $DIR/private-in-public-warn.rs:196:9
--> $DIR/private-in-public-warn.rs:205:9
|
LL | struct Priv;
| ----------- `aliases_pub::Priv` declared as private
Expand All @@ -342,7 +441,7 @@ LL | type Check = Priv;
| ^^^^^^^^^^ can't leak private type

error[E0446]: private type `aliases_pub::Priv` in public interface
--> $DIR/private-in-public-warn.rs:199:9
--> $DIR/private-in-public-warn.rs:208:9
|
LL | struct Priv;
| ----------- `aliases_pub::Priv` declared as private
Expand All @@ -351,7 +450,7 @@ LL | type Check = Priv;
| ^^^^^^^^^^ can't leak private type

error[E0446]: private type `aliases_pub::Priv` in public interface
--> $DIR/private-in-public-warn.rs:202:9
--> $DIR/private-in-public-warn.rs:211:9
|
LL | struct Priv;
| ----------- `aliases_pub::Priv` declared as private
Expand All @@ -360,37 +459,37 @@ LL | type Check = Priv;
| ^^^^^^^^^^ can't leak private type

error: trait `PrivTr1` is more private than the item `aliases_priv::Tr1`
--> $DIR/private-in-public-warn.rs:232:5
--> $DIR/private-in-public-warn.rs:241:5
|
LL | pub trait Tr1: PrivUseAliasTr {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ trait `aliases_priv::Tr1` is reachable at visibility `pub(crate)`
|
note: but trait `PrivTr1` is only usable at visibility `pub(self)`
--> $DIR/private-in-public-warn.rs:218:5
--> $DIR/private-in-public-warn.rs:227:5
|
LL | trait PrivTr1<T = u8> {
| ^^^^^^^^^^^^^^^^^^^^^

error: trait `PrivTr1<Priv2>` is more private than the item `aliases_priv::Tr2`
--> $DIR/private-in-public-warn.rs:234:5
--> $DIR/private-in-public-warn.rs:243:5
|
LL | pub trait Tr2: PrivUseAliasTr<PrivAlias> {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ trait `aliases_priv::Tr2` is reachable at visibility `pub(crate)`
|
note: but trait `PrivTr1<Priv2>` is only usable at visibility `pub(self)`
--> $DIR/private-in-public-warn.rs:218:5
--> $DIR/private-in-public-warn.rs:227:5
|
LL | trait PrivTr1<T = u8> {
| ^^^^^^^^^^^^^^^^^^^^^

error: type `Priv2` is more private than the item `aliases_priv::Tr2`
--> $DIR/private-in-public-warn.rs:234:5
--> $DIR/private-in-public-warn.rs:243:5
|
LL | pub trait Tr2: PrivUseAliasTr<PrivAlias> {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ trait `aliases_priv::Tr2` is reachable at visibility `pub(crate)`
|
note: but type `Priv2` is only usable at visibility `pub(self)`
--> $DIR/private-in-public-warn.rs:216:5
--> $DIR/private-in-public-warn.rs:225:5
|
LL | struct Priv2;
| ^^^^^^^^^^^^
Expand All @@ -410,7 +509,7 @@ LL | pub type Alias<T: PrivTr> = T;
= note: `#[warn(type_alias_bounds)]` on by default

warning: where clauses on type aliases are not enforced
--> $DIR/private-in-public-warn.rs:63:29
--> $DIR/private-in-public-warn.rs:66:29
|
LL | pub type Alias<T> where T: PrivTr = T;
| ------^^^^^^^^^
Expand All @@ -422,6 +521,6 @@ LL | pub type Alias<T> where T: PrivTr = T;
see issue #112792 <https://github.com/rust-lang/rust/issues/112792> for more information
= help: add `#![feature(lazy_type_alias)]` to the crate attributes to enable the desired semantics

error: aborting due to 34 previous errors; 2 warnings emitted
error: aborting due to 43 previous errors; 2 warnings emitted

For more information about this error, try `rustc --explain E0446`.
3 changes: 3 additions & 0 deletions tests/ui/privacy/pub-priv-dep/pub-priv1.rs
Original file line number Diff line number Diff line change
Expand Up @@ -74,8 +74,11 @@ pub trait MyPubTrait {
//~^ ERROR trait `OtherTrait` from private dependency 'priv_dep' in public interface

fn required_impl_trait() -> impl OtherTrait;
//~^ ERROR trait `OtherTrait` from private dependency 'priv_dep' in public interface

fn provided_impl_trait() -> impl OtherTrait { OtherType }
//~^ ERROR trait `OtherTrait` from private dependency 'priv_dep' in public interface
//~| ERROR trait `OtherTrait` from private dependency 'priv_dep' in public interface

fn required_concrete() -> OtherType;
//~^ ERROR type `OtherType` from private dependency 'priv_dep' in public interface
Expand Down
Loading
Loading