Rollup merge of #103702 - WaffleLapkin:lift-sized-bounds-from-pointer-methods-where-applicable, r=m-ou-se

Lift `T: Sized` bounds from some `strict_provenance` pointer methods

This PR removes requirement for `T` (pointee type) to be `Sized` to call `pointer::{addr, expose_addr, with_addr, map_addr}`. These functions don't use `T`'s size, so there is no reason for them to require this. Updated public API:

cc ``@Gankra,`` #95228
r? libs-api
This commit is contained in:
Dylan DPC 2023-01-18 15:55:36 +05:30 committed by GitHub
commit d6ea99d2ed
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 15 additions and 48 deletions

View File

@ -202,14 +202,11 @@ impl<T: ?Sized> *const T {
#[must_use] #[must_use]
#[inline(always)] #[inline(always)]
#[unstable(feature = "strict_provenance", issue = "95228")] #[unstable(feature = "strict_provenance", issue = "95228")]
pub fn addr(self) -> usize pub fn addr(self) -> usize {
where
T: Sized,
{
// FIXME(strict_provenance_magic): I am magic and should be a compiler intrinsic. // FIXME(strict_provenance_magic): I am magic and should be a compiler intrinsic.
// SAFETY: Pointer-to-integer transmutes are valid (if you are okay with losing the // SAFETY: Pointer-to-integer transmutes are valid (if you are okay with losing the
// provenance). // provenance).
unsafe { mem::transmute(self) } unsafe { mem::transmute(self.cast::<()>()) }
} }
/// Gets the "address" portion of the pointer, and 'exposes' the "provenance" part for future /// Gets the "address" portion of the pointer, and 'exposes' the "provenance" part for future
@ -239,12 +236,9 @@ impl<T: ?Sized> *const T {
#[must_use] #[must_use]
#[inline(always)] #[inline(always)]
#[unstable(feature = "strict_provenance", issue = "95228")] #[unstable(feature = "strict_provenance", issue = "95228")]
pub fn expose_addr(self) -> usize pub fn expose_addr(self) -> usize {
where
T: Sized,
{
// FIXME(strict_provenance_magic): I am magic and should be a compiler intrinsic. // FIXME(strict_provenance_magic): I am magic and should be a compiler intrinsic.
self as usize self.cast::<()>() as usize
} }
/// Creates a new pointer with the given address. /// Creates a new pointer with the given address.
@ -262,10 +256,7 @@ impl<T: ?Sized> *const T {
#[must_use] #[must_use]
#[inline] #[inline]
#[unstable(feature = "strict_provenance", issue = "95228")] #[unstable(feature = "strict_provenance", issue = "95228")]
pub fn with_addr(self, addr: usize) -> Self pub fn with_addr(self, addr: usize) -> Self {
where
T: Sized,
{
// FIXME(strict_provenance_magic): I am magic and should be a compiler intrinsic. // FIXME(strict_provenance_magic): I am magic and should be a compiler intrinsic.
// //
// In the mean-time, this operation is defined to be "as if" it was // In the mean-time, this operation is defined to be "as if" it was
@ -288,10 +279,7 @@ impl<T: ?Sized> *const T {
#[must_use] #[must_use]
#[inline] #[inline]
#[unstable(feature = "strict_provenance", issue = "95228")] #[unstable(feature = "strict_provenance", issue = "95228")]
pub fn map_addr(self, f: impl FnOnce(usize) -> usize) -> Self pub fn map_addr(self, f: impl FnOnce(usize) -> usize) -> Self {
where
T: Sized,
{
self.with_addr(f(self.addr())) self.with_addr(f(self.addr()))
} }

View File

@ -208,14 +208,11 @@ impl<T: ?Sized> *mut T {
#[must_use] #[must_use]
#[inline(always)] #[inline(always)]
#[unstable(feature = "strict_provenance", issue = "95228")] #[unstable(feature = "strict_provenance", issue = "95228")]
pub fn addr(self) -> usize pub fn addr(self) -> usize {
where
T: Sized,
{
// FIXME(strict_provenance_magic): I am magic and should be a compiler intrinsic. // FIXME(strict_provenance_magic): I am magic and should be a compiler intrinsic.
// SAFETY: Pointer-to-integer transmutes are valid (if you are okay with losing the // SAFETY: Pointer-to-integer transmutes are valid (if you are okay with losing the
// provenance). // provenance).
unsafe { mem::transmute(self) } unsafe { mem::transmute(self.cast::<()>()) }
} }
/// Gets the "address" portion of the pointer, and 'exposes' the "provenance" part for future /// Gets the "address" portion of the pointer, and 'exposes' the "provenance" part for future
@ -245,12 +242,9 @@ impl<T: ?Sized> *mut T {
#[must_use] #[must_use]
#[inline(always)] #[inline(always)]
#[unstable(feature = "strict_provenance", issue = "95228")] #[unstable(feature = "strict_provenance", issue = "95228")]
pub fn expose_addr(self) -> usize pub fn expose_addr(self) -> usize {
where
T: Sized,
{
// FIXME(strict_provenance_magic): I am magic and should be a compiler intrinsic. // FIXME(strict_provenance_magic): I am magic and should be a compiler intrinsic.
self as usize self.cast::<()>() as usize
} }
/// Creates a new pointer with the given address. /// Creates a new pointer with the given address.
@ -268,10 +262,7 @@ impl<T: ?Sized> *mut T {
#[must_use] #[must_use]
#[inline] #[inline]
#[unstable(feature = "strict_provenance", issue = "95228")] #[unstable(feature = "strict_provenance", issue = "95228")]
pub fn with_addr(self, addr: usize) -> Self pub fn with_addr(self, addr: usize) -> Self {
where
T: Sized,
{
// FIXME(strict_provenance_magic): I am magic and should be a compiler intrinsic. // FIXME(strict_provenance_magic): I am magic and should be a compiler intrinsic.
// //
// In the mean-time, this operation is defined to be "as if" it was // In the mean-time, this operation is defined to be "as if" it was
@ -294,10 +285,7 @@ impl<T: ?Sized> *mut T {
#[must_use] #[must_use]
#[inline] #[inline]
#[unstable(feature = "strict_provenance", issue = "95228")] #[unstable(feature = "strict_provenance", issue = "95228")]
pub fn map_addr(self, f: impl FnOnce(usize) -> usize) -> Self pub fn map_addr(self, f: impl FnOnce(usize) -> usize) -> Self {
where
T: Sized,
{
self.with_addr(f(self.addr())) self.with_addr(f(self.addr()))
} }

View File

@ -268,10 +268,7 @@ impl<T: ?Sized> NonNull<T> {
#[must_use] #[must_use]
#[inline] #[inline]
#[unstable(feature = "strict_provenance", issue = "95228")] #[unstable(feature = "strict_provenance", issue = "95228")]
pub fn addr(self) -> NonZeroUsize pub fn addr(self) -> NonZeroUsize {
where
T: Sized,
{
// SAFETY: The pointer is guaranteed by the type to be non-null, // SAFETY: The pointer is guaranteed by the type to be non-null,
// meaning that the address will be non-zero. // meaning that the address will be non-zero.
unsafe { NonZeroUsize::new_unchecked(self.pointer.addr()) } unsafe { NonZeroUsize::new_unchecked(self.pointer.addr()) }
@ -286,10 +283,7 @@ impl<T: ?Sized> NonNull<T> {
#[must_use] #[must_use]
#[inline] #[inline]
#[unstable(feature = "strict_provenance", issue = "95228")] #[unstable(feature = "strict_provenance", issue = "95228")]
pub fn with_addr(self, addr: NonZeroUsize) -> Self pub fn with_addr(self, addr: NonZeroUsize) -> Self {
where
T: Sized,
{
// SAFETY: The result of `ptr::from::with_addr` is non-null because `addr` is guaranteed to be non-zero. // SAFETY: The result of `ptr::from::with_addr` is non-null because `addr` is guaranteed to be non-zero.
unsafe { NonNull::new_unchecked(self.pointer.with_addr(addr.get()) as *mut _) } unsafe { NonNull::new_unchecked(self.pointer.with_addr(addr.get()) as *mut _) }
} }
@ -303,10 +297,7 @@ impl<T: ?Sized> NonNull<T> {
#[must_use] #[must_use]
#[inline] #[inline]
#[unstable(feature = "strict_provenance", issue = "95228")] #[unstable(feature = "strict_provenance", issue = "95228")]
pub fn map_addr(self, f: impl FnOnce(NonZeroUsize) -> NonZeroUsize) -> Self pub fn map_addr(self, f: impl FnOnce(NonZeroUsize) -> NonZeroUsize) -> Self {
where
T: Sized,
{
self.with_addr(f(self.addr())) self.with_addr(f(self.addr()))
} }