summaryrefslogtreecommitdiffstats
path: root/tests/ui/privacy
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-30 03:57:31 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-30 03:57:31 +0000
commitdc0db358abe19481e475e10c32149b53370f1a1c (patch)
treeab8ce99c4b255ce46f99ef402c27916055b899ee /tests/ui/privacy
parentReleasing progress-linux version 1.71.1+dfsg1-2~progress7.99u1. (diff)
downloadrustc-dc0db358abe19481e475e10c32149b53370f1a1c.tar.xz
rustc-dc0db358abe19481e475e10c32149b53370f1a1c.zip
Merging upstream version 1.72.1+dfsg1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'tests/ui/privacy')
-rw-r--r--tests/ui/privacy/effective_visibilities_full_priv.rs21
-rw-r--r--tests/ui/privacy/effective_visibilities_full_priv.stderr26
-rw-r--r--tests/ui/privacy/export-tag-variant.stderr4
-rw-r--r--tests/ui/privacy/privacy-in-paths.stderr12
-rw-r--r--tests/ui/privacy/privacy-ufcs.stderr4
-rw-r--r--tests/ui/privacy/privacy1.stderr28
-rw-r--r--tests/ui/privacy/private-in-public-non-principal.rs7
-rw-r--r--tests/ui/privacy/private-in-public-non-principal.stderr25
-rw-r--r--tests/ui/privacy/private-inferred-type-1.rs10
-rw-r--r--tests/ui/privacy/private-inferred-type-1.stderr18
-rw-r--r--tests/ui/privacy/sealed-traits/private-trait-non-local.rs4
-rw-r--r--tests/ui/privacy/sealed-traits/private-trait-non-local.stderr12
-rw-r--r--tests/ui/privacy/sealed-traits/private-trait.rs10
-rw-r--r--tests/ui/privacy/sealed-traits/private-trait.stderr17
-rw-r--r--tests/ui/privacy/sealed-traits/re-exported-trait.fixed13
-rw-r--r--tests/ui/privacy/sealed-traits/re-exported-trait.rs13
-rw-r--r--tests/ui/privacy/sealed-traits/re-exported-trait.stderr19
-rw-r--r--tests/ui/privacy/sealed-traits/sealed-trait-local.rs19
-rw-r--r--tests/ui/privacy/sealed-traits/sealed-trait-local.stderr16
-rw-r--r--tests/ui/privacy/unnameable_types.rs30
-rw-r--r--tests/ui/privacy/unnameable_types.stderr38
-rw-r--r--tests/ui/privacy/where-priv-type.rs12
-rw-r--r--tests/ui/privacy/where-priv-type.stderr108
-rw-r--r--tests/ui/privacy/where-pub-type-impls-priv-trait.rs10
-rw-r--r--tests/ui/privacy/where-pub-type-impls-priv-trait.stderr87
25 files changed, 534 insertions, 29 deletions
diff --git a/tests/ui/privacy/effective_visibilities_full_priv.rs b/tests/ui/privacy/effective_visibilities_full_priv.rs
new file mode 100644
index 000000000..a26ae3bd1
--- /dev/null
+++ b/tests/ui/privacy/effective_visibilities_full_priv.rs
@@ -0,0 +1,21 @@
+#![feature(rustc_attrs)]
+#![allow(private_in_public)]
+
+struct SemiPriv;
+
+mod m {
+ #[rustc_effective_visibility]
+ struct Priv;
+ //~^ ERROR not in the table
+ //~| ERROR not in the table
+
+ #[rustc_effective_visibility]
+ pub fn foo() {} //~ ERROR Direct: pub(crate), Reexported: pub(crate), Reachable: pub(crate), ReachableThroughImplTrait: pub(crate)
+
+ #[rustc_effective_visibility]
+ impl crate::SemiPriv { //~ ERROR Direct: pub(crate), Reexported: pub(crate), Reachable: pub(crate), ReachableThroughImplTrait: pub(crate)
+ pub fn f(_: Priv) {}
+ }
+}
+
+fn main() {}
diff --git a/tests/ui/privacy/effective_visibilities_full_priv.stderr b/tests/ui/privacy/effective_visibilities_full_priv.stderr
new file mode 100644
index 000000000..29d82e2ee
--- /dev/null
+++ b/tests/ui/privacy/effective_visibilities_full_priv.stderr
@@ -0,0 +1,26 @@
+error: not in the table
+ --> $DIR/effective_visibilities_full_priv.rs:8:5
+ |
+LL | struct Priv;
+ | ^^^^^^^^^^^
+
+error: not in the table
+ --> $DIR/effective_visibilities_full_priv.rs:8:5
+ |
+LL | struct Priv;
+ | ^^^^^^^^^^^
+
+error: Direct: pub(crate), Reexported: pub(crate), Reachable: pub(crate), ReachableThroughImplTrait: pub(crate)
+ --> $DIR/effective_visibilities_full_priv.rs:13:5
+ |
+LL | pub fn foo() {}
+ | ^^^^^^^^^^^^
+
+error: Direct: pub(crate), Reexported: pub(crate), Reachable: pub(crate), ReachableThroughImplTrait: pub(crate)
+ --> $DIR/effective_visibilities_full_priv.rs:16:5
+ |
+LL | impl crate::SemiPriv {
+ | ^^^^^^^^^^^^^^^^^^^^
+
+error: aborting due to 4 previous errors
+
diff --git a/tests/ui/privacy/export-tag-variant.stderr b/tests/ui/privacy/export-tag-variant.stderr
index f73bd454d..e8906985e 100644
--- a/tests/ui/privacy/export-tag-variant.stderr
+++ b/tests/ui/privacy/export-tag-variant.stderr
@@ -2,7 +2,9 @@ error[E0603]: enum `Y` is private
--> $DIR/export-tag-variant.rs:7:26
|
LL | fn main() { let z = foo::Y::Y1; }
- | ^ private enum
+ | ^ -- unit variant `Y1` is not publicly re-exported
+ | |
+ | private enum
|
note: the enum `Y` is defined here
--> $DIR/export-tag-variant.rs:4:5
diff --git a/tests/ui/privacy/privacy-in-paths.stderr b/tests/ui/privacy/privacy-in-paths.stderr
index 2eb3ebb51..9c3d5e97c 100644
--- a/tests/ui/privacy/privacy-in-paths.stderr
+++ b/tests/ui/privacy/privacy-in-paths.stderr
@@ -2,7 +2,9 @@ error[E0603]: module `bar` is private
--> $DIR/privacy-in-paths.rs:24:16
|
LL | ::foo::bar::baz::f();
- | ^^^ private module
+ | ^^^ - function `f` is not publicly re-exported
+ | |
+ | private module
|
note: the module `bar` is defined here
--> $DIR/privacy-in-paths.rs:3:5
@@ -21,12 +23,18 @@ note: the module `bar` is defined here
|
LL | mod bar {
| ^^^^^^^
+help: consider importing this struct through its public re-export instead
+ |
+LL | foo::S::f();
+ | ~~~~~~
error[E0603]: trait `T` is private
--> $DIR/privacy-in-paths.rs:26:23
|
LL | <() as ::foo::T>::Assoc::f();
- | ^ private trait
+ | ^ ----- associated type `Assoc` is not publicly re-exported
+ | |
+ | private trait
|
note: the trait `T` is defined here
--> $DIR/privacy-in-paths.rs:8:5
diff --git a/tests/ui/privacy/privacy-ufcs.stderr b/tests/ui/privacy/privacy-ufcs.stderr
index e93a458ce..f45f3d8ec 100644
--- a/tests/ui/privacy/privacy-ufcs.stderr
+++ b/tests/ui/privacy/privacy-ufcs.stderr
@@ -2,7 +2,9 @@ error[E0603]: trait `Bar` is private
--> $DIR/privacy-ufcs.rs:12:20
|
LL | <i32 as ::foo::Bar>::baz();
- | ^^^ private trait
+ | ^^^ --- associated function `baz` is not publicly re-exported
+ | |
+ | private trait
|
note: the trait `Bar` is defined here
--> $DIR/privacy-ufcs.rs:4:5
diff --git a/tests/ui/privacy/privacy1.stderr b/tests/ui/privacy/privacy1.stderr
index 6ebed8ee0..ca8f242e0 100644
--- a/tests/ui/privacy/privacy1.stderr
+++ b/tests/ui/privacy/privacy1.stderr
@@ -50,7 +50,9 @@ error[E0603]: module `baz` is private
--> $DIR/privacy1.rs:104:16
|
LL | ::bar::baz::A::foo();
- | ^^^ private module
+ | ^^^ - struct `A` is not publicly re-exported
+ | |
+ | private module
|
note: the module `baz` is defined here
--> $DIR/privacy1.rs:50:5
@@ -62,7 +64,9 @@ error[E0603]: module `baz` is private
--> $DIR/privacy1.rs:105:16
|
LL | ::bar::baz::A::bar();
- | ^^^ private module
+ | ^^^ - struct `A` is not publicly re-exported
+ | |
+ | private module
|
note: the module `baz` is defined here
--> $DIR/privacy1.rs:50:5
@@ -74,7 +78,9 @@ error[E0603]: module `baz` is private
--> $DIR/privacy1.rs:107:16
|
LL | ::bar::baz::A.foo2();
- | ^^^ private module
+ | ^^^ - unit struct `A` is not publicly re-exported
+ | |
+ | private module
|
note: the module `baz` is defined here
--> $DIR/privacy1.rs:50:5
@@ -86,7 +92,9 @@ error[E0603]: module `baz` is private
--> $DIR/privacy1.rs:108:16
|
LL | ::bar::baz::A.bar2();
- | ^^^ private module
+ | ^^^ - unit struct `A` is not publicly re-exported
+ | |
+ | private module
|
note: the module `baz` is defined here
--> $DIR/privacy1.rs:50:5
@@ -98,7 +106,9 @@ error[E0603]: trait `B` is private
--> $DIR/privacy1.rs:112:16
|
LL | ::bar::B::foo();
- | ^ private trait
+ | ^ --- associated function `foo` is not publicly re-exported
+ | |
+ | private trait
|
note: the trait `B` is defined here
--> $DIR/privacy1.rs:40:5
@@ -129,6 +139,10 @@ note: the module `baz` is defined here
|
LL | mod baz {
| ^^^^^^^
+help: consider importing this function through its public re-export instead
+ |
+LL | bar::foo();
+ | ~~~~~~~~
error[E0603]: module `baz` is private
--> $DIR/privacy1.rs:128:16
@@ -141,6 +155,10 @@ note: the module `baz` is defined here
|
LL | mod baz {
| ^^^^^^^
+help: consider importing this function through its public re-export instead
+ |
+LL | bar::bar();
+ | ~~~~~~~~
error[E0603]: trait `B` is private
--> $DIR/privacy1.rs:157:17
diff --git a/tests/ui/privacy/private-in-public-non-principal.rs b/tests/ui/privacy/private-in-public-non-principal.rs
index ac1d5a9e6..a2284c930 100644
--- a/tests/ui/privacy/private-in-public-non-principal.rs
+++ b/tests/ui/privacy/private-in-public-non-principal.rs
@@ -1,5 +1,11 @@
#![feature(auto_traits)]
#![feature(negative_impls)]
+#![feature(type_privacy_lints)]
+#![deny(private_interfaces)]
+
+// In this test both old and new private-in-public diagnostic were emitted.
+// Old diagnostic will be deleted soon.
+// See https://rust-lang.github.io/rfcs/2145-type-privacy.html.
pub trait PubPrincipal {}
auto trait PrivNonPrincipal {}
@@ -7,6 +13,7 @@ auto trait PrivNonPrincipal {}
pub fn leak_dyn_nonprincipal() -> Box<dyn PubPrincipal + PrivNonPrincipal> { loop {} }
//~^ WARN private trait `PrivNonPrincipal` in public interface
//~| WARN this was previously accepted
+//~| ERROR trait `PrivNonPrincipal` is more private than the item `leak_dyn_nonprincipal`
#[deny(missing_docs)]
fn container() {
diff --git a/tests/ui/privacy/private-in-public-non-principal.stderr b/tests/ui/privacy/private-in-public-non-principal.stderr
index de20cada4..1387f59cb 100644
--- a/tests/ui/privacy/private-in-public-non-principal.stderr
+++ b/tests/ui/privacy/private-in-public-non-principal.stderr
@@ -1,5 +1,5 @@
warning: private trait `PrivNonPrincipal` in public interface (error E0445)
- --> $DIR/private-in-public-non-principal.rs:7:1
+ --> $DIR/private-in-public-non-principal.rs:13:1
|
LL | pub fn leak_dyn_nonprincipal() -> Box<dyn PubPrincipal + PrivNonPrincipal> { loop {} }
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -8,17 +8,34 @@ LL | pub fn leak_dyn_nonprincipal() -> Box<dyn PubPrincipal + PrivNonPrincipal>
= note: for more information, see issue #34537 <https://github.com/rust-lang/rust/issues/34537>
= note: `#[warn(private_in_public)]` on by default
+error: trait `PrivNonPrincipal` is more private than the item `leak_dyn_nonprincipal`
+ --> $DIR/private-in-public-non-principal.rs:13:1
+ |
+LL | pub fn leak_dyn_nonprincipal() -> Box<dyn PubPrincipal + PrivNonPrincipal> { loop {} }
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ function `leak_dyn_nonprincipal` is reachable at visibility `pub`
+ |
+note: but trait `PrivNonPrincipal` is only usable at visibility `pub(crate)`
+ --> $DIR/private-in-public-non-principal.rs:11:1
+ |
+LL | auto trait PrivNonPrincipal {}
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^
+note: the lint level is defined here
+ --> $DIR/private-in-public-non-principal.rs:4:9
+ |
+LL | #![deny(private_interfaces)]
+ | ^^^^^^^^^^^^^^^^^^
+
error: missing documentation for an associated function
- --> $DIR/private-in-public-non-principal.rs:14:9
+ --> $DIR/private-in-public-non-principal.rs:21:9
|
LL | pub fn check_doc_lint() {}
| ^^^^^^^^^^^^^^^^^^^^^^^
|
note: the lint level is defined here
- --> $DIR/private-in-public-non-principal.rs:11:8
+ --> $DIR/private-in-public-non-principal.rs:18:8
|
LL | #[deny(missing_docs)]
| ^^^^^^^^^^^^
-error: aborting due to previous error; 1 warning emitted
+error: aborting due to 2 previous errors; 1 warning emitted
diff --git a/tests/ui/privacy/private-inferred-type-1.rs b/tests/ui/privacy/private-inferred-type-1.rs
index d633189e3..b3eba53dd 100644
--- a/tests/ui/privacy/private-inferred-type-1.rs
+++ b/tests/ui/privacy/private-inferred-type-1.rs
@@ -5,14 +5,24 @@ trait TyParam {
fn ty_param_secret(&self);
}
+trait Ref {
+ fn ref_secret(self);
+}
+
mod m {
struct Priv;
impl ::Arr0 for [Priv; 0] { fn arr0_secret(&self) {} }
impl ::TyParam for Option<Priv> { fn ty_param_secret(&self) {} }
+ impl<'a> ::Ref for &'a Priv { fn ref_secret(self) {} }
}
+fn anyref<'a, T>() -> &'a T { panic!() }
+
fn main() {
[].arr0_secret(); //~ ERROR type `Priv` is private
None.ty_param_secret(); //~ ERROR type `Priv` is private
+ Ref::ref_secret(anyref());
+ //~^ ERROR type `Priv` is private
+ //~| ERROR type `Priv` is private
}
diff --git a/tests/ui/privacy/private-inferred-type-1.stderr b/tests/ui/privacy/private-inferred-type-1.stderr
index 245789f43..47c11d6ec 100644
--- a/tests/ui/privacy/private-inferred-type-1.stderr
+++ b/tests/ui/privacy/private-inferred-type-1.stderr
@@ -1,14 +1,26 @@
error: type `Priv` is private
- --> $DIR/private-inferred-type-1.rs:16:5
+ --> $DIR/private-inferred-type-1.rs:23:5
|
LL | [].arr0_secret();
| ^^^^^^^^^^^^^^^^ private type
error: type `Priv` is private
- --> $DIR/private-inferred-type-1.rs:17:5
+ --> $DIR/private-inferred-type-1.rs:24:5
|
LL | None.ty_param_secret();
| ^^^^^^^^^^^^^^^^^^^^^^ private type
-error: aborting due to 2 previous errors
+error: type `Priv` is private
+ --> $DIR/private-inferred-type-1.rs:25:5
+ |
+LL | Ref::ref_secret(anyref());
+ | ^^^^^^^^^^^^^^^ private type
+
+error: type `Priv` is private
+ --> $DIR/private-inferred-type-1.rs:25:21
+ |
+LL | Ref::ref_secret(anyref());
+ | ^^^^^^^^ private type
+
+error: aborting due to 4 previous errors
diff --git a/tests/ui/privacy/sealed-traits/private-trait-non-local.rs b/tests/ui/privacy/sealed-traits/private-trait-non-local.rs
new file mode 100644
index 000000000..426f21cc7
--- /dev/null
+++ b/tests/ui/privacy/sealed-traits/private-trait-non-local.rs
@@ -0,0 +1,4 @@
+extern crate core;
+use core::slice::index::private_slice_index::Sealed; //~ ERROR module `index` is private
+fn main() {
+}
diff --git a/tests/ui/privacy/sealed-traits/private-trait-non-local.stderr b/tests/ui/privacy/sealed-traits/private-trait-non-local.stderr
new file mode 100644
index 000000000..294999798
--- /dev/null
+++ b/tests/ui/privacy/sealed-traits/private-trait-non-local.stderr
@@ -0,0 +1,12 @@
+error[E0603]: module `index` is private
+ --> $DIR/private-trait-non-local.rs:2:18
+ |
+LL | use core::slice::index::private_slice_index::Sealed;
+ | ^^^^^ private module ------ trait `Sealed` is not publicly re-exported
+ |
+note: the module `index` is defined here
+ --> $SRC_DIR/core/src/slice/mod.rs:LL:COL
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0603`.
diff --git a/tests/ui/privacy/sealed-traits/private-trait.rs b/tests/ui/privacy/sealed-traits/private-trait.rs
new file mode 100644
index 000000000..bbcbaabfa
--- /dev/null
+++ b/tests/ui/privacy/sealed-traits/private-trait.rs
@@ -0,0 +1,10 @@
+pub mod a {
+ mod b {
+ pub trait Hidden {}
+ }
+}
+
+struct S;
+impl a::b::Hidden for S {} //~ ERROR module `b` is private
+
+fn main() {}
diff --git a/tests/ui/privacy/sealed-traits/private-trait.stderr b/tests/ui/privacy/sealed-traits/private-trait.stderr
new file mode 100644
index 000000000..c7ec72ff1
--- /dev/null
+++ b/tests/ui/privacy/sealed-traits/private-trait.stderr
@@ -0,0 +1,17 @@
+error[E0603]: module `b` is private
+ --> $DIR/private-trait.rs:8:9
+ |
+LL | impl a::b::Hidden for S {}
+ | ^ ------ trait `Hidden` is not publicly re-exported
+ | |
+ | private module
+ |
+note: the module `b` is defined here
+ --> $DIR/private-trait.rs:2:5
+ |
+LL | mod b {
+ | ^^^^^
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0603`.
diff --git a/tests/ui/privacy/sealed-traits/re-exported-trait.fixed b/tests/ui/privacy/sealed-traits/re-exported-trait.fixed
new file mode 100644
index 000000000..79b6a6516
--- /dev/null
+++ b/tests/ui/privacy/sealed-traits/re-exported-trait.fixed
@@ -0,0 +1,13 @@
+// run-rustfix
+
+pub mod a {
+ pub use self::b::Trait;
+ mod b {
+ pub trait Trait {}
+ }
+}
+
+struct S;
+impl a::Trait for S {} //~ ERROR module `b` is private
+
+fn main() {}
diff --git a/tests/ui/privacy/sealed-traits/re-exported-trait.rs b/tests/ui/privacy/sealed-traits/re-exported-trait.rs
new file mode 100644
index 000000000..5f96dfdcb
--- /dev/null
+++ b/tests/ui/privacy/sealed-traits/re-exported-trait.rs
@@ -0,0 +1,13 @@
+// run-rustfix
+
+pub mod a {
+ pub use self::b::Trait;
+ mod b {
+ pub trait Trait {}
+ }
+}
+
+struct S;
+impl a::b::Trait for S {} //~ ERROR module `b` is private
+
+fn main() {}
diff --git a/tests/ui/privacy/sealed-traits/re-exported-trait.stderr b/tests/ui/privacy/sealed-traits/re-exported-trait.stderr
new file mode 100644
index 000000000..b630565d0
--- /dev/null
+++ b/tests/ui/privacy/sealed-traits/re-exported-trait.stderr
@@ -0,0 +1,19 @@
+error[E0603]: module `b` is private
+ --> $DIR/re-exported-trait.rs:11:9
+ |
+LL | impl a::b::Trait for S {}
+ | ^ private module
+ |
+note: the module `b` is defined here
+ --> $DIR/re-exported-trait.rs:5:5
+ |
+LL | mod b {
+ | ^^^^^
+help: consider importing this trait through its public re-export instead
+ |
+LL | impl a::Trait for S {}
+ | ~~~~~~~~
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0603`.
diff --git a/tests/ui/privacy/sealed-traits/sealed-trait-local.rs b/tests/ui/privacy/sealed-traits/sealed-trait-local.rs
new file mode 100644
index 000000000..778ddf0f8
--- /dev/null
+++ b/tests/ui/privacy/sealed-traits/sealed-trait-local.rs
@@ -0,0 +1,19 @@
+// provide custom privacy error for sealed traits
+pub mod a {
+ pub trait Sealed: self::b::Hidden {
+ fn foo() {}
+ }
+
+ struct X;
+ impl Sealed for X {}
+ impl self::b::Hidden for X {}
+
+ mod b {
+ pub trait Hidden {}
+ }
+}
+
+struct S;
+impl a::Sealed for S {} //~ ERROR the trait bound `S: Hidden` is not satisfied
+
+fn main() {}
diff --git a/tests/ui/privacy/sealed-traits/sealed-trait-local.stderr b/tests/ui/privacy/sealed-traits/sealed-trait-local.stderr
new file mode 100644
index 000000000..d1052ce35
--- /dev/null
+++ b/tests/ui/privacy/sealed-traits/sealed-trait-local.stderr
@@ -0,0 +1,16 @@
+error[E0277]: the trait bound `S: Hidden` is not satisfied
+ --> $DIR/sealed-trait-local.rs:17:20
+ |
+LL | impl a::Sealed for S {}
+ | ^ the trait `Hidden` is not implemented for `S`
+ |
+note: required by a bound in `Sealed`
+ --> $DIR/sealed-trait-local.rs:3:23
+ |
+LL | pub trait Sealed: self::b::Hidden {
+ | ^^^^^^^^^^^^^^^ required by this bound in `Sealed`
+ = note: `Sealed` is a "sealed trait", because to implement it you also need to implelement `a::b::Hidden`, which is not accessible; this is usually done to force you to use one of the provided types that already implement it
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0277`.
diff --git a/tests/ui/privacy/unnameable_types.rs b/tests/ui/privacy/unnameable_types.rs
new file mode 100644
index 000000000..eae20dd9d
--- /dev/null
+++ b/tests/ui/privacy/unnameable_types.rs
@@ -0,0 +1,30 @@
+#![feature(type_privacy_lints)]
+#![allow(private_in_public)]
+#![deny(unnameable_types)]
+
+mod m {
+ pub struct PubStruct(pub i32); //~ ERROR struct `PubStruct` is reachable but cannot be named
+
+ pub enum PubE { //~ ERROR enum `PubE` is reachable but cannot be named
+ V(i32),
+ }
+
+ pub trait PubTr { //~ ERROR trait `PubTr` is reachable but cannot be named
+ const C : i32 = 0;
+ type Alias; //~ ERROR associated type `PubTr::Alias` is reachable but cannot be named
+ fn f() {}
+ }
+
+ impl PubTr for PubStruct {
+ type Alias = i32; //~ ERROR associated type `<PubStruct as PubTr>::Alias` is reachable but cannot be named
+ fn f() {}
+ }
+}
+
+pub trait Voldemort<T> {}
+
+impl Voldemort<m::PubStruct> for i32 {}
+impl Voldemort<m::PubE> for i32 {}
+impl<T> Voldemort<T> for u32 where T: m::PubTr {}
+
+fn main() {}
diff --git a/tests/ui/privacy/unnameable_types.stderr b/tests/ui/privacy/unnameable_types.stderr
new file mode 100644
index 000000000..25eb5c943
--- /dev/null
+++ b/tests/ui/privacy/unnameable_types.stderr
@@ -0,0 +1,38 @@
+error: struct `PubStruct` is reachable but cannot be named
+ --> $DIR/unnameable_types.rs:6:5
+ |
+LL | pub struct PubStruct(pub i32);
+ | ^^^^^^^^^^^^^^^^^^^^ reachable at visibility `pub`, but can only be named at visibility `pub(crate)`
+ |
+note: the lint level is defined here
+ --> $DIR/unnameable_types.rs:3:9
+ |
+LL | #![deny(unnameable_types)]
+ | ^^^^^^^^^^^^^^^^
+
+error: enum `PubE` is reachable but cannot be named
+ --> $DIR/unnameable_types.rs:8:5
+ |
+LL | pub enum PubE {
+ | ^^^^^^^^^^^^^ reachable at visibility `pub`, but can only be named at visibility `pub(crate)`
+
+error: trait `PubTr` is reachable but cannot be named
+ --> $DIR/unnameable_types.rs:12:5
+ |
+LL | pub trait PubTr {
+ | ^^^^^^^^^^^^^^^ reachable at visibility `pub`, but can only be named at visibility `pub(crate)`
+
+error: associated type `PubTr::Alias` is reachable but cannot be named
+ --> $DIR/unnameable_types.rs:14:9
+ |
+LL | type Alias;
+ | ^^^^^^^^^^ reachable at visibility `pub`, but can only be named at visibility `pub(crate)`
+
+error: associated type `<PubStruct as PubTr>::Alias` is reachable but cannot be named
+ --> $DIR/unnameable_types.rs:19:9
+ |
+LL | type Alias = i32;
+ | ^^^^^^^^^^ reachable at visibility `pub`, but can only be named at visibility `pub(crate)`
+
+error: aborting due to 5 previous errors
+
diff --git a/tests/ui/privacy/where-priv-type.rs b/tests/ui/privacy/where-priv-type.rs
index 66ee9c4bb..2e0a6b3e7 100644
--- a/tests/ui/privacy/where-priv-type.rs
+++ b/tests/ui/privacy/where-priv-type.rs
@@ -3,8 +3,14 @@
#![crate_type = "lib"]
#![feature(generic_const_exprs)]
+#![feature(type_privacy_lints)]
#![allow(incomplete_features)]
+#![warn(private_bounds)]
+#![warn(private_interfaces)]
+// In this test both old and new private-in-public diagnostic were emitted.
+// Old diagnostic will be deleted soon.
+// See https://rust-lang.github.io/rfcs/2145-type-privacy.html.
struct PrivTy;
trait PrivTr {}
@@ -19,6 +25,7 @@ impl PubTrWithAssocTy for PrivTy { type AssocTy = PrivTy; }
pub struct S
//~^ WARNING private type `PrivTy` in public interface
//~| WARNING hard error
+//~| WARNING type `PrivTy` is more private than the item `S`
where
PrivTy:
{}
@@ -27,6 +34,7 @@ where
pub enum E
//~^ WARNING private type `PrivTy` in public interface
//~| WARNING hard error
+//~| WARNING type `PrivTy` is more private than the item `E`
where
PrivTy:
{}
@@ -35,6 +43,7 @@ where
pub fn f()
//~^ WARNING private type `PrivTy` in public interface
//~| WARNING hard error
+//~| WARNING type `PrivTy` is more private than the item `f`
where
PrivTy:
{}
@@ -42,12 +51,14 @@ where
impl S
//~^ ERROR private type `PrivTy` in public interface
+//~| WARNING type `PrivTy` is more private than the item `S`
where
PrivTy:
{
pub fn f()
//~^ WARNING private type `PrivTy` in public interface
//~| WARNING hard error
+ //~| WARNING type `PrivTy` is more private than the item `S::f`
where
PrivTy:
{}
@@ -79,6 +90,7 @@ where
{
type AssocTy = Const<{ my_const_fn(U) }>;
//~^ ERROR private type
+ //~| WARNING type `fn(u8) -> u8 {my_const_fn}` is more private than the item `<Const<U> as Trait>::AssocTy`
fn assoc_fn() -> Self::AssocTy {
Const
}
diff --git a/tests/ui/privacy/where-priv-type.stderr b/tests/ui/privacy/where-priv-type.stderr
index c5fb2cdb0..d6baf22b3 100644
--- a/tests/ui/privacy/where-priv-type.stderr
+++ b/tests/ui/privacy/where-priv-type.stderr
@@ -1,5 +1,5 @@
warning: private type `PrivTy` in public interface (error E0446)
- --> $DIR/where-priv-type.rs:19:1
+ --> $DIR/where-priv-type.rs:25:1
|
LL | pub struct S
| ^^^^^^^^^^^^
@@ -8,8 +8,25 @@ LL | pub struct S
= note: for more information, see issue #34537 <https://github.com/rust-lang/rust/issues/34537>
= note: `#[warn(private_in_public)]` on by default
+warning: type `PrivTy` is more private than the item `S`
+ --> $DIR/where-priv-type.rs:25:1
+ |
+LL | pub struct S
+ | ^^^^^^^^^^^^ struct `S` is reachable at visibility `pub`
+ |
+note: but type `PrivTy` is only usable at visibility `pub(crate)`
+ --> $DIR/where-priv-type.rs:15:1
+ |
+LL | struct PrivTy;
+ | ^^^^^^^^^^^^^
+note: the lint level is defined here
+ --> $DIR/where-priv-type.rs:8:9
+ |
+LL | #![warn(private_bounds)]
+ | ^^^^^^^^^^^^^^
+
warning: private type `PrivTy` in public interface (error E0446)
- --> $DIR/where-priv-type.rs:27:1
+ --> $DIR/where-priv-type.rs:34:1
|
LL | pub enum E
| ^^^^^^^^^^
@@ -17,12 +34,25 @@ LL | pub enum E
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
= note: for more information, see issue #34537 <https://github.com/rust-lang/rust/issues/34537>
+warning: type `PrivTy` is more private than the item `E`
+ --> $DIR/where-priv-type.rs:34:1
+ |
+LL | pub enum E
+ | ^^^^^^^^^^ enum `E` is reachable at visibility `pub`
+ |
+note: but type `PrivTy` is only usable at visibility `pub(crate)`
+ --> $DIR/where-priv-type.rs:15:1
+ |
+LL | struct PrivTy;
+ | ^^^^^^^^^^^^^
+
warning: private type `PrivTy` in public interface (error E0446)
- --> $DIR/where-priv-type.rs:35:1
+ --> $DIR/where-priv-type.rs:43:1
|
LL | / pub fn f()
LL | |
LL | |
+LL | |
LL | | where
LL | | PrivTy:
| |___________^
@@ -30,21 +60,51 @@ LL | | PrivTy:
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
= note: for more information, see issue #34537 <https://github.com/rust-lang/rust/issues/34537>
-error[E0446]: private type `PrivTy` in public interface
+warning: type `PrivTy` is more private than the item `f`
--> $DIR/where-priv-type.rs:43:1
|
+LL | / pub fn f()
+LL | |
+LL | |
+LL | |
+LL | | where
+LL | | PrivTy:
+ | |___________^ function `f` is reachable at visibility `pub`
+ |
+note: but type `PrivTy` is only usable at visibility `pub(crate)`
+ --> $DIR/where-priv-type.rs:15:1
+ |
+LL | struct PrivTy;
+ | ^^^^^^^^^^^^^
+
+error[E0446]: private type `PrivTy` in public interface
+ --> $DIR/where-priv-type.rs:52:1
+ |
LL | struct PrivTy;
| ------------- `PrivTy` declared as private
...
LL | impl S
| ^^^^^^ can't leak private type
+warning: type `PrivTy` is more private than the item `S`
+ --> $DIR/where-priv-type.rs:52:1
+ |
+LL | impl S
+ | ^^^^^^ implementation `S` is reachable at visibility `pub`
+ |
+note: but type `PrivTy` is only usable at visibility `pub(crate)`
+ --> $DIR/where-priv-type.rs:15:1
+ |
+LL | struct PrivTy;
+ | ^^^^^^^^^^^^^
+
warning: private type `PrivTy` in public interface (error E0446)
- --> $DIR/where-priv-type.rs:48:5
+ --> $DIR/where-priv-type.rs:58:5
|
LL | / pub fn f()
LL | |
LL | |
+LL | |
LL | | where
LL | | PrivTy:
| |_______________^
@@ -52,8 +112,25 @@ LL | | PrivTy:
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
= note: for more information, see issue #34537 <https://github.com/rust-lang/rust/issues/34537>
+warning: type `PrivTy` is more private than the item `S::f`
+ --> $DIR/where-priv-type.rs:58:5
+ |
+LL | / pub fn f()
+LL | |
+LL | |
+LL | |
+LL | | where
+LL | | PrivTy:
+ | |_______________^ associated function `S::f` is reachable at visibility `pub`
+ |
+note: but type `PrivTy` is only usable at visibility `pub(crate)`
+ --> $DIR/where-priv-type.rs:15:1
+ |
+LL | struct PrivTy;
+ | ^^^^^^^^^^^^^
+
error[E0446]: private type `fn(u8) -> u8 {my_const_fn}` in public interface
- --> $DIR/where-priv-type.rs:80:5
+ --> $DIR/where-priv-type.rs:91:5
|
LL | type AssocTy = Const<{ my_const_fn(U) }>;
| ^^^^^^^^^^^^ can't leak private type
@@ -61,6 +138,23 @@ LL | type AssocTy = Const<{ my_const_fn(U) }>;
LL | const fn my_const_fn(val: u8) -> u8 {
| ----------------------------------- `fn(u8) -> u8 {my_const_fn}` declared as private
-error: aborting due to 2 previous errors; 4 warnings emitted
+warning: type `fn(u8) -> u8 {my_const_fn}` is more private than the item `<Const<U> as Trait>::AssocTy`
+ --> $DIR/where-priv-type.rs:91:5
+ |
+LL | type AssocTy = Const<{ my_const_fn(U) }>;
+ | ^^^^^^^^^^^^ associated type `<Const<U> as Trait>::AssocTy` is reachable at visibility `pub`
+ |
+note: but type `fn(u8) -> u8 {my_const_fn}` is only usable at visibility `pub(crate)`
+ --> $DIR/where-priv-type.rs:99:1
+ |
+LL | const fn my_const_fn(val: u8) -> u8 {
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+note: the lint level is defined here
+ --> $DIR/where-priv-type.rs:9:9
+ |
+LL | #![warn(private_interfaces)]
+ | ^^^^^^^^^^^^^^^^^^
+
+error: aborting due to 2 previous errors; 10 warnings emitted
For more information about this error, try `rustc --explain E0446`.
diff --git a/tests/ui/privacy/where-pub-type-impls-priv-trait.rs b/tests/ui/privacy/where-pub-type-impls-priv-trait.rs
index 87c211df1..c59fdb7c7 100644
--- a/tests/ui/privacy/where-pub-type-impls-priv-trait.rs
+++ b/tests/ui/privacy/where-pub-type-impls-priv-trait.rs
@@ -2,8 +2,13 @@
#![crate_type = "lib"]
#![feature(generic_const_exprs)]
+#![feature(type_privacy_lints)]
#![allow(incomplete_features)]
+#![warn(private_bounds)]
+// In this test both old and new private-in-public diagnostic were emitted.
+// Old diagnostic will be deleted soon.
+// See https://rust-lang.github.io/rfcs/2145-type-privacy.html.
struct PrivTy;
trait PrivTr {}
@@ -18,6 +23,7 @@ impl PubTrWithAssocTy for PrivTy { type AssocTy = PrivTy; }
pub struct S
//~^ ERROR private trait `PrivTr` in public interface
+//~| WARNING trait `PrivTr` is more private than the item `S`
where
PubTy: PrivTr
{}
@@ -25,6 +31,7 @@ where
pub enum E
//~^ ERROR private trait `PrivTr` in public interface
+//~| WARNING trait `PrivTr` is more private than the item `E`
where
PubTy: PrivTr
{}
@@ -32,6 +39,7 @@ where
pub fn f()
//~^ ERROR private trait `PrivTr` in public interface
+//~| WARNING trait `PrivTr` is more private than the item `f`
where
PubTy: PrivTr
{}
@@ -39,11 +47,13 @@ where
impl S
//~^ ERROR private trait `PrivTr` in public interface
+//~| WARNING trait `PrivTr` is more private than the item `S`
where
PubTy: PrivTr
{
pub fn f()
//~^ ERROR private trait `PrivTr` in public interface
+ //~| WARNING trait `PrivTr` is more private than the item `S::f`
where
PubTy: PrivTr
{}
diff --git a/tests/ui/privacy/where-pub-type-impls-priv-trait.stderr b/tests/ui/privacy/where-pub-type-impls-priv-trait.stderr
index a433cebbb..e2d7ce446 100644
--- a/tests/ui/privacy/where-pub-type-impls-priv-trait.stderr
+++ b/tests/ui/privacy/where-pub-type-impls-priv-trait.stderr
@@ -1,5 +1,5 @@
error[E0445]: private trait `PrivTr` in public interface
- --> $DIR/where-pub-type-impls-priv-trait.rs:19:1
+ --> $DIR/where-pub-type-impls-priv-trait.rs:24:1
|
LL | trait PrivTr {}
| ------------ `PrivTr` declared as private
@@ -7,8 +7,25 @@ LL | trait PrivTr {}
LL | pub struct S
| ^^^^^^^^^^^^ can't leak private trait
+warning: trait `PrivTr` is more private than the item `S`
+ --> $DIR/where-pub-type-impls-priv-trait.rs:24:1
+ |
+LL | pub struct S
+ | ^^^^^^^^^^^^ struct `S` is reachable at visibility `pub`
+ |
+note: but trait `PrivTr` is only usable at visibility `pub(crate)`
+ --> $DIR/where-pub-type-impls-priv-trait.rs:14:1
+ |
+LL | trait PrivTr {}
+ | ^^^^^^^^^^^^
+note: the lint level is defined here
+ --> $DIR/where-pub-type-impls-priv-trait.rs:7:9
+ |
+LL | #![warn(private_bounds)]
+ | ^^^^^^^^^^^^^^
+
error[E0445]: private trait `PrivTr` in public interface
- --> $DIR/where-pub-type-impls-priv-trait.rs:26:1
+ --> $DIR/where-pub-type-impls-priv-trait.rs:32:1
|
LL | trait PrivTr {}
| ------------ `PrivTr` declared as private
@@ -16,39 +33,97 @@ LL | trait PrivTr {}
LL | pub enum E
| ^^^^^^^^^^ can't leak private trait
+warning: trait `PrivTr` is more private than the item `E`
+ --> $DIR/where-pub-type-impls-priv-trait.rs:32:1
+ |
+LL | pub enum E
+ | ^^^^^^^^^^ enum `E` is reachable at visibility `pub`
+ |
+note: but trait `PrivTr` is only usable at visibility `pub(crate)`
+ --> $DIR/where-pub-type-impls-priv-trait.rs:14:1
+ |
+LL | trait PrivTr {}
+ | ^^^^^^^^^^^^
+
error[E0445]: private trait `PrivTr` in public interface
- --> $DIR/where-pub-type-impls-priv-trait.rs:33:1
+ --> $DIR/where-pub-type-impls-priv-trait.rs:40:1
|
LL | trait PrivTr {}
| ------------ `PrivTr` declared as private
...
LL | / pub fn f()
LL | |
+LL | |
LL | | where
LL | | PubTy: PrivTr
| |_________________^ can't leak private trait
-error[E0445]: private trait `PrivTr` in public interface
+warning: trait `PrivTr` is more private than the item `f`
--> $DIR/where-pub-type-impls-priv-trait.rs:40:1
|
+LL | / pub fn f()
+LL | |
+LL | |
+LL | | where
+LL | | PubTy: PrivTr
+ | |_________________^ function `f` is reachable at visibility `pub`
+ |
+note: but trait `PrivTr` is only usable at visibility `pub(crate)`
+ --> $DIR/where-pub-type-impls-priv-trait.rs:14:1
+ |
+LL | trait PrivTr {}
+ | ^^^^^^^^^^^^
+
+error[E0445]: private trait `PrivTr` in public interface
+ --> $DIR/where-pub-type-impls-priv-trait.rs:48:1
+ |
LL | trait PrivTr {}
| ------------ `PrivTr` declared as private
...
LL | impl S
| ^^^^^^ can't leak private trait
+warning: trait `PrivTr` is more private than the item `S`
+ --> $DIR/where-pub-type-impls-priv-trait.rs:48:1
+ |
+LL | impl S
+ | ^^^^^^ implementation `S` is reachable at visibility `pub`
+ |
+note: but trait `PrivTr` is only usable at visibility `pub(crate)`
+ --> $DIR/where-pub-type-impls-priv-trait.rs:14:1
+ |
+LL | trait PrivTr {}
+ | ^^^^^^^^^^^^
+
error[E0445]: private trait `PrivTr` in public interface
- --> $DIR/where-pub-type-impls-priv-trait.rs:45:5
+ --> $DIR/where-pub-type-impls-priv-trait.rs:54:5
|
LL | trait PrivTr {}
| ------------ `PrivTr` declared as private
...
LL | / pub fn f()
LL | |
+LL | |
LL | | where
LL | | PubTy: PrivTr
| |_____________________^ can't leak private trait
-error: aborting due to 5 previous errors
+warning: trait `PrivTr` is more private than the item `S::f`
+ --> $DIR/where-pub-type-impls-priv-trait.rs:54:5
+ |
+LL | / pub fn f()
+LL | |
+LL | |
+LL | | where
+LL | | PubTy: PrivTr
+ | |_____________________^ associated function `S::f` is reachable at visibility `pub`
+ |
+note: but trait `PrivTr` is only usable at visibility `pub(crate)`
+ --> $DIR/where-pub-type-impls-priv-trait.rs:14:1
+ |
+LL | trait PrivTr {}
+ | ^^^^^^^^^^^^
+
+error: aborting due to 5 previous errors; 5 warnings emitted
For more information about this error, try `rustc --explain E0445`.