Add more tests
This commit is contained in:
parent
e3800a1a04
commit
c4bce0b8b1
@ -9,6 +9,7 @@ fn main() {
|
|||||||
struct_();
|
struct_();
|
||||||
replace_vptr();
|
replace_vptr();
|
||||||
vtable_nop_cast();
|
vtable_nop_cast();
|
||||||
|
drop_principal();
|
||||||
}
|
}
|
||||||
|
|
||||||
fn vtable_nop_cast() {
|
fn vtable_nop_cast() {
|
||||||
@ -430,3 +431,53 @@ fn invoke_outer(c: &dyn C) {
|
|||||||
let s = S(42);
|
let s = S(42);
|
||||||
invoke_outer(&s);
|
invoke_outer(&s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn drop_principal() {
|
||||||
|
use std::{alloc::Layout, any::Any};
|
||||||
|
|
||||||
|
const fn yeet_principal(x: Box<dyn Any + Send>) -> Box<dyn Send> {
|
||||||
|
x
|
||||||
|
}
|
||||||
|
|
||||||
|
trait Bar: Send + Sync {}
|
||||||
|
|
||||||
|
impl<T: Send + Sync> Bar for T {}
|
||||||
|
|
||||||
|
const fn yeet_principal_2(x: Box<dyn Bar>) -> Box<dyn Send> {
|
||||||
|
x
|
||||||
|
}
|
||||||
|
|
||||||
|
struct CallMe<F: FnOnce()>(Option<F>);
|
||||||
|
|
||||||
|
impl<F: FnOnce()> CallMe<F> {
|
||||||
|
fn new(f: F) -> Self {
|
||||||
|
CallMe(Some(f))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<F: FnOnce()> Drop for CallMe<F> {
|
||||||
|
fn drop(&mut self) {
|
||||||
|
(self.0.take().unwrap())();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn goodbye() {
|
||||||
|
println!("goodbye");
|
||||||
|
}
|
||||||
|
|
||||||
|
let x = Box::new(CallMe::new(goodbye)) as Box<dyn Any + Send>;
|
||||||
|
let x_layout = Layout::for_value(&*x);
|
||||||
|
let y = yeet_principal(x);
|
||||||
|
let y_layout = Layout::for_value(&*y);
|
||||||
|
assert_eq!(x_layout, y_layout);
|
||||||
|
println!("before");
|
||||||
|
drop(y);
|
||||||
|
|
||||||
|
let x = Box::new(CallMe::new(goodbye)) as Box<dyn Bar>;
|
||||||
|
let x_layout = Layout::for_value(&*x);
|
||||||
|
let y = yeet_principal_2(x);
|
||||||
|
let y_layout = Layout::for_value(&*y);
|
||||||
|
assert_eq!(x_layout, y_layout);
|
||||||
|
println!("before");
|
||||||
|
drop(y);
|
||||||
|
}
|
||||||
|
4
src/tools/miri/tests/pass/dyn-upcast.stdout
Normal file
4
src/tools/miri/tests/pass/dyn-upcast.stdout
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
before
|
||||||
|
goodbye
|
||||||
|
before
|
||||||
|
goodbye
|
@ -1,7 +1,7 @@
|
|||||||
//@ run-pass
|
//@ run-pass
|
||||||
//@ check-run-results
|
//@ check-run-results
|
||||||
|
|
||||||
use std::any::Any;
|
use std::{alloc::Layout, any::Any};
|
||||||
|
|
||||||
const fn yeet_principal(x: Box<dyn Any + Send>) -> Box<dyn Send> {
|
const fn yeet_principal(x: Box<dyn Any + Send>) -> Box<dyn Send> {
|
||||||
x
|
x
|
||||||
@ -35,12 +35,18 @@ fn goodbye() {
|
|||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let x = Box::new(CallMe::new(goodbye)) as Box<dyn Any + Send>;
|
let x = Box::new(CallMe::new(goodbye)) as Box<dyn Any + Send>;
|
||||||
|
let x_layout = Layout::for_value(&*x);
|
||||||
let y = yeet_principal(x);
|
let y = yeet_principal(x);
|
||||||
|
let y_layout = Layout::for_value(&*y);
|
||||||
|
assert_eq!(x_layout, y_layout);
|
||||||
println!("before");
|
println!("before");
|
||||||
drop(y);
|
drop(y);
|
||||||
|
|
||||||
let x = Box::new(CallMe::new(goodbye)) as Box<dyn Bar>;
|
let x = Box::new(CallMe::new(goodbye)) as Box<dyn Bar>;
|
||||||
|
let x_layout = Layout::for_value(&*x);
|
||||||
let y = yeet_principal_2(x);
|
let y = yeet_principal_2(x);
|
||||||
|
let y_layout = Layout::for_value(&*y);
|
||||||
|
assert_eq!(x_layout, y_layout);
|
||||||
println!("before");
|
println!("before");
|
||||||
drop(y);
|
drop(y);
|
||||||
}
|
}
|
||||||
|
12
tests/ui/traits/dyn-star-drop-principal.rs
Normal file
12
tests/ui/traits/dyn-star-drop-principal.rs
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
#![feature(dyn_star)]
|
||||||
|
#![allow(incomplete_features)]
|
||||||
|
|
||||||
|
trait Trait {}
|
||||||
|
impl Trait for usize {}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
// We allow &dyn Trait + Send -> &dyn Send (i.e. dropping principal),
|
||||||
|
// but we don't (currently?) allow the same for dyn*
|
||||||
|
let x: dyn* Trait + Send = 1usize;
|
||||||
|
x as dyn* Send; //~ error: `dyn* Trait + Send` needs to have the same ABI as a pointer
|
||||||
|
}
|
11
tests/ui/traits/dyn-star-drop-principal.stderr
Normal file
11
tests/ui/traits/dyn-star-drop-principal.stderr
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
error[E0277]: `dyn* Trait + Send` needs to have the same ABI as a pointer
|
||||||
|
--> $DIR/dyn-star-drop-principal.rs:11:5
|
||||||
|
|
|
||||||
|
LL | x as dyn* Send;
|
||||||
|
| ^ `dyn* Trait + Send` needs to be a pointer-like type
|
||||||
|
|
|
||||||
|
= help: the trait `PointerLike` is not implemented for `dyn* Trait + Send`
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0277`.
|
Loading…
Reference in New Issue
Block a user