summaryrefslogtreecommitdiff
path: root/src/test/ui
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2018-12-31 23:30:57 +0000
committerbors <bors@rust-lang.org>2018-12-31 23:30:57 +0000
commitfe6a54d2207c9ab2c5eb5aa3c9488d92c7c86bfb (patch)
tree6679295c9f2d8390701a58a66e0124bd647dc9dc /src/test/ui
parent9eac386342c601b14311b435f2b6d314fc817bb5 (diff)
parent60d1fa70bbb017632f43c206e5f16b0b5bbd0149 (diff)
downloadrust-fe6a54d2207c9ab2c5eb5aa3c9488d92c7c86bfb.tar.gz
Auto merge of #56878 - petrochenkov:privdyn, r=arielb1
privacy: Use common `DefId` visiting infrastructure for all privacy visitors One repeating pattern in privacy checking is going through a type, visiting all `DefId`s inside it and doing something with them. This is the case because visibilities and reachabilities are attached to `DefId`s. Previously various privacy visitors visited types slightly differently using their own methods, with most recently written `TypePrivacyVisitor` being the "gold standard". This mostly worked okay, but differences could manifest in overly conservative reachability analysis, some errors being reported twice, some private-in-public lints (not errors) being wrongly reported or not reported. This PR does something that I wanted to do since https://github.com/rust-lang/rust/pull/32674#discussion_r58291608 - factoring out the common visiting logic! Now all the common logic is contained in `struct DefIdVisitorSkeleton`, with specific privacy visitors deciding only what to do with visited `DefId`s (via `trait DefIdVisitor`). A bunch of cleanups is also applied in the process. This area is somewhat tricky due to lots of easily miss-able details, but thankfully it's was well covered by tests in https://github.com/rust-lang/rust/pull/46083 and previous PRs, so I'm relatively sure in the refactoring correctness. Fixes https://github.com/rust-lang/rust/pull/56837#discussion_r241962239 in particular. Also this will help with implementing https://github.com/rust-lang/rust/issues/48054.
Diffstat (limited to 'src/test/ui')
-rw-r--r--src/test/ui/error-codes/E0445.rs3
-rw-r--r--src/test/ui/error-codes/E0445.stderr4
-rw-r--r--src/test/ui/impl-trait/issue-49376.rs4
-rw-r--r--src/test/ui/issues/issue-18389.stderr3
-rw-r--r--src/test/ui/privacy/associated-item-privacy-type-binding.rs12
-rw-r--r--src/test/ui/privacy/associated-item-privacy-type-binding.stderr12
-rw-r--r--src/test/ui/privacy/private-in-public-expr-pat.rs13
-rw-r--r--src/test/ui/privacy/private-in-public-non-principal-2.rs13
-rw-r--r--src/test/ui/privacy/private-in-public-non-principal-2.stderr8
-rw-r--r--src/test/ui/privacy/private-in-public-non-principal.rs20
-rw-r--r--src/test/ui/privacy/private-in-public-non-principal.stderr24
-rw-r--r--src/test/ui/privacy/private-in-public-warn.rs9
-rw-r--r--src/test/ui/privacy/private-in-public-warn.stderr21
-rw-r--r--src/test/ui/privacy/private-in-public.rs4
-rw-r--r--src/test/ui/privacy/private-in-public.stderr42
-rw-r--r--src/test/ui/privacy/private-inferred-type.rs2
-rw-r--r--src/test/ui/privacy/private-inferred-type.stderr4
17 files changed, 163 insertions, 35 deletions
diff --git a/src/test/ui/error-codes/E0445.rs b/src/test/ui/error-codes/E0445.rs
index 570c37ef2cc..a9a3aee2500 100644
--- a/src/test/ui/error-codes/E0445.rs
+++ b/src/test/ui/error-codes/E0445.rs
@@ -4,12 +4,9 @@ trait Foo {
pub trait Bar : Foo {}
//~^ ERROR private trait `Foo` in public interface [E0445]
-//~| NOTE can't leak private trait
pub struct Bar2<T: Foo>(pub T);
//~^ ERROR private trait `Foo` in public interface [E0445]
-//~| NOTE can't leak private trait
pub fn foo<T: Foo> (t: T) {}
//~^ ERROR private trait `Foo` in public interface [E0445]
-//~| NOTE can't leak private trait
fn main() {}
diff --git a/src/test/ui/error-codes/E0445.stderr b/src/test/ui/error-codes/E0445.stderr
index 747e4daf74e..d0d6ebe16c7 100644
--- a/src/test/ui/error-codes/E0445.stderr
+++ b/src/test/ui/error-codes/E0445.stderr
@@ -5,13 +5,13 @@ LL | pub trait Bar : Foo {}
| ^^^^^^^^^^^^^^^^^^^^^^ can't leak private trait
error[E0445]: private trait `Foo` in public interface
- --> $DIR/E0445.rs:8:1
+ --> $DIR/E0445.rs:7:1
|
LL | pub struct Bar2<T: Foo>(pub T);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ can't leak private trait
error[E0445]: private trait `Foo` in public interface
- --> $DIR/E0445.rs:11:1
+ --> $DIR/E0445.rs:9:1
|
LL | pub fn foo<T: Foo> (t: T) {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ can't leak private trait
diff --git a/src/test/ui/impl-trait/issue-49376.rs b/src/test/ui/impl-trait/issue-49376.rs
index 4a45988e45d..13671b8dbf4 100644
--- a/src/test/ui/impl-trait/issue-49376.rs
+++ b/src/test/ui/impl-trait/issue-49376.rs
@@ -9,9 +9,11 @@ fn gen() -> impl PartialOrd + PartialEq + Debug { }
struct Bar {}
trait Foo<T = Self> {}
+trait FooNested<T = Option<Self>> {}
impl Foo for Bar {}
+impl FooNested for Bar {}
-fn foo() -> impl Foo {
+fn foo() -> impl Foo + FooNested {
Bar {}
}
diff --git a/src/test/ui/issues/issue-18389.stderr b/src/test/ui/issues/issue-18389.stderr
index 9cbe8c05b7e..02ff6b6d5bf 100644
--- a/src/test/ui/issues/issue-18389.stderr
+++ b/src/test/ui/issues/issue-18389.stderr
@@ -1,6 +1,9 @@
error[E0445]: private trait `Private<<Self as Public>::P, <Self as Public>::R>` in public interface
--> $DIR/issue-18389.rs:7:1
|
+LL | trait Private<P, R> {
+ | - `Private<<Self as Public>::P, <Self as Public>::R>` declared as private
+...
LL | / pub trait Public: Private<
LL | | //~^ ERROR private trait `Private<<Self as Public>::P, <Self as Public>::R>` in public interface
LL | | <Self as Public>::P,
diff --git a/src/test/ui/privacy/associated-item-privacy-type-binding.rs b/src/test/ui/privacy/associated-item-privacy-type-binding.rs
index ff274ab8f1f..591e9df81eb 100644
--- a/src/test/ui/privacy/associated-item-privacy-type-binding.rs
+++ b/src/test/ui/privacy/associated-item-privacy-type-binding.rs
@@ -9,19 +9,19 @@ mod priv_trait {
pub macro mac1() {
let _: Box<PubTr<AssocTy = u8>>;
- //~^ ERROR type `(dyn priv_trait::PubTr<AssocTy=u8> + '<empty>)` is private
- //~| ERROR type `(dyn priv_trait::PubTr<AssocTy=u8> + '<empty>)` is private
+ //~^ ERROR trait `priv_trait::PrivTr` is private
+ //~| ERROR trait `priv_trait::PrivTr` is private
type InSignatureTy2 = Box<PubTr<AssocTy = u8>>;
- //~^ ERROR type `(dyn priv_trait::PubTr<AssocTy=u8> + 'static)` is private
+ //~^ ERROR trait `priv_trait::PrivTr` is private
trait InSignatureTr2: PubTr<AssocTy = u8> {}
//~^ ERROR trait `priv_trait::PrivTr` is private
}
pub macro mac2() {
let _: Box<PrivTr<AssocTy = u8>>;
- //~^ ERROR type `(dyn priv_trait::PrivTr<AssocTy=u8> + '<empty>)` is private
- //~| ERROR type `(dyn priv_trait::PrivTr<AssocTy=u8> + '<empty>)` is private
+ //~^ ERROR trait `priv_trait::PrivTr` is private
+ //~| ERROR trait `priv_trait::PrivTr` is private
type InSignatureTy1 = Box<PrivTr<AssocTy = u8>>;
- //~^ ERROR type `(dyn priv_trait::PrivTr<AssocTy=u8> + 'static)` is private
+ //~^ ERROR trait `priv_trait::PrivTr` is private
trait InSignatureTr1: PrivTr<AssocTy = u8> {}
//~^ ERROR trait `priv_trait::PrivTr` is private
}
diff --git a/src/test/ui/privacy/associated-item-privacy-type-binding.stderr b/src/test/ui/privacy/associated-item-privacy-type-binding.stderr
index 331e2f689b5..7f6886d7f9a 100644
--- a/src/test/ui/privacy/associated-item-privacy-type-binding.stderr
+++ b/src/test/ui/privacy/associated-item-privacy-type-binding.stderr
@@ -1,4 +1,4 @@
-error: type `(dyn priv_trait::PubTr<AssocTy=u8> + '<empty>)` is private
+error: trait `priv_trait::PrivTr` is private
--> $DIR/associated-item-privacy-type-binding.rs:11:13
|
LL | let _: Box<PubTr<AssocTy = u8>>;
@@ -7,7 +7,7 @@ LL | let _: Box<PubTr<AssocTy = u8>>;
LL | priv_trait::mac1!();
| -------------------- in this macro invocation
-error: type `(dyn priv_trait::PubTr<AssocTy=u8> + '<empty>)` is private
+error: trait `priv_trait::PrivTr` is private
--> $DIR/associated-item-privacy-type-binding.rs:11:16
|
LL | let _: Box<PubTr<AssocTy = u8>>;
@@ -16,7 +16,7 @@ LL | let _: Box<PubTr<AssocTy = u8>>;
LL | priv_trait::mac1!();
| -------------------- in this macro invocation
-error: type `(dyn priv_trait::PubTr<AssocTy=u8> + 'static)` is private
+error: trait `priv_trait::PrivTr` is private
--> $DIR/associated-item-privacy-type-binding.rs:14:31
|
LL | type InSignatureTy2 = Box<PubTr<AssocTy = u8>>;
@@ -34,7 +34,7 @@ LL | trait InSignatureTr2: PubTr<AssocTy = u8> {}
LL | priv_trait::mac1!();
| -------------------- in this macro invocation
-error: type `(dyn priv_trait::PrivTr<AssocTy=u8> + '<empty>)` is private
+error: trait `priv_trait::PrivTr` is private
--> $DIR/associated-item-privacy-type-binding.rs:20:13
|
LL | let _: Box<PrivTr<AssocTy = u8>>;
@@ -43,7 +43,7 @@ LL | let _: Box<PrivTr<AssocTy = u8>>;
LL | priv_trait::mac2!();
| -------------------- in this macro invocation
-error: type `(dyn priv_trait::PrivTr<AssocTy=u8> + '<empty>)` is private
+error: trait `priv_trait::PrivTr` is private
--> $DIR/associated-item-privacy-type-binding.rs:20:16
|
LL | let _: Box<PrivTr<AssocTy = u8>>;
@@ -52,7 +52,7 @@ LL | let _: Box<PrivTr<AssocTy = u8>>;
LL | priv_trait::mac2!();
| -------------------- in this macro invocation
-error: type `(dyn priv_trait::PrivTr<AssocTy=u8> + 'static)` is private
+error: trait `priv_trait::PrivTr` is private
--> $DIR/associated-item-privacy-type-binding.rs:23:31
|
LL | type InSignatureTy1 = Box<PrivTr<AssocTy = u8>>;
diff --git a/src/test/ui/privacy/private-in-public-expr-pat.rs b/src/test/ui/privacy/private-in-public-expr-pat.rs
new file mode 100644
index 00000000000..a3e53bdf45d
--- /dev/null
+++ b/src/test/ui/privacy/private-in-public-expr-pat.rs
@@ -0,0 +1,13 @@
+// Patterns and expressions are not interface parts and don't produce private-in-public errors.
+
+// compile-pass
+
+struct Priv1(usize);
+struct Priv2;
+
+pub struct Pub(Priv2);
+
+pub fn public_expr(_: [u8; Priv1(0).0]) {} // OK
+pub fn public_pat(Pub(Priv2): Pub) {} // OK
+
+fn main() {}
diff --git a/src/test/ui/privacy/private-in-public-non-principal-2.rs b/src/test/ui/privacy/private-in-public-non-principal-2.rs
new file mode 100644
index 00000000000..02fd92aa7a4
--- /dev/null
+++ b/src/test/ui/privacy/private-in-public-non-principal-2.rs
@@ -0,0 +1,13 @@
+#![feature(optin_builtin_traits)]
+
+#[allow(private_in_public)]
+mod m {
+ pub trait PubPrincipal {}
+ auto trait PrivNonPrincipal {}
+ pub fn leak_dyn_nonprincipal() -> Box<PubPrincipal + PrivNonPrincipal> { loop {} }
+}
+
+fn main() {
+ m::leak_dyn_nonprincipal();
+ //~^ ERROR trait `m::PrivNonPrincipal` is private
+}
diff --git a/src/test/ui/privacy/private-in-public-non-principal-2.stderr b/src/test/ui/privacy/private-in-public-non-principal-2.stderr
new file mode 100644
index 00000000000..2db49257226
--- /dev/null
+++ b/src/test/ui/privacy/private-in-public-non-principal-2.stderr
@@ -0,0 +1,8 @@
+error: trait `m::PrivNonPrincipal` is private
+ --> $DIR/private-in-public-non-principal-2.rs:11:5
+ |
+LL | m::leak_dyn_nonprincipal();
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+error: aborting due to previous error
+
diff --git a/src/test/ui/privacy/private-in-public-non-principal.rs b/src/test/ui/privacy/private-in-public-non-principal.rs
new file mode 100644
index 00000000000..5de5a685208
--- /dev/null
+++ b/src/test/ui/privacy/private-in-public-non-principal.rs
@@ -0,0 +1,20 @@
+#![feature(optin_builtin_traits)]
+
+pub trait PubPrincipal {}
+auto trait PrivNonPrincipal {}
+
+pub fn leak_dyn_nonprincipal() -> Box<PubPrincipal + PrivNonPrincipal> { loop {} }
+//~^ WARN private trait `PrivNonPrincipal` in public interface
+//~| WARN this was previously accepted
+
+#[deny(missing_docs)]
+fn container() {
+ impl dyn PubPrincipal {
+ pub fn check_doc_lint() {} //~ ERROR missing documentation for a method
+ }
+ impl dyn PubPrincipal + PrivNonPrincipal {
+ pub fn check_doc_lint() {} // OK, no missing doc lint
+ }
+}
+
+fn main() {}
diff --git a/src/test/ui/privacy/private-in-public-non-principal.stderr b/src/test/ui/privacy/private-in-public-non-principal.stderr
new file mode 100644
index 00000000000..99674055897
--- /dev/null
+++ b/src/test/ui/privacy/private-in-public-non-principal.stderr
@@ -0,0 +1,24 @@
+warning: private trait `PrivNonPrincipal` in public interface (error E0445)
+ --> $DIR/private-in-public-non-principal.rs:6:1
+ |
+LL | pub fn leak_dyn_nonprincipal() -> Box<PubPrincipal + PrivNonPrincipal> { loop {} }
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ |
+ = note: #[warn(private_in_public)] on by default
+ = 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: missing documentation for a method
+ --> $DIR/private-in-public-non-principal.rs:13:9
+ |
+LL | pub fn check_doc_lint() {} //~ ERROR missing documentation for a method
+ | ^^^^^^^^^^^^^^^^^^^^^^^
+ |
+note: lint level defined here
+ --> $DIR/private-in-public-non-principal.rs:10:8
+ |
+LL | #[deny(missing_docs)]
+ | ^^^^^^^^^^^^
+
+error: aborting due to previous error
+
diff --git a/src/test/ui/privacy/private-in-public-warn.rs b/src/test/ui/privacy/private-in-public-warn.rs
index 0da0d03595d..29f365b69be 100644
--- a/src/test/ui/privacy/private-in-public-warn.rs
+++ b/src/test/ui/privacy/private-in-public-warn.rs
@@ -213,6 +213,15 @@ mod aliases_pub {
impl PrivUseAliasTr for <Priv as PrivTr>::AssocAlias {
type Check = Priv; //~ ERROR private type `aliases_pub::Priv` in public interface
}
+ impl PrivUseAliasTr for Option<<Priv as PrivTr>::AssocAlias> {
+ type Check = Priv; //~ ERROR private type `aliases_pub::Priv` in public interface
+ }
+ impl PrivUseAliasTr for (<Priv as PrivTr>::AssocAlias, Priv) {
+ type Check = Priv; // OK
+ }
+ impl PrivUseAliasTr for Option<(<Priv as PrivTr>::AssocAlias, Priv)> {
+ type Check = Priv; // OK
+ }
}
mod aliases_priv {
diff --git a/src/test/ui/privacy/private-in-public-warn.stderr b/src/test/ui/privacy/private-in-public-warn.stderr
index ab9ff8d64d3..8f9e7cd74f9 100644
--- a/src/test/ui/privacy/private-in-public-warn.stderr
+++ b/src/test/ui/privacy/private-in-public-warn.stderr
@@ -297,8 +297,17 @@ LL | struct Priv;
LL | type Check = Priv; //~ ERROR private type `aliases_pub::Priv` in public interface
| ^^^^^^^^^^^^^^^^^^ can't leak private type
+error[E0446]: private type `aliases_pub::Priv` in public interface
+ --> $DIR/private-in-public-warn.rs:217:9
+ |
+LL | struct Priv;
+ | - `aliases_pub::Priv` declared as private
+...
+LL | type Check = Priv; //~ ERROR private type `aliases_pub::Priv` in public interface
+ | ^^^^^^^^^^^^^^^^^^ can't leak private type
+
error: private trait `aliases_priv::PrivTr1` in public interface (error E0445)
- --> $DIR/private-in-public-warn.rs:238:5
+ --> $DIR/private-in-public-warn.rs:247:5
|
LL | pub trait Tr1: PrivUseAliasTr {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -306,8 +315,8 @@ LL | pub trait Tr1: PrivUseAliasTr {}
= 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: private type `aliases_priv::Priv2` in public interface (error E0446)
- --> $DIR/private-in-public-warn.rs:241:5
+error: private trait `aliases_priv::PrivTr1<aliases_priv::Priv2>` in public interface (error E0445)
+ --> $DIR/private-in-public-warn.rs:250:5
|
LL | pub trait Tr2: PrivUseAliasTr<PrivAlias> {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -315,8 +324,8 @@ LL | pub trait Tr2: PrivUseAliasTr<PrivAlias> {}
= 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: private trait `aliases_priv::PrivTr1<aliases_priv::Priv2>` in public interface (error E0445)
- --> $DIR/private-in-public-warn.rs:241:5
+error: private type `aliases_priv::Priv2` in public interface (error E0446)
+ --> $DIR/private-in-public-warn.rs:250:5
|
LL | pub trait Tr2: PrivUseAliasTr<PrivAlias> {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -324,6 +333,6 @@ LL | pub trait Tr2: PrivUseAliasTr<PrivAlias> {}
= 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: aborting due to 35 previous errors
+error: aborting due to 36 previous errors
For more information about this error, try `rustc --explain E0446`.
diff --git a/src/test/ui/privacy/private-in-public.rs b/src/test/ui/privacy/private-in-public.rs
index 288298cfbfc..08c00f44f22 100644
--- a/src/test/ui/privacy/private-in-public.rs
+++ b/src/test/ui/privacy/private-in-public.rs
@@ -102,7 +102,7 @@ mod aliases_pub {
// This should be OK, but associated type aliases are not substituted yet
pub fn f3(arg: <Priv as PrivTr>::Assoc) {}
- //~^ ERROR private type `<aliases_pub::Priv as aliases_pub::PrivTr>::Assoc` in public interface
+ //~^ ERROR private trait `aliases_pub::PrivTr` in public interface
//~| ERROR private type `aliases_pub::Priv` in public interface
impl PrivUseAlias {
@@ -131,7 +131,7 @@ mod aliases_priv {
pub fn f1(arg: PrivUseAlias) {} //~ ERROR private type `aliases_priv::Priv1` in public interface
pub fn f2(arg: PrivAlias) {} //~ ERROR private type `aliases_priv::Priv2` in public interface
pub fn f3(arg: <Priv as PrivTr>::Assoc) {}
- //~^ ERROR private type `<aliases_priv::Priv as aliases_priv::PrivTr>::Assoc` in public
+ //~^ ERROR private trait `aliases_priv::PrivTr` in public interface
//~| ERROR private type `aliases_priv::Priv` in public interface
}
diff --git a/src/test/ui/privacy/private-in-public.stderr b/src/test/ui/privacy/private-in-public.stderr
index 2bd7503ab5a..bf88a83e633 100644
--- a/src/test/ui/privacy/private-in-public.stderr
+++ b/src/test/ui/privacy/private-in-public.stderr
@@ -82,24 +82,36 @@ LL | pub fn f2() -> Priv { panic!() } //~ ERROR private type `types::Pri
error[E0445]: private trait `traits::PrivTr` in public interface
--> $DIR/private-in-public.rs:31:5
|
+LL | trait PrivTr {}
+ | - `traits::PrivTr` declared as private
+...
LL | pub enum E<T: PrivTr> { V(T) } //~ ERROR private trait `traits::PrivTr` in public interface
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ can't leak private trait
error[E0445]: private trait `traits::PrivTr` in public interface
--> $DIR/private-in-public.rs:32:5
|
+LL | trait PrivTr {}
+ | - `traits::PrivTr` declared as private
+...
LL | pub fn f<T: PrivTr>(arg: T) {} //~ ERROR private trait `traits::PrivTr` in public interface
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ can't leak private trait
error[E0445]: private trait `traits::PrivTr` in public interface
--> $DIR/private-in-public.rs:33:5
|
+LL | trait PrivTr {}
+ | - `traits::PrivTr` declared as private
+...
LL | pub struct S1<T: PrivTr>(T); //~ ERROR private trait `traits::PrivTr` in public interface
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ can't leak private trait
error[E0445]: private trait `traits::PrivTr` in public interface
--> $DIR/private-in-public.rs:34:5
|
+LL | trait PrivTr {}
+ | - `traits::PrivTr` declared as private
+...
LL | / impl<T: PrivTr> Pub<T> { //~ ERROR private trait `traits::PrivTr` in public interface
LL | | pub fn f<U: PrivTr>(arg: U) {} //~ ERROR private trait `traits::PrivTr` in public interface
LL | | }
@@ -108,30 +120,45 @@ LL | | }
error[E0445]: private trait `traits::PrivTr` in public interface
--> $DIR/private-in-public.rs:35:9
|
+LL | trait PrivTr {}
+ | - `traits::PrivTr` declared as private
+...
LL | pub fn f<U: PrivTr>(arg: U) {} //~ ERROR private trait `traits::PrivTr` in public interface
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ can't leak private trait
error[E0445]: private trait `traits_where::PrivTr` in public interface
--> $DIR/private-in-public.rs:44:5
|
+LL | trait PrivTr {}
+ | - `traits_where::PrivTr` declared as private
+...
LL | pub enum E<T> where T: PrivTr { V(T) }
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ can't leak private trait
error[E0445]: private trait `traits_where::PrivTr` in public interface
--> $DIR/private-in-public.rs:46:5
|
+LL | trait PrivTr {}
+ | - `traits_where::PrivTr` declared as private
+...
LL | pub fn f<T>(arg: T) where T: PrivTr {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ can't leak private trait
error[E0445]: private trait `traits_where::PrivTr` in public interface
--> $DIR/private-in-public.rs:48:5
|
+LL | trait PrivTr {}
+ | - `traits_where::PrivTr` declared as private
+...
LL | pub struct S1<T>(T) where T: PrivTr;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ can't leak private trait
error[E0445]: private trait `traits_where::PrivTr` in public interface
--> $DIR/private-in-public.rs:50:5
|
+LL | trait PrivTr {}
+ | - `traits_where::PrivTr` declared as private
+...
LL | / impl<T> Pub<T> where T: PrivTr {
LL | | //~^ ERROR private trait `traits_where::PrivTr` in public interface
LL | | pub fn f<U>(arg: U) where U: PrivTr {}
@@ -142,6 +169,9 @@ LL | | }
error[E0445]: private trait `traits_where::PrivTr` in public interface
--> $DIR/private-in-public.rs:52:9
|
+LL | trait PrivTr {}
+ | - `traits_where::PrivTr` declared as private
+...
LL | pub fn f<U>(arg: U) where U: PrivTr {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ can't leak private trait
@@ -181,14 +211,14 @@ LL | struct Priv;
LL | pub fn f(arg: Priv) {} //~ ERROR private type `impls::Priv` in public interface
| ^^^^^^^^^^^^^^^^^^^^^^ can't leak private type
-error[E0446]: private type `<aliases_pub::Priv as aliases_pub::PrivTr>::Assoc` in public interface
+error[E0445]: private trait `aliases_pub::PrivTr` in public interface
--> $DIR/private-in-public.rs:104:5
|
LL | trait PrivTr {
- | - `<aliases_pub::Priv as aliases_pub::PrivTr>::Assoc` declared as private
+ | - `aliases_pub::PrivTr` declared as private
...
LL | pub fn f3(arg: <Priv as PrivTr>::Assoc) {}
- | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ can't leak private type
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ can't leak private trait
error[E0446]: private type `aliases_pub::Priv` in public interface
--> $DIR/private-in-public.rs:104:5
@@ -226,14 +256,14 @@ LL | struct Priv2;
LL | pub fn f2(arg: PrivAlias) {} //~ ERROR private type `aliases_priv::Priv2` in public interface
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ can't leak private type
-error[E0446]: private type `<aliases_priv::Priv as aliases_priv::PrivTr>::Assoc` in public interface
+error[E0445]: private trait `aliases_priv::PrivTr` in public interface
--> $DIR/private-in-public.rs:133:5
|
LL | trait PrivTr {
- | - `<aliases_priv::Priv as aliases_priv::PrivTr>::Assoc` declared as private
+ | - `aliases_priv::PrivTr` declared as private
...
LL | pub fn f3(arg: <Priv as PrivTr>::Assoc) {}
- | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ can't leak private type
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ can't leak private trait
error[E0446]: private type `aliases_priv::Priv` in public interface
--> $DIR/private-in-public.rs:133:5
diff --git a/src/test/ui/privacy/private-inferred-type.rs b/src/test/ui/privacy/private-inferred-type.rs
index 1eb5fa408cd..69b60a56c67 100644
--- a/src/test/ui/privacy/private-inferred-type.rs
+++ b/src/test/ui/privacy/private-inferred-type.rs
@@ -119,7 +119,7 @@ fn main() {
m::leak_anon2(); //~ ERROR type `m::Priv` is private
m::leak_anon3(); //~ ERROR type `m::Priv` is private
- m::leak_dyn1(); //~ ERROR type `(dyn m::Trait + 'static)` is private
+ m::leak_dyn1(); //~ ERROR trait `m::Trait` is private
m::leak_dyn2(); //~ ERROR type `m::Priv` is private
m::leak_dyn3(); //~ ERROR type `m::Priv` is private
diff --git a/src/test/ui/privacy/private-inferred-type.stderr b/src/test/ui/privacy/private-inferred-type.stderr
index 089fb1d3c3e..80a475f7dce 100644
--- a/src/test/ui/privacy/private-inferred-type.stderr
+++ b/src/test/ui/privacy/private-inferred-type.stderr
@@ -160,10 +160,10 @@ error: type `m::Priv` is private
LL | m::leak_anon3(); //~ ERROR type `m::Priv` is private
| ^^^^^^^^^^^^^^^
-error: type `(dyn m::Trait + 'static)` is private
+error: trait `m::Trait` is private
--> $DIR/private-inferred-type.rs:122:5
|
-LL | m::leak_dyn1(); //~ ERROR type `(dyn m::Trait + 'static)` is private
+LL | m::leak_dyn1(); //~ ERROR trait `m::Trait` is private
| ^^^^^^^^^^^^^^
error: type `m::Priv` is private