diff options
Diffstat (limited to 'src/tools/miri/tests/pass/box.rs')
| -rw-r--r-- | src/tools/miri/tests/pass/box.rs | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/src/tools/miri/tests/pass/box.rs b/src/tools/miri/tests/pass/box.rs new file mode 100644 index 00000000000..7bbe7be516b --- /dev/null +++ b/src/tools/miri/tests/pass/box.rs @@ -0,0 +1,59 @@ +#![feature(ptr_internals)] + +fn main() { + into_raw(); + into_unique(); + boxed_pair_to_vec(); +} + +fn into_raw() { + unsafe { + let b = Box::new(4i32); + let r = Box::into_raw(b); + + // "lose the tag" + let r2 = ((r as usize) + 0) as *mut i32; + *(&mut *r2) = 7; + + // Use original ptr again + *(&mut *r) = 17; + drop(Box::from_raw(r)); + } +} + +fn into_unique() { + unsafe { + let b = Box::new(4i32); + let u = Box::into_unique(b).0; + + // "lose the tag" + let r = ((u.as_ptr() as usize) + 0) as *mut i32; + *(&mut *r) = 7; + + // Use original ptr again. + drop(Box::from_raw(u.as_ptr())); + } +} + +fn boxed_pair_to_vec() { + #[repr(C)] + #[derive(Debug)] + struct PairFoo { + fst: Foo, + snd: Foo, + } + + #[derive(Debug)] + struct Foo(u64); + fn reinterstruct(box_pair: Box<PairFoo>) -> Vec<Foo> { + let ref_pair = Box::leak(box_pair) as *mut PairFoo; + let ptr_foo = unsafe { std::ptr::addr_of_mut!((*ref_pair).fst) }; + unsafe { Vec::from_raw_parts(ptr_foo, 2, 2) } + } + + let pair_foo = Box::new(PairFoo { fst: Foo(42), snd: Foo(1337) }); + println!("pair_foo = {:?}", pair_foo); + for (n, foo) in reinterstruct(pair_foo).into_iter().enumerate() { + println!("foo #{} = {:?}", n, foo); + } +} |
