1 //@compile-flags: -Zmiri-permissive-provenance
5 fn eq_ref<T>(x: &T, y: &T) -> bool {
6 x as *const _ == y as *const _
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);
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);
27 let mut y = &x as &_ as *const _ as usize;
30 let y = y as *const _;
31 assert!(eq_ref(&x, unsafe { &*y }));
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;
41 let x: fn() -> i32 = unsafe { mem::transmute(y as *mut u8) };
45 // involving types other than usize
46 assert_eq!((-1i32) as usize as *const i32 as usize, (-1i32) as usize);
51 let x = &v[1] as *const i16 as usize;
56 // bit-operations, covered by alignment
59 assert_eq!(1 & (x + 1), 1);
63 // remainder, covered by alignment
65 assert_eq!((x + 1) % 2, 1);
66 // remainder with 1 is always 0