rust/tests/run-pass-noseed/ptr_int_casts.rs

44 lines
1.2 KiB
Rust
Raw Normal View History

// FIXME move this to run-pass, it should work with intptrcast.
use std::mem;
2019-05-26 07:47:37 -05:00
use std::ptr;
2017-06-05 17:18:40 -05:00
fn eq_ref<T>(x: &T, y: &T) -> bool {
x as *const _ == y as *const _
}
2017-06-04 12:42:02 -05:00
fn f() -> i32 { 42 }
2017-06-04 12:42:02 -05:00
fn main() {
// int-ptr-int
assert_eq!(1 as *const i32 as usize, 1);
assert_eq!((1 as *const i32).wrapping_offset(4) as usize, 1 + 4*4);
2017-06-04 12:42:02 -05:00
2019-05-26 07:47:37 -05:00
// negative overflowing wrapping_offset (going through memory because
// this used to trigger an ICE on 32bit)
let val = &mut ptr::null();
*val = (1 as *const u8).wrapping_offset(-4);
assert_eq!(*val as usize, usize::max_value() - 2);
2017-06-05 17:18:40 -05:00
{ // ptr-int-ptr
let x = 13;
let mut y = &x as &_ as *const _ as usize;
y += 13;
y -= 13;
2017-06-05 17:18:40 -05:00
let y = y as *const _;
assert!(eq_ref(&x, unsafe { &*y }));
}
{ // fnptr-int-fnptr
let x : fn() -> i32 = f;
let y : *mut u8 = unsafe { mem::transmute(x as fn() -> i32) };
let mut y = y as usize;
y += 13;
y -= 13;
let x : fn() -> i32 = unsafe { mem::transmute(y as *mut u8) };
assert_eq!(x(), 42);
}
2017-07-20 15:52:58 -05:00
// involving types other than usize
assert_eq!((-1i32) as usize as *const i32 as usize, (-1i32) as usize);
2017-06-04 12:42:02 -05:00
}