//@ 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); }