Add some tests for associated type normalization edge cases
This commit is contained in:
parent
e867886c6a
commit
d80d7ea1e3
60
tests/ui/privacy/projections.rs
Normal file
60
tests/ui/privacy/projections.rs
Normal file
@ -0,0 +1,60 @@
|
||||
mod m {
|
||||
struct Priv;
|
||||
pub type Leak = Priv; //~ WARN: `Priv` is more private than the item `Leak`
|
||||
}
|
||||
|
||||
trait Trait {
|
||||
type A<T>;
|
||||
}
|
||||
|
||||
impl Trait for u8 {
|
||||
type A<T> = u8;
|
||||
}
|
||||
|
||||
fn check() -> <u8 as Trait>::A<m::Leak> {
|
||||
//~^ ERROR: `Priv` is private
|
||||
0
|
||||
}
|
||||
|
||||
trait Trait2 {
|
||||
type A<T>;
|
||||
}
|
||||
|
||||
impl Trait2 for u8 {
|
||||
type A<T> = m::Leak;
|
||||
//~^ ERROR: `Priv` is private
|
||||
//~| ERROR: private type `Priv` in public interface
|
||||
}
|
||||
|
||||
fn check2() -> <u8 as Trait2>::A<u32> {
|
||||
//~^ ERROR: `Priv` is private
|
||||
todo!()
|
||||
}
|
||||
|
||||
trait Trait3 {
|
||||
type A<T: Trait>;
|
||||
}
|
||||
|
||||
impl Trait3 for u8 {
|
||||
type A<T: Trait> = T::A<m::Leak>;
|
||||
//~^ ERROR: `Priv` is private
|
||||
//~| ERROR: private type `Priv` in public interface
|
||||
}
|
||||
|
||||
fn check3() -> <u8 as Trait3>::A<u8> {
|
||||
todo!()
|
||||
}
|
||||
|
||||
trait Trait4 {
|
||||
type A<T: Trait3>;
|
||||
}
|
||||
|
||||
impl Trait4 for u8 {
|
||||
type A<T: Trait3> = T::A<u8>;
|
||||
}
|
||||
|
||||
fn check4() -> <u8 as Trait4>::A<u8> {
|
||||
todo!()
|
||||
}
|
||||
|
||||
fn main() {}
|
62
tests/ui/privacy/projections.stderr
Normal file
62
tests/ui/privacy/projections.stderr
Normal file
@ -0,0 +1,62 @@
|
||||
warning: type `Priv` is more private than the item `Leak`
|
||||
--> $DIR/projections.rs:3:5
|
||||
|
|
||||
LL | pub type Leak = Priv;
|
||||
| ^^^^^^^^^^^^^ type alias `Leak` is reachable at visibility `pub(crate)`
|
||||
|
|
||||
note: but type `Priv` is only usable at visibility `pub(self)`
|
||||
--> $DIR/projections.rs:2:5
|
||||
|
|
||||
LL | struct Priv;
|
||||
| ^^^^^^^^^^^
|
||||
= note: `#[warn(private_interfaces)]` on by default
|
||||
|
||||
error[E0446]: private type `Priv` in public interface
|
||||
--> $DIR/projections.rs:24:5
|
||||
|
|
||||
LL | struct Priv;
|
||||
| ----------- `Priv` declared as private
|
||||
...
|
||||
LL | type A<T> = m::Leak;
|
||||
| ^^^^^^^^^ can't leak private type
|
||||
|
||||
error[E0446]: private type `Priv` in public interface
|
||||
--> $DIR/projections.rs:39:5
|
||||
|
|
||||
LL | struct Priv;
|
||||
| ----------- `Priv` declared as private
|
||||
...
|
||||
LL | type A<T: Trait> = T::A<m::Leak>;
|
||||
| ^^^^^^^^^^^^^^^^ can't leak private type
|
||||
|
||||
error: type `Priv` is private
|
||||
--> $DIR/projections.rs:14:15
|
||||
|
|
||||
LL | fn check() -> <u8 as Trait>::A<m::Leak> {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^ private type
|
||||
|
||||
error: type `Priv` is private
|
||||
--> $DIR/projections.rs:29:39
|
||||
|
|
||||
LL | fn check2() -> <u8 as Trait2>::A<u32> {
|
||||
| _______________________________________^
|
||||
LL | |
|
||||
LL | | todo!()
|
||||
LL | | }
|
||||
| |_^ private type
|
||||
|
||||
error: type `Priv` is private
|
||||
--> $DIR/projections.rs:24:17
|
||||
|
|
||||
LL | type A<T> = m::Leak;
|
||||
| ^^^^^^^ private type
|
||||
|
||||
error: type `Priv` is private
|
||||
--> $DIR/projections.rs:39:24
|
||||
|
|
||||
LL | type A<T: Trait> = T::A<m::Leak>;
|
||||
| ^^^^^^^^^^^^^ private type
|
||||
|
||||
error: aborting due to 6 previous errors; 1 warning emitted
|
||||
|
||||
For more information about this error, try `rustc --explain E0446`.
|
38
tests/ui/privacy/projections2.rs
Normal file
38
tests/ui/privacy/projections2.rs
Normal file
@ -0,0 +1,38 @@
|
||||
mod m {
|
||||
use super::*;
|
||||
struct Priv;
|
||||
pub type Leak = Priv; //~ WARN: `Priv` is more private than the item `Leak`
|
||||
|
||||
trait Trait3 {
|
||||
type A<T: Trait>;
|
||||
}
|
||||
|
||||
impl Trait3 for u8 {
|
||||
type A<T: Trait> = T::A<Leak>;
|
||||
}
|
||||
|
||||
pub trait Trait4 {
|
||||
type A<T: Trait>;
|
||||
}
|
||||
|
||||
impl Trait4 for u8 {
|
||||
type A<T: Trait> = <u8 as Trait3>::A<T>;
|
||||
//~^ ERROR: private associated type `Trait3::A` in public interface
|
||||
//~| ERROR: private trait `Trait3` in public interface
|
||||
}
|
||||
}
|
||||
|
||||
pub trait Trait {
|
||||
type A<T>;
|
||||
}
|
||||
|
||||
impl Trait for u8 {
|
||||
type A<T> = u8;
|
||||
}
|
||||
use m::*;
|
||||
|
||||
fn check4() -> <u8 as Trait4>::A<u8> {
|
||||
todo!()
|
||||
}
|
||||
|
||||
fn main() {}
|
34
tests/ui/privacy/projections2.stderr
Normal file
34
tests/ui/privacy/projections2.stderr
Normal file
@ -0,0 +1,34 @@
|
||||
warning: type `Priv` is more private than the item `Leak`
|
||||
--> $DIR/projections2.rs:4:5
|
||||
|
|
||||
LL | pub type Leak = Priv;
|
||||
| ^^^^^^^^^^^^^ type alias `Leak` is reachable at visibility `pub(crate)`
|
||||
|
|
||||
note: but type `Priv` is only usable at visibility `pub(self)`
|
||||
--> $DIR/projections2.rs:3:5
|
||||
|
|
||||
LL | struct Priv;
|
||||
| ^^^^^^^^^^^
|
||||
= note: `#[warn(private_interfaces)]` on by default
|
||||
|
||||
error[E0446]: private associated type `Trait3::A` in public interface
|
||||
--> $DIR/projections2.rs:19:9
|
||||
|
|
||||
LL | type A<T: Trait>;
|
||||
| ---------------- `Trait3::A` declared as private
|
||||
...
|
||||
LL | type A<T: Trait> = <u8 as Trait3>::A<T>;
|
||||
| ^^^^^^^^^^^^^^^^ can't leak private associated type
|
||||
|
||||
error[E0446]: private trait `Trait3` in public interface
|
||||
--> $DIR/projections2.rs:19:9
|
||||
|
|
||||
LL | trait Trait3 {
|
||||
| ------------ `Trait3` declared as private
|
||||
...
|
||||
LL | type A<T: Trait> = <u8 as Trait3>::A<T>;
|
||||
| ^^^^^^^^^^^^^^^^ can't leak private trait
|
||||
|
||||
error: aborting due to 2 previous errors; 1 warning emitted
|
||||
|
||||
For more information about this error, try `rustc --explain E0446`.
|
Loading…
Reference in New Issue
Block a user