mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-26 16:54:01 +00:00
Add a (failing test) for issue 113840
This commit is contained in:
parent
f33936c567
commit
b5d1228508
47
tests/ui/traits/vtable/multiple-markers.rs
Normal file
47
tests/ui/traits/vtable/multiple-markers.rs
Normal file
@ -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)
|
||||
}
|
58
tests/ui/traits/vtable/multiple-markers.stderr
Normal file
58
tests/ui/traits/vtable/multiple-markers.stderr
Normal file
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user