Also use mir::Offset
for pointer add
This commit is contained in:
parent
8bcfc0e597
commit
e1da77c76d
11 changed files with 117 additions and 77 deletions
|
@ -1413,6 +1413,10 @@ extern "rust-intrinsic" {
|
|||
/// This is implemented as an intrinsic to avoid converting to and from an
|
||||
/// integer, since the conversion would throw away aliasing information.
|
||||
///
|
||||
/// This can only be used with `Ptr` as a raw pointer type (`*mut` or `*const`)
|
||||
/// to a `Sized` pointee and with `Delta` as `usize` or `isize`. Any other
|
||||
/// instantiations may arbitrarily misbehave, and that's *not* a compiler bug.
|
||||
///
|
||||
/// # Safety
|
||||
///
|
||||
/// Both the starting and resulting pointer must be either in bounds or one
|
||||
|
@ -1421,6 +1425,14 @@ extern "rust-intrinsic" {
|
|||
/// returned value will result in undefined behavior.
|
||||
///
|
||||
/// The stabilized version of this intrinsic is [`pointer::offset`].
|
||||
#[cfg(not(bootstrap))]
|
||||
#[must_use = "returns a new pointer rather than modifying its argument"]
|
||||
#[rustc_const_stable(feature = "const_ptr_offset", since = "1.61.0")]
|
||||
#[rustc_nounwind]
|
||||
pub fn offset<Ptr, Delta>(dst: Ptr, offset: Delta) -> Ptr;
|
||||
|
||||
/// The bootstrap version of this is more restricted.
|
||||
#[cfg(bootstrap)]
|
||||
#[must_use = "returns a new pointer rather than modifying its argument"]
|
||||
#[rustc_const_stable(feature = "const_ptr_offset", since = "1.61.0")]
|
||||
#[rustc_nounwind]
|
||||
|
|
|
@ -916,8 +916,16 @@ impl<T: ?Sized> *const T {
|
|||
where
|
||||
T: Sized,
|
||||
{
|
||||
#[cfg(bootstrap)]
|
||||
// SAFETY: the caller must uphold the safety contract for `offset`.
|
||||
unsafe { self.offset(count as isize) }
|
||||
unsafe {
|
||||
self.offset(count as isize)
|
||||
}
|
||||
#[cfg(not(bootstrap))]
|
||||
// SAFETY: the caller must uphold the safety contract for `offset`.
|
||||
unsafe {
|
||||
intrinsics::offset(self, count)
|
||||
}
|
||||
}
|
||||
|
||||
/// Calculates the offset from a pointer in bytes (convenience for `.byte_offset(count as isize)`).
|
||||
|
|
|
@ -473,10 +473,20 @@ impl<T: ?Sized> *mut T {
|
|||
where
|
||||
T: Sized,
|
||||
{
|
||||
#[cfg(bootstrap)]
|
||||
// SAFETY: the caller must uphold the safety contract for `offset`.
|
||||
// The obtained pointer is valid for writes since the caller must
|
||||
// guarantee that it points to the same allocated object as `self`.
|
||||
unsafe { intrinsics::offset(self, count) as *mut T }
|
||||
unsafe {
|
||||
intrinsics::offset(self, count) as *mut T
|
||||
}
|
||||
#[cfg(not(bootstrap))]
|
||||
// SAFETY: the caller must uphold the safety contract for `offset`.
|
||||
// The obtained pointer is valid for writes since the caller must
|
||||
// guarantee that it points to the same allocated object as `self`.
|
||||
unsafe {
|
||||
intrinsics::offset(self, count)
|
||||
}
|
||||
}
|
||||
|
||||
/// Calculates the offset from a pointer in bytes.
|
||||
|
@ -1016,8 +1026,16 @@ impl<T: ?Sized> *mut T {
|
|||
where
|
||||
T: Sized,
|
||||
{
|
||||
#[cfg(bootstrap)]
|
||||
// SAFETY: the caller must uphold the safety contract for `offset`.
|
||||
unsafe { self.offset(count as isize) }
|
||||
unsafe {
|
||||
self.offset(count as isize)
|
||||
}
|
||||
#[cfg(not(bootstrap))]
|
||||
// SAFETY: the caller must uphold the safety contract for `offset`.
|
||||
unsafe {
|
||||
intrinsics::offset(self, count)
|
||||
}
|
||||
}
|
||||
|
||||
/// Calculates the offset from a pointer in bytes (convenience for `.byte_offset(count as isize)`).
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue