| use std::ptr; | |
| const IS_NULL: () = { | |
| assert!(ptr::null::<u8>().is_null()); | |
| }; | |
| const IS_NOT_NULL: () = { | |
| assert!(!ptr::null::<u8>().wrapping_add(1).is_null()); | |
| }; | |
| const MAYBE_NULL: () = { | |
| let x = 15; | |
| let ptr = &x as *const i32; | |
| // This one is still unambiguous... | |
| assert!(!ptr.is_null()); | |
| // and in fact, any offset not visible by 4 (the alignment) cannot be null, | |
| // even if it goes out-of-bounds... | |
| assert!(!ptr.wrapping_byte_add(13).is_null()); | |
| assert!(!ptr.wrapping_byte_add(18).is_null()); | |
| assert!(!ptr.wrapping_byte_sub(1).is_null()); | |
| // ... but once we shift outside the allocation, with an offset divisible by 4, | |
| // we might become null. | |
| assert!(!ptr.wrapping_sub(512).is_null()); //~ ERROR null-ness of this pointer cannot be determined | |
| }; | |
| fn main() {} |