diff --git a/rust-version b/rust-version index bc65b5b6751b..afa5b6ae4861 100644 --- a/rust-version +++ b/rust-version @@ -1 +1 @@ -e862c01aadb2d029864f7bb256cf6c85bbb5d7e4 +12307b3b08edee543a78fb9d4a837fbd6d6ac0fa diff --git a/tests/compile-fail/issue-miri-1112.rs b/tests/compile-fail/issue-miri-1112.rs new file mode 100644 index 000000000000..29cc5c781200 --- /dev/null +++ b/tests/compile-fail/issue-miri-1112.rs @@ -0,0 +1,46 @@ +trait Empty {} + +#[repr(transparent)] +pub struct FunnyPointer(dyn Empty); + +#[repr(C)] +pub struct Meta { + drop_fn: fn(&mut ()), + size: usize, + align: usize, +} + +impl Meta { + pub fn new() -> Self { + Meta { + drop_fn: |_| {}, + size: 0, + align: 1, + } + } +} + +#[repr(C)] +pub struct FatPointer { + pub data: *const (), + pub vtable: *const (), +} + +impl FunnyPointer { + pub unsafe fn from_data_ptr(data: &String, ptr: *const Meta) -> &Self { + let obj = FatPointer { + data: data as *const _ as *const (), + vtable: ptr as *const _ as *const (), + }; + let obj = std::mem::transmute::(obj); //~ ERROR invalid drop fn in vtable + &*obj + } +} + +fn main() { + unsafe { + let meta = Meta::new(); + let hello = "hello".to_string(); + let _raw: &FunnyPointer = FunnyPointer::from_data_ptr(&hello, &meta as *const _); + } +}