144 lines
2.2 KiB
Rust
144 lines
2.2 KiB
Rust
// build-fail
|
|
#![feature(rustc_attrs)]
|
|
|
|
// O --> G --> C --> A
|
|
// \ \ \-> B
|
|
// | |-> F --> D
|
|
// | \-> E
|
|
// |-> N --> J --> H
|
|
// \ \-> I
|
|
// |-> M --> K
|
|
// \-> L
|
|
|
|
#[rustc_dump_vtable]
|
|
trait A {
|
|
//~^ error vtable
|
|
fn foo_a(&self) {}
|
|
}
|
|
|
|
#[rustc_dump_vtable]
|
|
trait B {
|
|
//~^ error vtable
|
|
fn foo_b(&self) {}
|
|
}
|
|
|
|
#[rustc_dump_vtable]
|
|
trait C: A + B {
|
|
//~^ error vtable
|
|
fn foo_c(&self) {}
|
|
}
|
|
|
|
#[rustc_dump_vtable]
|
|
trait D {
|
|
//~^ error vtable
|
|
fn foo_d(&self) {}
|
|
}
|
|
|
|
#[rustc_dump_vtable]
|
|
trait E {
|
|
//~^ error vtable
|
|
fn foo_e(&self) {}
|
|
}
|
|
|
|
#[rustc_dump_vtable]
|
|
trait F: D + E {
|
|
//~^ error vtable
|
|
fn foo_f(&self) {}
|
|
}
|
|
|
|
#[rustc_dump_vtable]
|
|
trait G: C + F {
|
|
fn foo_g(&self) {}
|
|
}
|
|
|
|
#[rustc_dump_vtable]
|
|
trait H {
|
|
//~^ error vtable
|
|
fn foo_h(&self) {}
|
|
}
|
|
|
|
#[rustc_dump_vtable]
|
|
trait I {
|
|
//~^ error vtable
|
|
fn foo_i(&self) {}
|
|
}
|
|
|
|
#[rustc_dump_vtable]
|
|
trait J: H + I {
|
|
//~^ error vtable
|
|
fn foo_j(&self) {}
|
|
}
|
|
|
|
#[rustc_dump_vtable]
|
|
trait K {
|
|
//~^ error vtable
|
|
fn foo_k(&self) {}
|
|
}
|
|
|
|
#[rustc_dump_vtable]
|
|
trait L {
|
|
//~^ error vtable
|
|
fn foo_l(&self) {}
|
|
}
|
|
|
|
#[rustc_dump_vtable]
|
|
trait M: K + L {
|
|
//~^ error vtable
|
|
fn foo_m(&self) {}
|
|
}
|
|
|
|
#[rustc_dump_vtable]
|
|
trait N: J + M {
|
|
//~^ error vtable
|
|
fn foo_n(&self) {}
|
|
}
|
|
|
|
#[rustc_dump_vtable]
|
|
trait O: G + N {
|
|
//~^ error vtable
|
|
fn foo_o(&self) {}
|
|
}
|
|
|
|
struct S;
|
|
|
|
impl A for S {}
|
|
impl B for S {}
|
|
impl C for S {}
|
|
impl D for S {}
|
|
impl E for S {}
|
|
impl F for S {}
|
|
impl G for S {}
|
|
impl H for S {}
|
|
impl I for S {}
|
|
impl J for S {}
|
|
impl K for S {}
|
|
impl L for S {}
|
|
impl M for S {}
|
|
impl N for S {}
|
|
impl O for S {}
|
|
|
|
macro_rules! monomorphize_vtable {
|
|
($trait:ident) => {{
|
|
fn foo(_ : &dyn $trait) {}
|
|
foo(&S);
|
|
}}
|
|
}
|
|
|
|
fn main() {
|
|
monomorphize_vtable!(O);
|
|
|
|
monomorphize_vtable!(A);
|
|
monomorphize_vtable!(B);
|
|
monomorphize_vtable!(C);
|
|
monomorphize_vtable!(D);
|
|
monomorphize_vtable!(E);
|
|
monomorphize_vtable!(F);
|
|
monomorphize_vtable!(H);
|
|
monomorphize_vtable!(I);
|
|
monomorphize_vtable!(J);
|
|
monomorphize_vtable!(K);
|
|
monomorphize_vtable!(L);
|
|
monomorphize_vtable!(M);
|
|
monomorphize_vtable!(N);
|
|
}
|