test for some bad use of vtables
This commit is contained in:
parent
a6b35412d8
commit
bd441b1eb9
4 changed files with 104 additions and 0 deletions
16
tests/fail/dyn-call-trait-mismatch.rs
Normal file
16
tests/fail/dyn-call-trait-mismatch.rs
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
trait T1 {
|
||||
fn method1(self: Box<Self>);
|
||||
}
|
||||
trait T2 {
|
||||
fn method2(self: Box<Self>);
|
||||
}
|
||||
|
||||
impl T1 for i32 {
|
||||
fn method1(self: Box<Self>) {}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let r = Box::new(0) as Box<dyn T1>;
|
||||
let r2: Box<dyn T2> = unsafe { std::mem::transmute(r) };
|
||||
r2.method2(); //~ERROR: call on a pointer whose vtable does not match its type
|
||||
}
|
||||
15
tests/fail/dyn-call-trait-mismatch.stderr
Normal file
15
tests/fail/dyn-call-trait-mismatch.stderr
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
error: Undefined Behavior: `dyn` call on a pointer whose vtable does not match its type
|
||||
--> $DIR/dyn-call-trait-mismatch.rs:LL:CC
|
||||
|
|
||||
LL | r2.method2();
|
||||
| ^^^^^^^^^^^^ `dyn` call on a pointer whose vtable does not match its type
|
||||
|
|
||||
= help: this indicates a bug in the program: it performed an invalid operation, and caused Undefined Behavior
|
||||
= help: see https://doc.rust-lang.org/nightly/reference/behavior-considered-undefined.html for further information
|
||||
= note: backtrace:
|
||||
= note: inside `main` at $DIR/dyn-call-trait-mismatch.rs:LL:CC
|
||||
|
||||
note: some details are omitted, run with `MIRIFLAGS=-Zmiri-backtrace=full` for a verbose backtrace
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
58
tests/fail/dyn-upcast-trait-mismatch.rs
Normal file
58
tests/fail/dyn-upcast-trait-mismatch.rs
Normal file
|
|
@ -0,0 +1,58 @@
|
|||
#![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;
|
||||
}
|
||||
15
tests/fail/dyn-upcast-trait-mismatch.stderr
Normal file
15
tests/fail/dyn-upcast-trait-mismatch.stderr
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
error: Undefined Behavior: upcast on a pointer whose vtable does not match its type
|
||||
--> $DIR/dyn-upcast-trait-mismatch.rs:LL:CC
|
||||
|
|
||||
LL | let baz_fake: &dyn Bar = unsafe { std::mem::transmute(baz) };
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^ upcast on a pointer whose vtable does not match its type
|
||||
|
|
||||
= help: this indicates a bug in the program: it performed an invalid operation, and caused Undefined Behavior
|
||||
= help: see https://doc.rust-lang.org/nightly/reference/behavior-considered-undefined.html for further information
|
||||
= note: backtrace:
|
||||
= note: inside `main` at $DIR/dyn-upcast-trait-mismatch.rs:LL:CC
|
||||
|
||||
note: some details are omitted, run with `MIRIFLAGS=-Zmiri-backtrace=full` for a verbose backtrace
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue