]> git.lizzy.rs Git - rust.git/blob - src/tools/miri/tests/pass/ptr_int_casts.rs
Rollup merge of #105784 - yanns:update_stdarch, r=Amanieu
[rust.git] / src / tools / miri / tests / pass / ptr_int_casts.rs
1 //@compile-flags: -Zmiri-permissive-provenance
2 use std::mem;
3 use std::ptr;
4
5 fn eq_ref<T>(x: &T, y: &T) -> bool {
6     x as *const _ == y as *const _
7 }
8
9 fn f() -> i32 {
10     42
11 }
12
13 fn ptr_int_casts() {
14     // int-ptr-int
15     assert_eq!(1 as *const i32 as usize, 1);
16     assert_eq!((1 as *const i32).wrapping_offset(4) as usize, 1 + 4 * 4);
17
18     // negative overflowing wrapping_offset (going through memory because
19     // this used to trigger an ICE on 32bit)
20     let val = &mut ptr::null();
21     *val = (1 as *const u8).wrapping_offset(-4);
22     assert_eq!(*val as usize, usize::MAX - 2);
23
24     // ptr-int-ptr
25     {
26         let x = 13;
27         let mut y = &x as &_ as *const _ as usize;
28         y += 13;
29         y -= 13;
30         let y = y as *const _;
31         assert!(eq_ref(&x, unsafe { &*y }));
32     }
33
34     // fnptr-int-fnptr
35     {
36         let x: fn() -> i32 = f;
37         let y: *mut u8 = unsafe { mem::transmute(x as fn() -> i32) };
38         let mut y = y as usize;
39         y += 13;
40         y -= 13;
41         let x: fn() -> i32 = unsafe { mem::transmute(y as *mut u8) };
42         assert_eq!(x(), 42);
43     }
44
45     // involving types other than usize
46     assert_eq!((-1i32) as usize as *const i32 as usize, (-1i32) as usize);
47 }
48
49 fn ptr_int_ops() {
50     let v = [1i16, 2];
51     let x = &v[1] as *const i16 as usize;
52     // arithmetic
53     let _y = x + 4;
54     let _y = 4 + x;
55     let _y = x - 2;
56     // bit-operations, covered by alignment
57     assert_eq!(x & 1, 0);
58     assert_eq!(x & 0, 0);
59     assert_eq!(1 & (x + 1), 1);
60     let _y = !1 & x;
61     let _y = !0 & x;
62     let _y = x & !1;
63     // remainder, covered by alignment
64     assert_eq!(x % 2, 0);
65     assert_eq!((x + 1) % 2, 1);
66     // remainder with 1 is always 0
67     assert_eq!(x % 1, 0);
68 }
69
70 fn main() {
71     ptr_int_casts();
72     ptr_int_ops();
73 }