mirror of https://github.com/rust-lang/rust
37 lines
672 B
Rust
37 lines
672 B
Rust
#![deny(deref_into_dyn_supertrait)]
|
|
#![feature(trait_upcasting)] // remove this and the test compiles
|
|
|
|
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
|
|
}
|