36 lines
480 B
Rust
36 lines
480 B
Rust
//@ check-pass
|
|
|
|
trait Mirror {
|
|
type Other;
|
|
}
|
|
|
|
#[derive(Debug)]
|
|
struct Even(usize);
|
|
struct Odd;
|
|
|
|
impl Mirror for Even {
|
|
type Other = Odd;
|
|
}
|
|
|
|
impl Mirror for Odd {
|
|
type Other = Even;
|
|
}
|
|
|
|
trait Dyn<T: Mirror>: AsRef<<T as Mirror>::Other> {}
|
|
|
|
impl Dyn<Odd> for Even {}
|
|
|
|
impl AsRef<Even> for Even {
|
|
fn as_ref(&self) -> &Even {
|
|
self
|
|
}
|
|
}
|
|
|
|
fn code<T: Mirror>(d: &dyn Dyn<T>) -> &T::Other {
|
|
d.as_ref()
|
|
}
|
|
|
|
fn main() {
|
|
println!("{:?}", code(&Even(22)));
|
|
}
|