diff --git a/tests/fail/provenance/strict-provenance-offset.rs b/tests/fail/provenance/ptr_invalid_offset.rs similarity index 59% rename from tests/fail/provenance/strict-provenance-offset.rs rename to tests/fail/provenance/ptr_invalid_offset.rs index 6955d0243a9..4447575405b 100644 --- a/tests/fail/provenance/strict-provenance-offset.rs +++ b/tests/fail/provenance/ptr_invalid_offset.rs @@ -1,9 +1,11 @@ // compile-flags: -Zmiri-strict-provenance // error-pattern: not a valid pointer +#![feature(strict_provenance)] fn main() { let x = 22; let ptr = &x as *const _ as *const u8; - let roundtrip = ptr as usize as *const u8; + let roundtrip = std::ptr::invalid::(ptr as usize); + // Not even offsetting this is allowed. let _ = unsafe { roundtrip.offset(1) }; } diff --git a/tests/fail/provenance/strict-provenance-offset.stderr b/tests/fail/provenance/ptr_invalid_offset.stderr similarity index 89% rename from tests/fail/provenance/strict-provenance-offset.stderr rename to tests/fail/provenance/ptr_invalid_offset.stderr index 8e3daca939d..661fabf29af 100644 --- a/tests/fail/provenance/strict-provenance-offset.stderr +++ b/tests/fail/provenance/ptr_invalid_offset.stderr @@ -8,8 +8,8 @@ LL | unsafe { intrinsics::offset(self, count) } = help: see https://doc.rust-lang.org/nightly/reference/behavior-considered-undefined.html for further information = note: inside `std::ptr::const_ptr::::offset` at RUSTLIB/core/src/ptr/const_ptr.rs:LL:CC -note: inside `main` at $DIR/strict-provenance-offset.rs:LL:CC - --> $DIR/strict-provenance-offset.rs:LL:CC +note: inside `main` at $DIR/ptr_invalid_offset.rs:LL:CC + --> $DIR/ptr_invalid_offset.rs:LL:CC | LL | let _ = unsafe { roundtrip.offset(1) }; | ^^^^^^^^^^^^^^^^^^^ diff --git a/tests/pass/slices.rs b/tests/pass/slices.rs index b6537b4f1b4..6cdfbb7841a 100644 --- a/tests/pass/slices.rs +++ b/tests/pass/slices.rs @@ -3,8 +3,10 @@ #![feature(slice_as_chunks)] #![feature(slice_partition_dedup)] #![feature(layout_for_ptr)] +#![feature(strict_provenance)] use std::slice; +use std::ptr; fn slice_of_zst() { fn foo(v: &[T]) -> Option<&[T]> { @@ -25,7 +27,7 @@ fn slice_of_zst() { // In a slice of zero-size elements the pointer is meaningless. // Ensure iteration still works even if the pointer is at the end of the address space. - let slice: &[()] = unsafe { slice::from_raw_parts(-5isize as *const (), 10) }; + let slice: &[()] = unsafe { slice::from_raw_parts(ptr::invalid(-5isize as usize), 10) }; assert_eq!(slice.len(), 10); assert_eq!(slice.iter().count(), 10); @@ -38,7 +40,7 @@ fn slice_of_zst() { assert!(foo(slice).is_some()); // Test mutable iterators as well - let slice: &mut [()] = unsafe { slice::from_raw_parts_mut(-5isize as *mut (), 10) }; + let slice: &mut [()] = unsafe { slice::from_raw_parts_mut(ptr::invalid_mut(-5isize as usize), 10) }; assert_eq!(slice.len(), 10); assert_eq!(slice.iter_mut().count(), 10); @@ -254,7 +256,7 @@ fn test_for_invalidated_pointers() { fn large_raw_slice() { let size = isize::MAX as usize; // Creating a raw slice of size isize::MAX and asking for its size is okay. - let s = std::ptr::slice_from_raw_parts(1usize as *const u8, size); + let s = std::ptr::slice_from_raw_parts(ptr::invalid::(1), size); assert_eq!(size, unsafe { std::mem::size_of_val_raw(s) }); }