mirror of
https://github.com/rust-lang/rust.git
synced 2026-05-15 20:45:45 +03:00
Rollup merge of #134325 - theemathas:is_null-docs, r=RalfJung
Correctly document CTFE behavior of is_null and methods that call is_null. The "panic in const if CTFE doesn't know the answer" behavior was discussed to be the desired behavior in #74939, and is currently how the function actually behaves. I intentionally wrote this documentation to allow for the possibility that a panic might not occur even if the pointer is out of bounds, because of #133700 and other potential changes in the future. This is beta-nominated since `const fn is_null` stabilization is in beta already but the docs there are wrong, and it seems better to have the docs be correct at the time of stabilization.
This commit is contained in:
@@ -12,14 +12,17 @@ impl<T: ?Sized> *const T {
|
||||
/// Therefore, two pointers that are null may still not compare equal to
|
||||
/// each other.
|
||||
///
|
||||
/// ## Behavior during const evaluation
|
||||
/// # Panics during const evaluation
|
||||
///
|
||||
/// When this function is used during const evaluation, it may return `false` for pointers
|
||||
/// that turn out to be null at runtime. Specifically, when a pointer to some memory
|
||||
/// is offset beyond its bounds in such a way that the resulting pointer is null,
|
||||
/// the function will still return `false`. There is no way for CTFE to know
|
||||
/// the absolute position of that memory, so we cannot tell if the pointer is
|
||||
/// null or not.
|
||||
/// If this method is used during const evaluation, and `self` is a pointer
|
||||
/// that is offset beyond the bounds of the memory it initially pointed to,
|
||||
/// then there might not be enough information to determine whether the
|
||||
/// pointer is null. This is because the absolute address in memory is not
|
||||
/// known at compile time. If the nullness of the pointer cannot be
|
||||
/// determined, this method will panic.
|
||||
///
|
||||
/// In-bounds pointers are never null, so the method will never panic for
|
||||
/// such pointers.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
@@ -254,6 +257,13 @@ pub const fn to_raw_parts(self) -> (*const (), <T as super::Pointee>::Metadata)
|
||||
/// When calling this method, you have to ensure that *either* the pointer is null *or*
|
||||
/// the pointer is [convertible to a reference](crate::ptr#pointer-to-reference-conversion).
|
||||
///
|
||||
/// # Panics during const evaluation
|
||||
///
|
||||
/// This method will panic during const evaluation if the pointer cannot be
|
||||
/// determined to be null or not. See [`is_null`] for more information.
|
||||
///
|
||||
/// [`is_null`]: #method.is_null
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
@@ -331,6 +341,13 @@ pub const fn to_raw_parts(self) -> (*const (), <T as super::Pointee>::Metadata)
|
||||
/// When calling this method, you have to ensure that *either* the pointer is null *or*
|
||||
/// the pointer is [convertible to a reference](crate::ptr#pointer-to-reference-conversion).
|
||||
///
|
||||
/// # Panics during const evaluation
|
||||
///
|
||||
/// This method will panic during const evaluation if the pointer cannot be
|
||||
/// determined to be null or not. See [`is_null`] for more information.
|
||||
///
|
||||
/// [`is_null`]: #method.is_null
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
@@ -1607,6 +1624,13 @@ pub unsafe fn get_unchecked<I>(self, index: I) -> *const I::Output
|
||||
///
|
||||
/// [valid]: crate::ptr#safety
|
||||
/// [allocated object]: crate::ptr#allocated-object
|
||||
///
|
||||
/// # Panics during const evaluation
|
||||
///
|
||||
/// This method will panic during const evaluation if the pointer cannot be
|
||||
/// determined to be null or not. See [`is_null`] for more information.
|
||||
///
|
||||
/// [`is_null`]: #method.is_null
|
||||
#[inline]
|
||||
#[unstable(feature = "ptr_as_uninit", issue = "75402")]
|
||||
pub const unsafe fn as_uninit_slice<'a>(self) -> Option<&'a [MaybeUninit<T>]> {
|
||||
|
||||
@@ -12,14 +12,17 @@ impl<T: ?Sized> *mut T {
|
||||
/// Therefore, two pointers that are null may still not compare equal to
|
||||
/// each other.
|
||||
///
|
||||
/// ## Behavior during const evaluation
|
||||
/// # Panics during const evaluation
|
||||
///
|
||||
/// When this function is used during const evaluation, it may return `false` for pointers
|
||||
/// that turn out to be null at runtime. Specifically, when a pointer to some memory
|
||||
/// is offset beyond its bounds in such a way that the resulting pointer is null,
|
||||
/// the function will still return `false`. There is no way for CTFE to know
|
||||
/// the absolute position of that memory, so we cannot tell if the pointer is
|
||||
/// null or not.
|
||||
/// If this method is used during const evaluation, and `self` is a pointer
|
||||
/// that is offset beyond the bounds of the memory it initially pointed to,
|
||||
/// then there might not be enough information to determine whether the
|
||||
/// pointer is null. This is because the absolute address in memory is not
|
||||
/// known at compile time. If the nullness of the pointer cannot be
|
||||
/// determined, this method will panic.
|
||||
///
|
||||
/// In-bounds pointers are never null, so the method will never panic for
|
||||
/// such pointers.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
@@ -243,6 +246,13 @@ pub const fn to_raw_parts(self) -> (*mut (), <T as super::Pointee>::Metadata) {
|
||||
/// When calling this method, you have to ensure that *either* the pointer is null *or*
|
||||
/// the pointer is [convertible to a reference](crate::ptr#pointer-to-reference-conversion).
|
||||
///
|
||||
/// # Panics during const evaluation
|
||||
///
|
||||
/// This method will panic during const evaluation if the pointer cannot be
|
||||
/// determined to be null or not. See [`is_null`] for more information.
|
||||
///
|
||||
/// [`is_null`]: #method.is_null-1
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
@@ -327,6 +337,13 @@ pub const fn to_raw_parts(self) -> (*mut (), <T as super::Pointee>::Metadata) {
|
||||
/// Note that because the created reference is to `MaybeUninit<T>`, the
|
||||
/// source pointer can point to uninitialized memory.
|
||||
///
|
||||
/// # Panics during const evaluation
|
||||
///
|
||||
/// This method will panic during const evaluation if the pointer cannot be
|
||||
/// determined to be null or not. See [`is_null`] for more information.
|
||||
///
|
||||
/// [`is_null`]: #method.is_null-1
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
@@ -590,6 +607,12 @@ pub fn mask(self, mask: usize) -> *mut T {
|
||||
/// the pointer is null *or*
|
||||
/// the pointer is [convertible to a reference](crate::ptr#pointer-to-reference-conversion).
|
||||
///
|
||||
/// # Panics during const evaluation
|
||||
///
|
||||
/// This method will panic during const evaluation if the pointer cannot be
|
||||
/// determined to be null or not. See [`is_null`] for more information.
|
||||
///
|
||||
/// [`is_null`]: #method.is_null-1
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
@@ -673,6 +696,13 @@ pub fn mask(self, mask: usize) -> *mut T {
|
||||
///
|
||||
/// When calling this method, you have to ensure that *either* the pointer is null *or*
|
||||
/// the pointer is [convertible to a reference](crate::ptr#pointer-to-reference-conversion).
|
||||
///
|
||||
/// # Panics during const evaluation
|
||||
///
|
||||
/// This method will panic during const evaluation if the pointer cannot be
|
||||
/// determined to be null or not. See [`is_null`] for more information.
|
||||
///
|
||||
/// [`is_null`]: #method.is_null-1
|
||||
#[inline]
|
||||
#[unstable(feature = "ptr_as_uninit", issue = "75402")]
|
||||
pub const unsafe fn as_uninit_mut<'a>(self) -> Option<&'a mut MaybeUninit<T>>
|
||||
@@ -1949,6 +1979,13 @@ pub unsafe fn get_unchecked_mut<I>(self, index: I) -> *mut I::Output
|
||||
///
|
||||
/// [valid]: crate::ptr#safety
|
||||
/// [allocated object]: crate::ptr#allocated-object
|
||||
///
|
||||
/// # Panics during const evaluation
|
||||
///
|
||||
/// This method will panic during const evaluation if the pointer cannot be
|
||||
/// determined to be null or not. See [`is_null`] for more information.
|
||||
///
|
||||
/// [`is_null`]: #method.is_null-1
|
||||
#[inline]
|
||||
#[unstable(feature = "ptr_as_uninit", issue = "75402")]
|
||||
pub const unsafe fn as_uninit_slice<'a>(self) -> Option<&'a [MaybeUninit<T>]> {
|
||||
@@ -2000,6 +2037,13 @@ pub unsafe fn get_unchecked_mut<I>(self, index: I) -> *mut I::Output
|
||||
///
|
||||
/// [valid]: crate::ptr#safety
|
||||
/// [allocated object]: crate::ptr#allocated-object
|
||||
///
|
||||
/// # Panics during const evaluation
|
||||
///
|
||||
/// This method will panic during const evaluation if the pointer cannot be
|
||||
/// determined to be null or not. See [`is_null`] for more information.
|
||||
///
|
||||
/// [`is_null`]: #method.is_null-1
|
||||
#[inline]
|
||||
#[unstable(feature = "ptr_as_uninit", issue = "75402")]
|
||||
pub const unsafe fn as_uninit_slice_mut<'a>(self) -> Option<&'a mut [MaybeUninit<T>]> {
|
||||
|
||||
@@ -204,6 +204,13 @@ impl<T: ?Sized> NonNull<T> {
|
||||
|
||||
/// Creates a new `NonNull` if `ptr` is non-null.
|
||||
///
|
||||
/// # Panics during const evaluation
|
||||
///
|
||||
/// This method will panic during const evaluation if the pointer cannot be
|
||||
/// determined to be null or not. See [`is_null`] for more information.
|
||||
///
|
||||
/// [`is_null`]: ../primitive.pointer.html#method.is_null-1
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
|
||||
Reference in New Issue
Block a user