]> git.lizzy.rs Git - rust.git/blob - src/tools/miri/tests/pass/box.rs
Auto merge of #99609 - workingjubilee:lossy-unix-strerror, r=thomcc
[rust.git] / src / tools / miri / tests / pass / box.rs
1 #![feature(ptr_internals)]
2
3 fn main() {
4     into_raw();
5     into_unique();
6     boxed_pair_to_vec();
7 }
8
9 fn into_raw() {
10     unsafe {
11         let b = Box::new(4i32);
12         let r = Box::into_raw(b);
13
14         // "lose the tag"
15         let r2 = ((r as usize) + 0) as *mut i32;
16         *(&mut *r2) = 7;
17
18         // Use original ptr again
19         *(&mut *r) = 17;
20         drop(Box::from_raw(r));
21     }
22 }
23
24 fn into_unique() {
25     unsafe {
26         let b = Box::new(4i32);
27         let u = Box::into_unique(b).0;
28
29         // "lose the tag"
30         let r = ((u.as_ptr() as usize) + 0) as *mut i32;
31         *(&mut *r) = 7;
32
33         // Use original ptr again.
34         drop(Box::from_raw(u.as_ptr()));
35     }
36 }
37
38 fn boxed_pair_to_vec() {
39     #[repr(C)]
40     #[derive(Debug)]
41     struct PairFoo {
42         fst: Foo,
43         snd: Foo,
44     }
45
46     #[derive(Debug)]
47     struct Foo(u64);
48     fn reinterstruct(box_pair: Box<PairFoo>) -> Vec<Foo> {
49         let ref_pair = Box::leak(box_pair) as *mut PairFoo;
50         let ptr_foo = unsafe { std::ptr::addr_of_mut!((*ref_pair).fst) };
51         unsafe { Vec::from_raw_parts(ptr_foo, 2, 2) }
52     }
53
54     let pair_foo = Box::new(PairFoo { fst: Foo(42), snd: Foo(1337) });
55     println!("pair_foo = {:?}", pair_foo);
56     for (n, foo) in reinterstruct(pair_foo).into_iter().enumerate() {
57         println!("foo #{} = {:?}", n, foo);
58     }
59 }