Stabilize [const_]pointer_byte_offsets

This commit is contained in:
Maybe Waffle 2022-09-04 21:13:44 +04:00 committed by Maybe Waffle
parent cf226e93dc
commit e36224118f
17 changed files with 67 additions and 74 deletions

View File

@ -18,7 +18,6 @@
#![feature(new_uninit)] #![feature(new_uninit)]
#![feature(maybe_uninit_slice)] #![feature(maybe_uninit_slice)]
#![feature(decl_macro)] #![feature(decl_macro)]
#![feature(pointer_byte_offsets)]
#![feature(rustc_attrs)] #![feature(rustc_attrs)]
#![cfg_attr(test, feature(test))] #![cfg_attr(test, feature(test))]
#![feature(strict_provenance)] #![feature(strict_provenance)]

View File

@ -141,7 +141,6 @@
#![feature(maybe_uninit_uninit_array)] #![feature(maybe_uninit_uninit_array)]
#![feature(maybe_uninit_uninit_array_transpose)] #![feature(maybe_uninit_uninit_array_transpose)]
#![feature(pattern)] #![feature(pattern)]
#![feature(pointer_byte_offsets)]
#![feature(ptr_addr_eq)] #![feature(ptr_addr_eq)]
#![feature(ptr_internals)] #![feature(ptr_internals)]
#![feature(ptr_metadata)] #![feature(ptr_metadata)]

View File

@ -148,7 +148,6 @@
#![feature(const_option)] #![feature(const_option)]
#![feature(const_option_ext)] #![feature(const_option_ext)]
#![feature(const_pin)] #![feature(const_pin)]
#![feature(const_pointer_byte_offsets)]
#![feature(const_pointer_is_aligned)] #![feature(const_pointer_is_aligned)]
#![feature(const_ptr_as_ref)] #![feature(const_ptr_as_ref)]
#![feature(const_ptr_is_null)] #![feature(const_ptr_is_null)]

View File

@ -480,8 +480,9 @@ impl<T: ?Sized> *const T {
/// leaving the metadata untouched. /// leaving the metadata untouched.
#[must_use] #[must_use]
#[inline(always)] #[inline(always)]
#[unstable(feature = "pointer_byte_offsets", issue = "96283")] #[stable(feature = "pointer_byte_offsets", since = "CURRENT_RUSTC_VERSION")]
#[rustc_const_unstable(feature = "const_pointer_byte_offsets", issue = "96283")] #[rustc_const_stable(feature = "const_pointer_byte_offsets", since = "CURRENT_RUSTC_VERSION")]
#[rustc_allow_const_fn_unstable(set_ptr_value)]
#[cfg_attr(miri, track_caller)] // even without panics, this helps for Miri backtraces #[cfg_attr(miri, track_caller)] // even without panics, this helps for Miri backtraces
pub const unsafe fn byte_offset(self, count: isize) -> Self { pub const unsafe fn byte_offset(self, count: isize) -> Self {
// SAFETY: the caller must uphold the safety contract for `offset`. // SAFETY: the caller must uphold the safety contract for `offset`.
@ -560,8 +561,9 @@ impl<T: ?Sized> *const T {
/// leaving the metadata untouched. /// leaving the metadata untouched.
#[must_use] #[must_use]
#[inline(always)] #[inline(always)]
#[unstable(feature = "pointer_byte_offsets", issue = "96283")] #[stable(feature = "pointer_byte_offsets", since = "CURRENT_RUSTC_VERSION")]
#[rustc_const_unstable(feature = "const_pointer_byte_offsets", issue = "96283")] #[rustc_const_stable(feature = "const_pointer_byte_offsets", since = "CURRENT_RUSTC_VERSION")]
#[rustc_allow_const_fn_unstable(set_ptr_value)]
pub const fn wrapping_byte_offset(self, count: isize) -> Self { pub const fn wrapping_byte_offset(self, count: isize) -> Self {
self.cast::<u8>().wrapping_offset(count).with_metadata_of(self) self.cast::<u8>().wrapping_offset(count).with_metadata_of(self)
} }
@ -726,8 +728,9 @@ impl<T: ?Sized> *const T {
/// For non-`Sized` pointees this operation considers only the data pointers, /// For non-`Sized` pointees this operation considers only the data pointers,
/// ignoring the metadata. /// ignoring the metadata.
#[inline(always)] #[inline(always)]
#[unstable(feature = "pointer_byte_offsets", issue = "96283")] #[stable(feature = "pointer_byte_offsets", since = "CURRENT_RUSTC_VERSION")]
#[rustc_const_unstable(feature = "const_pointer_byte_offsets", issue = "96283")] #[rustc_const_stable(feature = "const_pointer_byte_offsets", since = "CURRENT_RUSTC_VERSION")]
#[rustc_allow_const_fn_unstable(set_ptr_value)]
#[cfg_attr(miri, track_caller)] // even without panics, this helps for Miri backtraces #[cfg_attr(miri, track_caller)] // even without panics, this helps for Miri backtraces
pub const unsafe fn byte_offset_from<U: ?Sized>(self, origin: *const U) -> isize { pub const unsafe fn byte_offset_from<U: ?Sized>(self, origin: *const U) -> isize {
// SAFETY: the caller must uphold the safety contract for `offset_from`. // SAFETY: the caller must uphold the safety contract for `offset_from`.
@ -952,8 +955,9 @@ impl<T: ?Sized> *const T {
/// leaving the metadata untouched. /// leaving the metadata untouched.
#[must_use] #[must_use]
#[inline(always)] #[inline(always)]
#[unstable(feature = "pointer_byte_offsets", issue = "96283")] #[stable(feature = "pointer_byte_offsets", since = "CURRENT_RUSTC_VERSION")]
#[rustc_const_unstable(feature = "const_pointer_byte_offsets", issue = "96283")] #[rustc_const_stable(feature = "const_pointer_byte_offsets", since = "CURRENT_RUSTC_VERSION")]
#[rustc_allow_const_fn_unstable(set_ptr_value)]
#[cfg_attr(miri, track_caller)] // even without panics, this helps for Miri backtraces #[cfg_attr(miri, track_caller)] // even without panics, this helps for Miri backtraces
pub const unsafe fn byte_add(self, count: usize) -> Self { pub const unsafe fn byte_add(self, count: usize) -> Self {
// SAFETY: the caller must uphold the safety contract for `add`. // SAFETY: the caller must uphold the safety contract for `add`.
@ -1045,8 +1049,9 @@ impl<T: ?Sized> *const T {
/// leaving the metadata untouched. /// leaving the metadata untouched.
#[must_use] #[must_use]
#[inline(always)] #[inline(always)]
#[unstable(feature = "pointer_byte_offsets", issue = "96283")] #[stable(feature = "pointer_byte_offsets", since = "CURRENT_RUSTC_VERSION")]
#[rustc_const_unstable(feature = "const_pointer_byte_offsets", issue = "96283")] #[rustc_const_stable(feature = "const_pointer_byte_offsets", since = "CURRENT_RUSTC_VERSION")]
#[rustc_allow_const_fn_unstable(set_ptr_value)]
#[cfg_attr(miri, track_caller)] // even without panics, this helps for Miri backtraces #[cfg_attr(miri, track_caller)] // even without panics, this helps for Miri backtraces
pub const unsafe fn byte_sub(self, count: usize) -> Self { pub const unsafe fn byte_sub(self, count: usize) -> Self {
// SAFETY: the caller must uphold the safety contract for `sub`. // SAFETY: the caller must uphold the safety contract for `sub`.
@ -1125,8 +1130,9 @@ impl<T: ?Sized> *const T {
/// leaving the metadata untouched. /// leaving the metadata untouched.
#[must_use] #[must_use]
#[inline(always)] #[inline(always)]
#[unstable(feature = "pointer_byte_offsets", issue = "96283")] #[stable(feature = "pointer_byte_offsets", since = "CURRENT_RUSTC_VERSION")]
#[rustc_const_unstable(feature = "const_pointer_byte_offsets", issue = "96283")] #[rustc_const_stable(feature = "const_pointer_byte_offsets", since = "CURRENT_RUSTC_VERSION")]
#[rustc_allow_const_fn_unstable(set_ptr_value)]
pub const fn wrapping_byte_add(self, count: usize) -> Self { pub const fn wrapping_byte_add(self, count: usize) -> Self {
self.cast::<u8>().wrapping_add(count).with_metadata_of(self) self.cast::<u8>().wrapping_add(count).with_metadata_of(self)
} }
@ -1203,8 +1209,9 @@ impl<T: ?Sized> *const T {
/// leaving the metadata untouched. /// leaving the metadata untouched.
#[must_use] #[must_use]
#[inline(always)] #[inline(always)]
#[unstable(feature = "pointer_byte_offsets", issue = "96283")] #[stable(feature = "pointer_byte_offsets", since = "CURRENT_RUSTC_VERSION")]
#[rustc_const_unstable(feature = "const_pointer_byte_offsets", issue = "96283")] #[rustc_const_stable(feature = "const_pointer_byte_offsets", since = "CURRENT_RUSTC_VERSION")]
#[rustc_allow_const_fn_unstable(set_ptr_value)]
pub const fn wrapping_byte_sub(self, count: usize) -> Self { pub const fn wrapping_byte_sub(self, count: usize) -> Self {
self.cast::<u8>().wrapping_sub(count).with_metadata_of(self) self.cast::<u8>().wrapping_sub(count).with_metadata_of(self)
} }
@ -1372,7 +1379,6 @@ impl<T: ?Sized> *const T {
/// ///
/// ``` /// ```
/// #![feature(pointer_is_aligned)] /// #![feature(pointer_is_aligned)]
/// #![feature(pointer_byte_offsets)]
/// ///
/// // On some platforms, the alignment of i32 is less than 4. /// // On some platforms, the alignment of i32 is less than 4.
/// #[repr(align(4))] /// #[repr(align(4))]
@ -1494,7 +1500,6 @@ impl<T: ?Sized> *const T {
/// ///
/// ``` /// ```
/// #![feature(pointer_is_aligned)] /// #![feature(pointer_is_aligned)]
/// #![feature(pointer_byte_offsets)]
/// ///
/// // On some platforms, the alignment of i32 is less than 4. /// // On some platforms, the alignment of i32 is less than 4.
/// #[repr(align(4))] /// #[repr(align(4))]

View File

@ -495,8 +495,9 @@ impl<T: ?Sized> *mut T {
/// leaving the metadata untouched. /// leaving the metadata untouched.
#[must_use] #[must_use]
#[inline(always)] #[inline(always)]
#[unstable(feature = "pointer_byte_offsets", issue = "96283")] #[stable(feature = "pointer_byte_offsets", since = "CURRENT_RUSTC_VERSION")]
#[rustc_const_unstable(feature = "const_pointer_byte_offsets", issue = "96283")] #[rustc_const_stable(feature = "const_pointer_byte_offsets", since = "CURRENT_RUSTC_VERSION")]
#[rustc_allow_const_fn_unstable(set_ptr_value)]
#[cfg_attr(miri, track_caller)] // even without panics, this helps for Miri backtraces #[cfg_attr(miri, track_caller)] // even without panics, this helps for Miri backtraces
pub const unsafe fn byte_offset(self, count: isize) -> Self { pub const unsafe fn byte_offset(self, count: isize) -> Self {
// SAFETY: the caller must uphold the safety contract for `offset`. // SAFETY: the caller must uphold the safety contract for `offset`.
@ -574,8 +575,9 @@ impl<T: ?Sized> *mut T {
/// leaving the metadata untouched. /// leaving the metadata untouched.
#[must_use] #[must_use]
#[inline(always)] #[inline(always)]
#[unstable(feature = "pointer_byte_offsets", issue = "96283")] #[stable(feature = "pointer_byte_offsets", since = "CURRENT_RUSTC_VERSION")]
#[rustc_const_unstable(feature = "const_pointer_byte_offsets", issue = "96283")] #[rustc_const_stable(feature = "const_pointer_byte_offsets", since = "CURRENT_RUSTC_VERSION")]
#[rustc_allow_const_fn_unstable(set_ptr_value)]
pub const fn wrapping_byte_offset(self, count: isize) -> Self { pub const fn wrapping_byte_offset(self, count: isize) -> Self {
self.cast::<u8>().wrapping_offset(count).with_metadata_of(self) self.cast::<u8>().wrapping_offset(count).with_metadata_of(self)
} }
@ -898,8 +900,9 @@ impl<T: ?Sized> *mut T {
/// For non-`Sized` pointees this operation considers only the data pointers, /// For non-`Sized` pointees this operation considers only the data pointers,
/// ignoring the metadata. /// ignoring the metadata.
#[inline(always)] #[inline(always)]
#[unstable(feature = "pointer_byte_offsets", issue = "96283")] #[stable(feature = "pointer_byte_offsets", since = "CURRENT_RUSTC_VERSION")]
#[rustc_const_unstable(feature = "const_pointer_byte_offsets", issue = "96283")] #[rustc_const_stable(feature = "const_pointer_byte_offsets", since = "CURRENT_RUSTC_VERSION")]
#[rustc_allow_const_fn_unstable(set_ptr_value)]
#[cfg_attr(miri, track_caller)] // even without panics, this helps for Miri backtraces #[cfg_attr(miri, track_caller)] // even without panics, this helps for Miri backtraces
pub const unsafe fn byte_offset_from<U: ?Sized>(self, origin: *const U) -> isize { pub const unsafe fn byte_offset_from<U: ?Sized>(self, origin: *const U) -> isize {
// SAFETY: the caller must uphold the safety contract for `offset_from`. // SAFETY: the caller must uphold the safety contract for `offset_from`.
@ -1053,8 +1056,9 @@ impl<T: ?Sized> *mut T {
/// leaving the metadata untouched. /// leaving the metadata untouched.
#[must_use] #[must_use]
#[inline(always)] #[inline(always)]
#[unstable(feature = "pointer_byte_offsets", issue = "96283")] #[stable(feature = "pointer_byte_offsets", since = "CURRENT_RUSTC_VERSION")]
#[rustc_const_unstable(feature = "const_pointer_byte_offsets", issue = "96283")] #[rustc_const_stable(feature = "const_pointer_byte_offsets", since = "CURRENT_RUSTC_VERSION")]
#[rustc_allow_const_fn_unstable(set_ptr_value)]
#[cfg_attr(miri, track_caller)] // even without panics, this helps for Miri backtraces #[cfg_attr(miri, track_caller)] // even without panics, this helps for Miri backtraces
pub const unsafe fn byte_add(self, count: usize) -> Self { pub const unsafe fn byte_add(self, count: usize) -> Self {
// SAFETY: the caller must uphold the safety contract for `add`. // SAFETY: the caller must uphold the safety contract for `add`.
@ -1146,8 +1150,9 @@ impl<T: ?Sized> *mut T {
/// leaving the metadata untouched. /// leaving the metadata untouched.
#[must_use] #[must_use]
#[inline(always)] #[inline(always)]
#[unstable(feature = "pointer_byte_offsets", issue = "96283")] #[stable(feature = "pointer_byte_offsets", since = "CURRENT_RUSTC_VERSION")]
#[rustc_const_unstable(feature = "const_pointer_byte_offsets", issue = "96283")] #[rustc_const_stable(feature = "const_pointer_byte_offsets", since = "CURRENT_RUSTC_VERSION")]
#[rustc_allow_const_fn_unstable(set_ptr_value)]
#[cfg_attr(miri, track_caller)] // even without panics, this helps for Miri backtraces #[cfg_attr(miri, track_caller)] // even without panics, this helps for Miri backtraces
pub const unsafe fn byte_sub(self, count: usize) -> Self { pub const unsafe fn byte_sub(self, count: usize) -> Self {
// SAFETY: the caller must uphold the safety contract for `sub`. // SAFETY: the caller must uphold the safety contract for `sub`.
@ -1226,8 +1231,9 @@ impl<T: ?Sized> *mut T {
/// leaving the metadata untouched. /// leaving the metadata untouched.
#[must_use] #[must_use]
#[inline(always)] #[inline(always)]
#[unstable(feature = "pointer_byte_offsets", issue = "96283")] #[stable(feature = "pointer_byte_offsets", since = "CURRENT_RUSTC_VERSION")]
#[rustc_const_unstable(feature = "const_pointer_byte_offsets", issue = "96283")] #[rustc_const_stable(feature = "const_pointer_byte_offsets", since = "CURRENT_RUSTC_VERSION")]
#[rustc_allow_const_fn_unstable(set_ptr_value)]
pub const fn wrapping_byte_add(self, count: usize) -> Self { pub const fn wrapping_byte_add(self, count: usize) -> Self {
self.cast::<u8>().wrapping_add(count).with_metadata_of(self) self.cast::<u8>().wrapping_add(count).with_metadata_of(self)
} }
@ -1304,8 +1310,9 @@ impl<T: ?Sized> *mut T {
/// leaving the metadata untouched. /// leaving the metadata untouched.
#[must_use] #[must_use]
#[inline(always)] #[inline(always)]
#[unstable(feature = "pointer_byte_offsets", issue = "96283")] #[stable(feature = "pointer_byte_offsets", since = "CURRENT_RUSTC_VERSION")]
#[rustc_const_unstable(feature = "const_pointer_byte_offsets", issue = "96283")] #[rustc_const_stable(feature = "const_pointer_byte_offsets", since = "CURRENT_RUSTC_VERSION")]
#[rustc_allow_const_fn_unstable(set_ptr_value)]
pub const fn wrapping_byte_sub(self, count: usize) -> Self { pub const fn wrapping_byte_sub(self, count: usize) -> Self {
self.cast::<u8>().wrapping_sub(count).with_metadata_of(self) self.cast::<u8>().wrapping_sub(count).with_metadata_of(self)
} }
@ -1639,7 +1646,6 @@ impl<T: ?Sized> *mut T {
/// ///
/// ``` /// ```
/// #![feature(pointer_is_aligned)] /// #![feature(pointer_is_aligned)]
/// #![feature(pointer_byte_offsets)]
/// ///
/// // On some platforms, the alignment of i32 is less than 4. /// // On some platforms, the alignment of i32 is less than 4.
/// #[repr(align(4))] /// #[repr(align(4))]
@ -1763,7 +1769,6 @@ impl<T: ?Sized> *mut T {
/// ///
/// ``` /// ```
/// #![feature(pointer_is_aligned)] /// #![feature(pointer_is_aligned)]
/// #![feature(pointer_byte_offsets)]
/// ///
/// // On some platforms, the alignment of i32 is less than 4. /// // On some platforms, the alignment of i32 is less than 4.
/// #[repr(align(4))] /// #[repr(align(4))]

View File

@ -16,7 +16,6 @@
#![feature(const_heap)] #![feature(const_heap)]
#![feature(const_maybe_uninit_as_mut_ptr)] #![feature(const_maybe_uninit_as_mut_ptr)]
#![feature(const_nonnull_new)] #![feature(const_nonnull_new)]
#![feature(const_pointer_byte_offsets)]
#![feature(const_pointer_is_aligned)] #![feature(const_pointer_is_aligned)]
#![feature(const_ptr_as_ref)] #![feature(const_ptr_as_ref)]
#![feature(const_ptr_write)] #![feature(const_ptr_write)]
@ -87,7 +86,6 @@
#![feature(const_waker)] #![feature(const_waker)]
#![feature(never_type)] #![feature(never_type)]
#![feature(unwrap_infallible)] #![feature(unwrap_infallible)]
#![feature(pointer_byte_offsets)]
#![feature(pointer_is_aligned)] #![feature(pointer_is_aligned)]
#![feature(portable_simd)] #![feature(portable_simd)]
#![feature(ptr_metadata)] #![feature(ptr_metadata)]

View File

@ -331,7 +331,6 @@
#![feature(panic_can_unwind)] #![feature(panic_can_unwind)]
#![feature(panic_info_message)] #![feature(panic_info_message)]
#![feature(panic_internals)] #![feature(panic_internals)]
#![feature(pointer_byte_offsets)]
#![feature(pointer_is_aligned)] #![feature(pointer_is_aligned)]
#![feature(portable_simd)] #![feature(portable_simd)]
#![feature(prelude_2024)] #![feature(prelude_2024)]

View File

@ -1,5 +1,3 @@
#![feature(pointer_byte_offsets)]
fn main() { fn main() {
let v: Vec<u16> = vec![1, 2]; let v: Vec<u16> = vec![1, 2];
// This read is also misaligned. We make sure that the OOB message has priority. // This read is also misaligned. We make sure that the OOB message has priority.

View File

@ -1,5 +1,3 @@
#![feature(pointer_byte_offsets)]
fn main() { fn main() {
let mut v: Vec<u16> = vec![1, 2]; let mut v: Vec<u16> = vec![1, 2];
// This read is also misaligned. We make sure that the OOB message has priority. // This read is also misaligned. We make sure that the OOB message has priority.

View File

@ -1,7 +1,6 @@
//@revisions: stack tree //@revisions: stack tree
//@[tree]compile-flags: -Zmiri-tree-borrows //@[tree]compile-flags: -Zmiri-tree-borrows
#![feature(strict_provenance)] #![feature(strict_provenance)]
#![feature(pointer_byte_offsets)]
use std::{mem, ptr}; use std::{mem, ptr};
const PTR_SIZE: usize = mem::size_of::<&i32>(); const PTR_SIZE: usize = mem::size_of::<&i32>();

View File

@ -2,8 +2,6 @@
#![feature( #![feature(
slice_from_ptr_range, slice_from_ptr_range,
const_slice_from_ptr_range, const_slice_from_ptr_range,
pointer_byte_offsets,
const_pointer_byte_offsets
)] )]
use std::{ use std::{
mem::MaybeUninit, mem::MaybeUninit,

View File

@ -5,8 +5,6 @@
#![feature( #![feature(
slice_from_ptr_range, slice_from_ptr_range,
const_slice_from_ptr_range, const_slice_from_ptr_range,
pointer_byte_offsets,
const_pointer_byte_offsets
)] )]
use std::{ use std::{
mem::{size_of, MaybeUninit}, mem::{size_of, MaybeUninit},

View File

@ -1,5 +1,5 @@
error[E0080]: it is undefined behavior to use this value error[E0080]: it is undefined behavior to use this value
--> $DIR/forbidden_slices.rs:18:1 --> $DIR/forbidden_slices.rs:16:1
| |
LL | pub static S0: &[u32] = unsafe { from_raw_parts(ptr::null(), 0) }; LL | pub static S0: &[u32] = unsafe { from_raw_parts(ptr::null(), 0) };
| ^^^^^^^^^^^^^^^^^^^^^ constructing invalid value: encountered a null reference | ^^^^^^^^^^^^^^^^^^^^^ constructing invalid value: encountered a null reference
@ -10,7 +10,7 @@ LL | pub static S0: &[u32] = unsafe { from_raw_parts(ptr::null(), 0) };
} }
error[E0080]: it is undefined behavior to use this value error[E0080]: it is undefined behavior to use this value
--> $DIR/forbidden_slices.rs:20:1 --> $DIR/forbidden_slices.rs:18:1
| |
LL | pub static S1: &[()] = unsafe { from_raw_parts(ptr::null(), 0) }; LL | pub static S1: &[()] = unsafe { from_raw_parts(ptr::null(), 0) };
| ^^^^^^^^^^^^^^^^^^^^ constructing invalid value: encountered a null reference | ^^^^^^^^^^^^^^^^^^^^ constructing invalid value: encountered a null reference
@ -21,7 +21,7 @@ LL | pub static S1: &[()] = unsafe { from_raw_parts(ptr::null(), 0) };
} }
error[E0080]: it is undefined behavior to use this value error[E0080]: it is undefined behavior to use this value
--> $DIR/forbidden_slices.rs:24:1 --> $DIR/forbidden_slices.rs:22:1
| |
LL | pub static S2: &[u32] = unsafe { from_raw_parts(&D0, 2) }; LL | pub static S2: &[u32] = unsafe { from_raw_parts(&D0, 2) };
| ^^^^^^^^^^^^^^^^^^^^^ constructing invalid value: encountered a dangling reference (going beyond the bounds of its allocation) | ^^^^^^^^^^^^^^^^^^^^^ constructing invalid value: encountered a dangling reference (going beyond the bounds of its allocation)
@ -32,7 +32,7 @@ LL | pub static S2: &[u32] = unsafe { from_raw_parts(&D0, 2) };
} }
error[E0080]: it is undefined behavior to use this value error[E0080]: it is undefined behavior to use this value
--> $DIR/forbidden_slices.rs:28:1 --> $DIR/forbidden_slices.rs:26:1
| |
LL | pub static S4: &[u8] = unsafe { from_raw_parts((&D1) as *const _ as _, 1) }; LL | pub static S4: &[u8] = unsafe { from_raw_parts((&D1) as *const _ as _, 1) };
| ^^^^^^^^^^^^^^^^^^^^ constructing invalid value at .<deref>[0]: encountered uninitialized memory, but expected an integer | ^^^^^^^^^^^^^^^^^^^^ constructing invalid value at .<deref>[0]: encountered uninitialized memory, but expected an integer
@ -43,7 +43,7 @@ LL | pub static S4: &[u8] = unsafe { from_raw_parts((&D1) as *const _ as _, 1) }
} }
error[E0080]: it is undefined behavior to use this value error[E0080]: it is undefined behavior to use this value
--> $DIR/forbidden_slices.rs:30:1 --> $DIR/forbidden_slices.rs:28:1
| |
LL | pub static S5: &[u8] = unsafe { from_raw_parts((&D3) as *const _ as _, size_of::<&u32>()) }; LL | pub static S5: &[u8] = unsafe { from_raw_parts((&D3) as *const _ as _, size_of::<&u32>()) };
| ^^^^^^^^^^^^^^^^^^^^ constructing invalid value at .<deref>[0]: encountered a pointer, but expected an integer | ^^^^^^^^^^^^^^^^^^^^ constructing invalid value at .<deref>[0]: encountered a pointer, but expected an integer
@ -56,7 +56,7 @@ LL | pub static S5: &[u8] = unsafe { from_raw_parts((&D3) as *const _ as _, size
= help: the absolute address of a pointer is not known at compile-time, so such operations are not supported = help: the absolute address of a pointer is not known at compile-time, so such operations are not supported
error[E0080]: it is undefined behavior to use this value error[E0080]: it is undefined behavior to use this value
--> $DIR/forbidden_slices.rs:32:1 --> $DIR/forbidden_slices.rs:30:1
| |
LL | pub static S6: &[bool] = unsafe { from_raw_parts((&D0) as *const _ as _, 4) }; LL | pub static S6: &[bool] = unsafe { from_raw_parts((&D0) as *const _ as _, 4) };
| ^^^^^^^^^^^^^^^^^^^^^^ constructing invalid value at .<deref>[0]: encountered 0x11, but expected a boolean | ^^^^^^^^^^^^^^^^^^^^^^ constructing invalid value at .<deref>[0]: encountered 0x11, but expected a boolean
@ -67,7 +67,7 @@ LL | pub static S6: &[bool] = unsafe { from_raw_parts((&D0) as *const _ as _, 4)
} }
error[E0080]: it is undefined behavior to use this value error[E0080]: it is undefined behavior to use this value
--> $DIR/forbidden_slices.rs:35:1 --> $DIR/forbidden_slices.rs:33:1
| |
LL | pub static S7: &[u16] = unsafe { LL | pub static S7: &[u16] = unsafe {
| ^^^^^^^^^^^^^^^^^^^^^ constructing invalid value at .<deref>[1]: encountered uninitialized memory, but expected an integer | ^^^^^^^^^^^^^^^^^^^^^ constructing invalid value at .<deref>[1]: encountered uninitialized memory, but expected an integer
@ -78,7 +78,7 @@ LL | pub static S7: &[u16] = unsafe {
} }
error[E0080]: it is undefined behavior to use this value error[E0080]: it is undefined behavior to use this value
--> $DIR/forbidden_slices.rs:43:1 --> $DIR/forbidden_slices.rs:41:1
| |
LL | pub static S8: &[u64] = unsafe { LL | pub static S8: &[u64] = unsafe {
| ^^^^^^^^^^^^^^^^^^^^^ constructing invalid value: encountered a dangling reference (going beyond the bounds of its allocation) | ^^^^^^^^^^^^^^^^^^^^^ constructing invalid value: encountered a dangling reference (going beyond the bounds of its allocation)
@ -98,7 +98,7 @@ note: inside `ptr::const_ptr::<impl *const u32>::sub_ptr`
note: inside `from_ptr_range::<'_, u32>` note: inside `from_ptr_range::<'_, u32>`
--> $SRC_DIR/core/src/slice/raw.rs:LL:COL --> $SRC_DIR/core/src/slice/raw.rs:LL:COL
note: inside `R0` note: inside `R0`
--> $DIR/forbidden_slices.rs:50:34 --> $DIR/forbidden_slices.rs:48:34
| |
LL | pub static R0: &[u32] = unsafe { from_ptr_range(ptr::null()..ptr::null()) }; LL | pub static R0: &[u32] = unsafe { from_ptr_range(ptr::null()..ptr::null()) };
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@ -113,7 +113,7 @@ note: inside `ptr::const_ptr::<impl *const ()>::sub_ptr`
note: inside `from_ptr_range::<'_, ()>` note: inside `from_ptr_range::<'_, ()>`
--> $SRC_DIR/core/src/slice/raw.rs:LL:COL --> $SRC_DIR/core/src/slice/raw.rs:LL:COL
note: inside `R1` note: inside `R1`
--> $DIR/forbidden_slices.rs:51:33 --> $DIR/forbidden_slices.rs:49:33
| |
LL | pub static R1: &[()] = unsafe { from_ptr_range(ptr::null()..ptr::null()) }; LL | pub static R1: &[()] = unsafe { from_ptr_range(ptr::null()..ptr::null()) };
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@ -127,13 +127,13 @@ error[E0080]: could not evaluate static initializer
note: inside `ptr::const_ptr::<impl *const u32>::add` note: inside `ptr::const_ptr::<impl *const u32>::add`
--> $SRC_DIR/core/src/ptr/const_ptr.rs:LL:COL --> $SRC_DIR/core/src/ptr/const_ptr.rs:LL:COL
note: inside `R2` note: inside `R2`
--> $DIR/forbidden_slices.rs:54:25 --> $DIR/forbidden_slices.rs:52:25
| |
LL | from_ptr_range(ptr..ptr.add(2)) LL | from_ptr_range(ptr..ptr.add(2))
| ^^^^^^^^^^ | ^^^^^^^^^^
error[E0080]: it is undefined behavior to use this value error[E0080]: it is undefined behavior to use this value
--> $DIR/forbidden_slices.rs:56:1 --> $DIR/forbidden_slices.rs:54:1
| |
LL | pub static R4: &[u8] = unsafe { LL | pub static R4: &[u8] = unsafe {
| ^^^^^^^^^^^^^^^^^^^^ constructing invalid value at .<deref>[0]: encountered uninitialized memory, but expected an integer | ^^^^^^^^^^^^^^^^^^^^ constructing invalid value at .<deref>[0]: encountered uninitialized memory, but expected an integer
@ -144,7 +144,7 @@ LL | pub static R4: &[u8] = unsafe {
} }
error[E0080]: it is undefined behavior to use this value error[E0080]: it is undefined behavior to use this value
--> $DIR/forbidden_slices.rs:61:1 --> $DIR/forbidden_slices.rs:59:1
| |
LL | pub static R5: &[u8] = unsafe { LL | pub static R5: &[u8] = unsafe {
| ^^^^^^^^^^^^^^^^^^^^ constructing invalid value at .<deref>[0]: encountered a pointer, but expected an integer | ^^^^^^^^^^^^^^^^^^^^ constructing invalid value at .<deref>[0]: encountered a pointer, but expected an integer
@ -157,7 +157,7 @@ LL | pub static R5: &[u8] = unsafe {
= help: the absolute address of a pointer is not known at compile-time, so such operations are not supported = help: the absolute address of a pointer is not known at compile-time, so such operations are not supported
error[E0080]: it is undefined behavior to use this value error[E0080]: it is undefined behavior to use this value
--> $DIR/forbidden_slices.rs:66:1 --> $DIR/forbidden_slices.rs:64:1
| |
LL | pub static R6: &[bool] = unsafe { LL | pub static R6: &[bool] = unsafe {
| ^^^^^^^^^^^^^^^^^^^^^^ constructing invalid value at .<deref>[0]: encountered 0x11, but expected a boolean | ^^^^^^^^^^^^^^^^^^^^^^ constructing invalid value at .<deref>[0]: encountered 0x11, but expected a boolean
@ -168,7 +168,7 @@ LL | pub static R6: &[bool] = unsafe {
} }
error[E0080]: it is undefined behavior to use this value error[E0080]: it is undefined behavior to use this value
--> $DIR/forbidden_slices.rs:71:1 --> $DIR/forbidden_slices.rs:69:1
| |
LL | pub static R7: &[u16] = unsafe { LL | pub static R7: &[u16] = unsafe {
| ^^^^^^^^^^^^^^^^^^^^^ constructing invalid value: encountered an unaligned reference (required 2 byte alignment but found 1) | ^^^^^^^^^^^^^^^^^^^^^ constructing invalid value: encountered an unaligned reference (required 2 byte alignment but found 1)
@ -186,7 +186,7 @@ error[E0080]: could not evaluate static initializer
note: inside `ptr::const_ptr::<impl *const u64>::add` note: inside `ptr::const_ptr::<impl *const u64>::add`
--> $SRC_DIR/core/src/ptr/const_ptr.rs:LL:COL --> $SRC_DIR/core/src/ptr/const_ptr.rs:LL:COL
note: inside `R8` note: inside `R8`
--> $DIR/forbidden_slices.rs:78:25 --> $DIR/forbidden_slices.rs:76:25
| |
LL | from_ptr_range(ptr..ptr.add(1)) LL | from_ptr_range(ptr..ptr.add(1))
| ^^^^^^^^^^ | ^^^^^^^^^^
@ -201,7 +201,7 @@ note: inside `ptr::const_ptr::<impl *const u32>::sub_ptr`
note: inside `from_ptr_range::<'_, u32>` note: inside `from_ptr_range::<'_, u32>`
--> $SRC_DIR/core/src/slice/raw.rs:LL:COL --> $SRC_DIR/core/src/slice/raw.rs:LL:COL
note: inside `R9` note: inside `R9`
--> $DIR/forbidden_slices.rs:83:34 --> $DIR/forbidden_slices.rs:81:34
| |
LL | pub static R9: &[u32] = unsafe { from_ptr_range(&D0..(&D0 as *const u32).add(1)) }; LL | pub static R9: &[u32] = unsafe { from_ptr_range(&D0..(&D0 as *const u32).add(1)) };
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@ -216,7 +216,7 @@ note: inside `ptr::const_ptr::<impl *const u32>::sub_ptr`
note: inside `from_ptr_range::<'_, u32>` note: inside `from_ptr_range::<'_, u32>`
--> $SRC_DIR/core/src/slice/raw.rs:LL:COL --> $SRC_DIR/core/src/slice/raw.rs:LL:COL
note: inside `R10` note: inside `R10`
--> $DIR/forbidden_slices.rs:84:35 --> $DIR/forbidden_slices.rs:82:35
| |
LL | pub static R10: &[u32] = unsafe { from_ptr_range(&D0..&D0) }; LL | pub static R10: &[u32] = unsafe { from_ptr_range(&D0..&D0) };
| ^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^

View File

@ -1,5 +1,3 @@
#![feature(const_pointer_byte_offsets)]
#![feature(pointer_byte_offsets)]
#![feature(const_mut_refs)] #![feature(const_mut_refs)]

View File

@ -1,11 +1,11 @@
error[E0080]: evaluation of constant value failed error[E0080]: evaluation of constant value failed
--> $DIR/raw-pointer-ub.rs:9:16 --> $DIR/raw-pointer-ub.rs:7:16
| |
LL | let _val = *ptr; LL | let _val = *ptr;
| ^^^^ accessing memory based on pointer with alignment 1, but alignment 4 is required | ^^^^ accessing memory based on pointer with alignment 1, but alignment 4 is required
error[E0080]: evaluation of constant value failed error[E0080]: evaluation of constant value failed
--> $DIR/raw-pointer-ub.rs:16:5 --> $DIR/raw-pointer-ub.rs:14:5
| |
LL | *ptr = 0; LL | *ptr = 0;
| ^^^^^^^^ accessing memory based on pointer with alignment 1, but alignment 4 is required | ^^^^^^^^ accessing memory based on pointer with alignment 1, but alignment 4 is required
@ -20,19 +20,19 @@ note: inside `copy_nonoverlapping::<u32>`
note: inside `ptr::const_ptr::<impl *const u32>::copy_to_nonoverlapping` note: inside `ptr::const_ptr::<impl *const u32>::copy_to_nonoverlapping`
--> $SRC_DIR/core/src/ptr/const_ptr.rs:LL:COL --> $SRC_DIR/core/src/ptr/const_ptr.rs:LL:COL
note: inside `MISALIGNED_COPY` note: inside `MISALIGNED_COPY`
--> $DIR/raw-pointer-ub.rs:24:5 --> $DIR/raw-pointer-ub.rs:22:5
| |
LL | y.copy_to_nonoverlapping(&mut z, 1); LL | y.copy_to_nonoverlapping(&mut z, 1);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error[E0080]: evaluation of constant value failed error[E0080]: evaluation of constant value failed
--> $DIR/raw-pointer-ub.rs:36:16 --> $DIR/raw-pointer-ub.rs:34:16
| |
LL | let _val = (*ptr).0; LL | let _val = (*ptr).0;
| ^^^^^^^^ accessing memory based on pointer with alignment 4, but alignment 16 is required | ^^^^^^^^ accessing memory based on pointer with alignment 4, but alignment 16 is required
error[E0080]: evaluation of constant value failed error[E0080]: evaluation of constant value failed
--> $DIR/raw-pointer-ub.rs:43:16 --> $DIR/raw-pointer-ub.rs:41:16
| |
LL | let _val = *ptr; LL | let _val = *ptr;
| ^^^^ memory access failed: ALLOC0 has size 4, so pointer to 8 bytes starting at offset 0 is out-of-bounds | ^^^^ memory access failed: ALLOC0 has size 4, so pointer to 8 bytes starting at offset 0 is out-of-bounds

View File

@ -1,7 +1,7 @@
// revisions: no_flag with_flag // revisions: no_flag with_flag
// [no_flag] check-pass // [no_flag] check-pass
// [with_flag] compile-flags: -Zextra-const-ub-checks // [with_flag] compile-flags: -Zextra-const-ub-checks
#![feature(never_type, pointer_byte_offsets)] #![feature(never_type)]
use std::mem::transmute; use std::mem::transmute;
use std::ptr::addr_of; use std::ptr::addr_of;

View File

@ -1,5 +1,5 @@
// compile-flags: -Zunleash-the-miri-inside-of-you // compile-flags: -Zunleash-the-miri-inside-of-you
#![feature(core_intrinsics, pointer_byte_offsets)] #![feature(core_intrinsics)]
// During CTFE, we prevent pointer-to-int casts. // During CTFE, we prevent pointer-to-int casts.
// Pointer comparisons are prevented in the trait system. // Pointer comparisons are prevented in the trait system.