59 lines
892 B
Rust
59 lines
892 B
Rust
#![feature(trait_upcasting)]
|
|
#![allow(incomplete_features)]
|
|
|
|
trait Foo: PartialEq<i32> + std::fmt::Debug + Send + Sync {
|
|
fn a(&self) -> i32 {
|
|
10
|
|
}
|
|
|
|
fn z(&self) -> i32 {
|
|
11
|
|
}
|
|
|
|
fn y(&self) -> i32 {
|
|
12
|
|
}
|
|
}
|
|
|
|
trait Bar: Foo {
|
|
fn b(&self) -> i32 {
|
|
20
|
|
}
|
|
|
|
fn w(&self) -> i32 {
|
|
21
|
|
}
|
|
}
|
|
|
|
trait Baz: Bar {
|
|
fn c(&self) -> i32 {
|
|
30
|
|
}
|
|
}
|
|
|
|
impl Foo for i32 {
|
|
fn a(&self) -> i32 {
|
|
100
|
|
}
|
|
}
|
|
|
|
impl Bar for i32 {
|
|
fn b(&self) -> i32 {
|
|
200
|
|
}
|
|
}
|
|
|
|
impl Baz for i32 {
|
|
fn c(&self) -> i32 {
|
|
300
|
|
}
|
|
}
|
|
|
|
fn main() {
|
|
let baz: &dyn Baz = &1;
|
|
// We already fail on the implicit upcast inserted here.
|
|
let baz_fake: &dyn Bar = unsafe { std::mem::transmute(baz) };
|
|
//~^ERROR: upcast on a pointer whose vtable does not match its type
|
|
let _err = baz_fake as &dyn Foo;
|
|
}
|