diff options
| author | Maybe Waffle <waffle.lapkin@gmail.com> | 2023-07-19 11:45:04 +0000 |
|---|---|---|
| committer | Maybe Waffle <waffle.lapkin@gmail.com> | 2023-07-19 12:05:48 +0000 |
| commit | b5d122850821f80f9496abc09840102561ec4267 (patch) | |
| tree | e916dc39c620a2f0f71cd8ab142800b208883c8e | |
| parent | f33936c567829d024a829f25c40b1e6dca9c75c6 (diff) | |
| download | rust-b5d122850821f80f9496abc09840102561ec4267.tar.gz rust-b5d122850821f80f9496abc09840102561ec4267.zip | |
Add a (failing test) for issue `113840`
| -rw-r--r-- | tests/ui/traits/vtable/multiple-markers.rs | 47 | ||||
| -rw-r--r-- | tests/ui/traits/vtable/multiple-markers.stderr | 58 |
2 files changed, 105 insertions, 0 deletions
diff --git a/tests/ui/traits/vtable/multiple-markers.rs b/tests/ui/traits/vtable/multiple-markers.rs new file mode 100644 index 00000000000..1e6e3087027 --- /dev/null +++ b/tests/ui/traits/vtable/multiple-markers.rs @@ -0,0 +1,47 @@ +// Regression test for <https://github.com/rust-lang/rust/issues/113840> +// +// This test makes sure that multiple marker (method-less) traits can reuse the +// same pointer for upcasting. +// +// build-fail +#![crate_type = "lib"] +#![feature(rustc_attrs)] + +// Markers +trait M0 {} +trait M1 {} +trait M2 {} + +// Just a trait with a method +trait T { + fn method(&self) {} +} + +#[rustc_dump_vtable] +trait A: M0 + M1 + M2 + T {} //~ error: vtable entries for `<S as A>`: + +#[rustc_dump_vtable] +trait B: M0 + M1 + T + M2 {} //~ error: vtable entries for `<S as B>`: + +#[rustc_dump_vtable] +trait C: M0 + T + M1 + M2 {} //~ error: vtable entries for `<S as C>`: + +#[rustc_dump_vtable] +trait D: T + M0 + M1 + M2 {} //~ error: vtable entries for `<S as D>`: + +struct S; + +impl M0 for S {} +impl M1 for S {} +impl M2 for S {} +impl T for S {} +impl A for S {} +impl B for S {} +impl C for S {} +impl D for S {} + +pub fn require_vtables() { + fn require_vtables(_: &dyn A, _: &dyn B, _: &dyn C, _: &dyn D) {} + + require_vtables(&S, &S, &S, &S) +} diff --git a/tests/ui/traits/vtable/multiple-markers.stderr b/tests/ui/traits/vtable/multiple-markers.stderr new file mode 100644 index 00000000000..766be12487b --- /dev/null +++ b/tests/ui/traits/vtable/multiple-markers.stderr @@ -0,0 +1,58 @@ +error: vtable entries for `<S as A>`: [ + MetadataDropInPlace, + MetadataSize, + MetadataAlign, + TraitVPtr(<S as M1>), + TraitVPtr(<S as M2>), + Method(<S as T>::method), + TraitVPtr(<S as T>), + ] + --> $DIR/multiple-markers.rs:21:1 + | +LL | trait A: M0 + M1 + M2 + T {} + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: vtable entries for `<S as B>`: [ + MetadataDropInPlace, + MetadataSize, + MetadataAlign, + TraitVPtr(<S as M1>), + Method(<S as T>::method), + TraitVPtr(<S as T>), + TraitVPtr(<S as M2>), + ] + --> $DIR/multiple-markers.rs:24:1 + | +LL | trait B: M0 + M1 + T + M2 {} + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: vtable entries for `<S as C>`: [ + MetadataDropInPlace, + MetadataSize, + MetadataAlign, + Method(<S as T>::method), + TraitVPtr(<S as T>), + TraitVPtr(<S as M1>), + TraitVPtr(<S as M2>), + ] + --> $DIR/multiple-markers.rs:27:1 + | +LL | trait C: M0 + T + M1 + M2 {} + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: vtable entries for `<S as D>`: [ + MetadataDropInPlace, + MetadataSize, + MetadataAlign, + Method(<S as T>::method), + TraitVPtr(<S as M0>), + TraitVPtr(<S as M1>), + TraitVPtr(<S as M2>), + ] + --> $DIR/multiple-markers.rs:30:1 + | +LL | trait D: T + M0 + M1 + M2 {} + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to 4 previous errors + |
