use std::ops::Deref; | |
trait Bar<T> {} | |
impl<T, U> Bar<U> for T {} | |
trait Foo: Bar<i32> { | |
fn as_dyn_bar_u32<'a>(&self) -> &(dyn Bar<u32> + 'a); | |
} | |
impl Foo for () { | |
fn as_dyn_bar_u32<'a>(&self) -> &(dyn Bar<u32> + 'a) { | |
self | |
} | |
} | |
impl<'a> Deref for dyn Foo + 'a { | |
type Target = dyn Bar<u32> + 'a; | |
fn deref(&self) -> &Self::Target { | |
self.as_dyn_bar_u32() | |
} | |
} | |
fn take_dyn<T>(x: &dyn Bar<T>) -> T { | |
todo!() | |
} | |
fn main() { | |
let x: &dyn Foo = &(); | |
let y = take_dyn(x); | |
let z: u32 = y; | |
//~^ error: mismatched types | |
} |