be44860ab9
This fixes #111220 by checking the privacy of tuple constructors using `Self`, so the following code now errors ```rust mod my { pub struct Foo(&'static str); } impl AsRef<str> for my::Foo { fn as_ref(&self) -> &str { let Self(s) = self; // previously compiled, now errors correctly s } } ```
47 lines
737 B
Rust
47 lines
737 B
Rust
mod b {
|
|
#[derive(Default)]
|
|
pub struct A(u32);
|
|
}
|
|
|
|
impl b::A {
|
|
fn inherent_bypass(&self) {
|
|
let Self(x) = self;
|
|
//~^ ERROR: tuple struct constructor `A` is private
|
|
println!("{x}");
|
|
}
|
|
}
|
|
|
|
pub trait B {
|
|
fn f(&self);
|
|
}
|
|
|
|
impl B for b::A {
|
|
fn f(&self) {
|
|
let Self(a) = self;
|
|
//~^ ERROR: tuple struct constructor `A` is private
|
|
println!("{}", a);
|
|
}
|
|
}
|
|
|
|
pub trait Projector {
|
|
type P;
|
|
}
|
|
|
|
impl Projector for () {
|
|
type P = b::A;
|
|
}
|
|
|
|
pub trait Bypass2 {
|
|
fn f2(&self);
|
|
}
|
|
|
|
impl Bypass2 for <() as Projector>::P {
|
|
fn f2(&self) {
|
|
let Self(a) = self;
|
|
//~^ ERROR: tuple struct constructor `A` is private
|
|
println!("{}", a);
|
|
}
|
|
}
|
|
|
|
fn main() {}
|