Skip to main content

core/ptr/
mut_ptr.rs

1use super::*;
2use crate::cmp::Ordering::{Equal, Greater, Less};
3use crate::intrinsics::const_eval_select;
4use crate::marker::{Destruct, PointeeSized};
5use crate::mem::{self, SizedTypeProperties};
6use crate::slice::{self, SliceIndex};
7
8impl<T: PointeeSized> *mut T {
9    #[doc = "Returns `true` if the pointer is null.\n\nNote that unsized types have many possible null pointers, as only the\nraw data pointer is considered, not their length, vtable, etc.\nTherefore, two pointers that are null may still not compare equal to\neach other.\n\n# Panics during const evaluation\n\nIf this method is used during const evaluation, and `self` is a pointer\nthat is offset beyond the bounds of the memory it initially pointed to,\nthen there might not be enough information to determine whether the\npointer is null. This is because the absolute address in memory is not\nknown at compile time. If the nullness of the pointer cannot be\ndetermined, this method will panic.\n\nIn-bounds pointers are never null, so the method will never panic for\nsuch pointers.\n"include_str!("docs/is_null.md")]
10    ///
11    /// # Examples
12    ///
13    /// ```
14    /// let mut s = [1, 2, 3];
15    /// let ptr: *mut u32 = s.as_mut_ptr();
16    /// assert!(!ptr.is_null());
17    /// ```
18    #[stable(feature = "rust1", since = "1.0.0")]
19    #[rustc_const_stable(feature = "const_ptr_is_null", since = "1.84.0")]
20    #[rustc_diagnostic_item = "ptr_is_null"]
21    #[inline]
22    pub const fn is_null(self) -> bool {
23        self.cast_const().is_null()
24    }
25
26    /// Casts to a pointer of another type.
27    #[stable(feature = "ptr_cast", since = "1.38.0")]
28    #[rustc_const_stable(feature = "const_ptr_cast", since = "1.38.0")]
29    #[rustc_diagnostic_item = "ptr_cast"]
30    #[inline(always)]
31    pub const fn cast<U>(self) -> *mut U {
32        self as _
33    }
34
35    /// Try to cast to a pointer of another type by checking alignment.
36    ///
37    /// If the pointer is properly aligned to the target type, it will be
38    /// cast to the target type. Otherwise, `None` is returned.
39    ///
40    /// # Examples
41    ///
42    /// ```rust
43    /// #![feature(pointer_try_cast_aligned)]
44    ///
45    /// let mut x = 0u64;
46    ///
47    /// let aligned: *mut u64 = &mut x;
48    /// let unaligned = unsafe { aligned.byte_add(1) };
49    ///
50    /// assert!(aligned.try_cast_aligned::<u32>().is_some());
51    /// assert!(unaligned.try_cast_aligned::<u32>().is_none());
52    /// ```
53    #[unstable(feature = "pointer_try_cast_aligned", issue = "141221")]
54    #[must_use = "this returns the result of the operation, \
55                  without modifying the original"]
56    #[inline]
57    pub fn try_cast_aligned<U>(self) -> Option<*mut U> {
58        if self.is_aligned_to(align_of::<U>()) { Some(self.cast()) } else { None }
59    }
60
61    /// Uses the address value in a new pointer of another type.
62    ///
63    /// This operation will ignore the address part of its `meta` operand and discard existing
64    /// metadata of `self`. For pointers to a sized types (thin pointers), this has the same effect
65    /// as a simple cast. For pointers to an unsized type (fat pointers) this recombines the address
66    /// with new metadata such as slice lengths or `dyn`-vtable.
67    ///
68    /// The resulting pointer will have provenance of `self`. This operation is semantically the
69    /// same as creating a new pointer with the data pointer value of `self` but the metadata of
70    /// `meta`, being fat or thin depending on the `meta` operand.
71    ///
72    /// # Examples
73    ///
74    /// This function is primarily useful for enabling pointer arithmetic on potentially fat
75    /// pointers. The pointer is cast to a sized pointee to utilize offset operations and then
76    /// recombined with its own original metadata.
77    ///
78    /// ```
79    /// #![feature(set_ptr_value)]
80    /// # use core::fmt::Debug;
81    /// let mut arr: [i32; 3] = [1, 2, 3];
82    /// let mut ptr = arr.as_mut_ptr() as *mut dyn Debug;
83    /// let thin = ptr as *mut u8;
84    /// unsafe {
85    ///     ptr = thin.add(8).with_metadata_of(ptr);
86    ///     # assert_eq!(*(ptr as *mut i32), 3);
87    ///     println!("{:?}", &*ptr); // will print "3"
88    /// }
89    /// ```
90    ///
91    /// # *Incorrect* usage
92    ///
93    /// The provenance from pointers is *not* combined. The result must only be used to refer to the
94    /// address allowed by `self`.
95    ///
96    /// ```rust,no_run
97    /// #![feature(set_ptr_value)]
98    /// let mut x = 0u32;
99    /// let mut y = 1u32;
100    ///
101    /// let x = (&mut x) as *mut u32;
102    /// let y = (&mut y) as *mut u32;
103    ///
104    /// let offset = (x as usize - y as usize) / 4;
105    /// let bad = x.wrapping_add(offset).with_metadata_of(y);
106    ///
107    /// // This dereference is UB. The pointer only has provenance for `x` but points to `y`.
108    /// println!("{:?}", unsafe { &*bad });
109    /// ```
110    #[unstable(feature = "set_ptr_value", issue = "75091")]
111    #[must_use = "returns a new pointer rather than modifying its argument"]
112    #[inline]
113    pub const fn with_metadata_of<U>(self, meta: *const U) -> *mut U
114    where
115        U: PointeeSized,
116    {
117        from_raw_parts_mut::<U>(self as *mut (), metadata(meta))
118    }
119
120    /// Changes constness without changing the type.
121    ///
122    /// This is a bit safer than `as` because it wouldn't silently change the type if the code is
123    /// refactored.
124    ///
125    /// While not strictly required (`*mut T` coerces to `*const T`), this is provided for symmetry
126    /// with [`cast_mut`] on `*const T` and may have documentation value if used instead of implicit
127    /// coercion.
128    ///
129    /// [`cast_mut`]: pointer::cast_mut
130    #[stable(feature = "ptr_const_cast", since = "1.65.0")]
131    #[rustc_const_stable(feature = "ptr_const_cast", since = "1.65.0")]
132    #[rustc_diagnostic_item = "ptr_cast_const"]
133    #[inline(always)]
134    pub const fn cast_const(self) -> *const T {
135        self as _
136    }
137
138    #[doc = "Gets the \"address\" portion of the pointer.\n\nThis is similar to `self as usize`, except that the [provenance][crate::ptr#provenance] of\nthe pointer is discarded and not [exposed][crate::ptr#exposed-provenance]. This means that\ncasting the returned address back to a pointer yields a [pointer without\nprovenance][without_provenance], which is undefined behavior to dereference. To properly\nrestore the lost information and obtain a dereferenceable pointer, use\n[`with_addr`][pointer::with_addr] or [`map_addr`][pointer::map_addr].\n\nIf using those APIs is not possible because there is no way to preserve a pointer with the\nrequired provenance, then Strict Provenance might not be for you. Use pointer-integer casts\nor [`expose_provenance`][pointer::expose_provenance] and [`with_exposed_provenance`][with_exposed_provenance]\ninstead. However, note that this makes your code less portable and less amenable to tools\nthat check for compliance with the Rust memory model.\n\nOn most platforms this will produce a value with the same bytes as the original\npointer, because all the bytes are dedicated to describing the address.\nPlatforms which need to store additional information in the pointer may\nperform a change of representation to produce a value containing only the address\nportion of the pointer. What that means is up to the platform to define.\n\nThis is a [Strict Provenance][crate::ptr#strict-provenance] API.\n"include_str!("./docs/addr.md")]
139    ///
140    /// [without_provenance]: without_provenance_mut
141    #[must_use]
142    #[inline(always)]
143    #[stable(feature = "strict_provenance", since = "1.84.0")]
144    pub fn addr(self) -> usize {
145        // A pointer-to-integer transmute currently has exactly the right semantics: it returns the
146        // address without exposing the provenance. Note that this is *not* a stable guarantee about
147        // transmute semantics, it relies on sysroot crates having special status.
148        // SAFETY: Pointer-to-integer transmutes are valid (if you are okay with losing the
149        // provenance).
150        unsafe { mem::transmute(self.cast::<()>()) }
151    }
152
153    /// Exposes the ["provenance"][crate::ptr#provenance] part of the pointer for future use in
154    /// [`with_exposed_provenance_mut`] and returns the "address" portion.
155    ///
156    /// This is equivalent to `self as usize`, which semantically discards provenance information.
157    /// Furthermore, this (like the `as` cast) has the implicit side-effect of marking the
158    /// provenance as 'exposed', so on platforms that support it you can later call
159    /// [`with_exposed_provenance_mut`] to reconstitute the original pointer including its provenance.
160    ///
161    /// Due to its inherent ambiguity, [`with_exposed_provenance_mut`] may not be supported by tools
162    /// that help you to stay conformant with the Rust memory model. It is recommended to use
163    /// [Strict Provenance][crate::ptr#strict-provenance] APIs such as [`with_addr`][pointer::with_addr]
164    /// wherever possible, in which case [`addr`][pointer::addr] should be used instead of `expose_provenance`.
165    ///
166    /// On most platforms this will produce a value with the same bytes as the original pointer,
167    /// because all the bytes are dedicated to describing the address. Platforms which need to store
168    /// additional information in the pointer may not support this operation, since the 'expose'
169    /// side-effect which is required for [`with_exposed_provenance_mut`] to work is typically not
170    /// available.
171    ///
172    /// This is an [Exposed Provenance][crate::ptr#exposed-provenance] API.
173    ///
174    /// [`with_exposed_provenance_mut`]: with_exposed_provenance_mut
175    #[inline(always)]
176    #[stable(feature = "exposed_provenance", since = "1.84.0")]
177    #[expect(implicit_provenance_casts, reason = "this *is* the replacement")]
178    pub fn expose_provenance(self) -> usize {
179        self.cast::<()>() as usize
180    }
181
182    /// Creates a new pointer with the given address and the [provenance][crate::ptr#provenance] of
183    /// `self`.
184    ///
185    /// This is similar to a `addr as *mut T` cast, but copies
186    /// the *provenance* of `self` to the new pointer.
187    /// This avoids the inherent ambiguity of the unary cast.
188    ///
189    /// This is equivalent to using [`wrapping_offset`][pointer::wrapping_offset] to offset
190    /// `self` to the given address, and therefore has all the same capabilities and restrictions.
191    ///
192    /// This is a [Strict Provenance][crate::ptr#strict-provenance] API.
193    #[must_use]
194    #[inline]
195    #[stable(feature = "strict_provenance", since = "1.84.0")]
196    pub fn with_addr(self, addr: usize) -> Self {
197        // This should probably be an intrinsic to avoid doing any sort of arithmetic, but
198        // meanwhile, we can implement it with `wrapping_offset`, which preserves the pointer's
199        // provenance.
200        let self_addr = self.addr() as isize;
201        let dest_addr = addr as isize;
202        let offset = dest_addr.wrapping_sub(self_addr);
203        self.wrapping_byte_offset(offset)
204    }
205
206    /// Creates a new pointer by mapping `self`'s address to a new one, preserving the original
207    /// pointer's [provenance][crate::ptr#provenance].
208    ///
209    /// This is a convenience for [`with_addr`][pointer::with_addr], see that method for details.
210    ///
211    /// This is a [Strict Provenance][crate::ptr#strict-provenance] API.
212    #[must_use]
213    #[inline]
214    #[stable(feature = "strict_provenance", since = "1.84.0")]
215    pub fn map_addr(self, f: impl FnOnce(usize) -> usize) -> Self {
216        self.with_addr(f(self.addr()))
217    }
218
219    /// Decompose a (possibly wide) pointer into its data pointer and metadata components.
220    ///
221    /// The pointer can be later reconstructed with [`from_raw_parts_mut`].
222    #[unstable(feature = "ptr_metadata", issue = "81513")]
223    #[inline]
224    pub const fn to_raw_parts(self) -> (*mut (), <T as super::Pointee>::Metadata) {
225        (self.cast(), super::metadata(self))
226    }
227
228    #[doc = "Returns `None` if the pointer is null, or else returns a shared reference to\nthe value wrapped in `Some`. If the value may be uninitialized, [`as_uninit_ref`]\nmust be used instead. If the value is known to be non-null, [`as_ref_unchecked`]\ncan be used instead.\n\n# Safety\n\nWhen calling this method, you have to ensure that *either* the pointer is null *or*\nthe pointer is [convertible to a reference](crate::ptr#pointer-to-reference-conversion).\n\n# Panics during const evaluation\n\nThis method will panic during const evaluation if the pointer cannot be\ndetermined to be null or not. See [`is_null`] for more information.\n\n# Null-unchecked version\n\nIf you are sure the pointer can never be null, you can use `as_ref_unchecked` which returns\n`&mut T` instead of `Option<&mut T>`.\n"include_str!("./docs/as_ref.md")]
229    ///
230    /// ```
231    /// let ptr: *mut u8 = &mut 10u8 as *mut u8;
232    ///
233    /// unsafe {
234    ///     let val_back = ptr.as_ref_unchecked();
235    ///     println!("We got back the value: {val_back}!");
236    /// }
237    /// ```
238    ///
239    /// # Examples
240    ///
241    /// ```
242    /// let ptr: *mut u8 = &mut 10u8 as *mut u8;
243    ///
244    /// unsafe {
245    ///     if let Some(val_back) = ptr.as_ref() {
246    ///         println!("We got back the value: {val_back}!");
247    ///     }
248    /// }
249    /// ```
250    ///
251    /// # See Also
252    ///
253    /// For the mutable counterpart see [`as_mut`].
254    ///
255    /// [`is_null`]: #method.is_null-1
256    /// [`as_uninit_ref`]: #method.as_uninit_ref-1
257    /// [`as_ref_unchecked`]: #method.as_ref_unchecked-1
258    /// [`as_mut`]: #method.as_mut
259
260    #[stable(feature = "ptr_as_ref", since = "1.9.0")]
261    #[rustc_const_stable(feature = "const_ptr_is_null", since = "1.84.0")]
262    #[inline]
263    pub const unsafe fn as_ref<'a>(self) -> Option<&'a T> {
264        // SAFETY: the caller must guarantee that `self` is valid for a
265        // reference if it isn't null.
266        if self.is_null() { None } else { unsafe { Some(&*self) } }
267    }
268
269    /// Returns a shared reference to the value behind the pointer.
270    /// If the pointer may be null or the value may be uninitialized, [`as_uninit_ref`] must be used instead.
271    /// If the pointer may be null, but the value is known to have been initialized, [`as_ref`] must be used instead.
272    ///
273    /// For the mutable counterpart see [`as_mut_unchecked`].
274    ///
275    /// [`as_ref`]: #method.as_ref
276    /// [`as_uninit_ref`]: #method.as_uninit_ref
277    /// [`as_mut_unchecked`]: #method.as_mut_unchecked
278    ///
279    /// # Safety
280    ///
281    /// When calling this method, you have to ensure that the pointer is [convertible to a reference](crate::ptr#pointer-to-reference-conversion).
282    ///
283    /// # Examples
284    ///
285    /// ```
286    /// let ptr: *mut u8 = &mut 10u8 as *mut u8;
287    ///
288    /// unsafe {
289    ///     println!("We got back the value: {}!", ptr.as_ref_unchecked());
290    /// }
291    /// ```
292    #[stable(feature = "ptr_as_ref_unchecked", since = "1.95.0")]
293    #[rustc_const_stable(feature = "ptr_as_ref_unchecked", since = "1.95.0")]
294    #[inline]
295    #[must_use]
296    pub const unsafe fn as_ref_unchecked<'a>(self) -> &'a T {
297        // SAFETY: the caller must guarantee that `self` is valid for a reference
298        unsafe { &*self }
299    }
300
301    #[doc = "Returns `None` if the pointer is null, or else returns a shared reference to\nthe value wrapped in `Some`. In contrast to [`as_ref`], this does not require\nthat the value has to be initialized.\n\n# Safety\n\nWhen calling this method, you have to ensure that *either* the pointer is null *or*\nthe pointer is [convertible to a reference](crate::ptr#pointer-to-reference-conversion).\nNote that because the created reference is to `MaybeUninit<T>`, the\nsource pointer can point to uninitialized memory.\n\n# Panics during const evaluation\n\nThis method will panic during const evaluation if the pointer cannot be\ndetermined to be null or not. See [`is_null`] for more information.\n"include_str!("./docs/as_uninit_ref.md")]
302    ///
303    /// [`is_null`]: #method.is_null-1
304    /// [`as_ref`]: pointer#method.as_ref-1
305    ///
306    /// # See Also
307    /// For the mutable counterpart see [`as_uninit_mut`].
308    ///
309    /// [`as_uninit_mut`]: #method.as_uninit_mut
310    ///
311    /// # Examples
312    ///
313    /// ```
314    /// #![feature(ptr_as_uninit)]
315    ///
316    /// let ptr: *mut u8 = &mut 10u8 as *mut u8;
317    ///
318    /// unsafe {
319    ///     if let Some(val_back) = ptr.as_uninit_ref() {
320    ///         println!("We got back the value: {}!", val_back.assume_init());
321    ///     }
322    /// }
323    /// ```
324    #[inline]
325    #[unstable(feature = "ptr_as_uninit", issue = "75402")]
326    pub const unsafe fn as_uninit_ref<'a>(self) -> Option<&'a MaybeUninit<T>>
327    where
328        T: Sized,
329    {
330        // SAFETY: the caller must guarantee that `self` meets all the
331        // requirements for a reference.
332        if self.is_null() { None } else { Some(unsafe { &*(self as *const MaybeUninit<T>) }) }
333    }
334
335    #[doc = "Adds a signed offset to a pointer.\n\n`count` is in units of T; e.g., a `count` of 3 represents a pointer\noffset of `3 * size_of::<T>()` bytes.\n\n# Safety\n\nIf any of the following conditions are violated, the result is Undefined Behavior:\n\n* The offset in bytes, `count * size_of::<T>()`, computed on mathematical integers (without\n\"wrapping around\"), must fit in an `isize`.\n\n* Let `result` be `self.addr() + count * size_of::<T>()`, computed on mathematical integers.\nThis must fit in a `usize`.\n\n* If the computed offset is non-zero, then `self` must be [derived from][crate::ptr#provenance] a pointer to some\n[allocation], and the entire memory range between `self` and `result`\n(i.e., `min(self.addr(), result)..max(self.addr(), result)`)\nmust be in bounds of that allocation.\n\nAllocations can never be larger than `isize::MAX` bytes and they can only contain addresses\nrepresentable by `usize`, so technically the last condition implies the first two. This implies, for\ninstance, that `vec.as_ptr().offset(vec.len() as isize)` (for `vec: Vec<T>`) is always safe.\n\n[allocation]: crate::ptr#allocation\n"include_str!("./docs/offset.md")]
336    ///
337    /// Consider using [`wrapping_offset`](#method.wrapping_offset) instead if these constraints are
338    /// difficult to satisfy. The only advantage of this method is that it
339    /// enables more aggressive compiler optimizations.
340    ///
341    /// # Examples
342    ///
343    /// ```
344    /// let mut s = [1, 2, 3];
345    /// let ptr: *mut u32 = s.as_mut_ptr();
346    ///
347    /// unsafe {
348    ///     assert_eq!(2, *ptr.offset(1));
349    ///     assert_eq!(3, *ptr.offset(2));
350    /// }
351    /// ```
352    #[stable(feature = "rust1", since = "1.0.0")]
353    #[must_use = "returns a new pointer rather than modifying its argument"]
354    #[rustc_const_stable(feature = "const_ptr_offset", since = "1.61.0")]
355    #[inline(always)]
356    #[track_caller]
357    pub const unsafe fn offset(self, count: isize) -> *mut T
358    where
359        T: Sized,
360    {
361        #[inline]
362        #[rustc_allow_const_fn_unstable(const_eval_select)]
363        const fn runtime_offset_nowrap(this: *const (), count: isize, size: usize) -> bool {
364            // We can use const_eval_select here because this is only for UB checks.
365            {
    #[inline]
    fn runtime(this: *const (), count: isize, size: usize) -> bool {
        {
            let Some(byte_offset) =
                count.checked_mul(size as isize) else { return false; };
            let (_, overflow) =
                this.addr().overflowing_add_signed(byte_offset);
            !overflow
        }
    }
    #[inline]
    const fn compiletime(this: *const (), count: isize, size: usize) -> bool {
        let _ = this;
        let _ = count;
        let _ = size;
        { true }
    }
    const_eval_select((this, count, size), compiletime, runtime)
}const_eval_select!(
366                @capture { this: *const (), count: isize, size: usize } -> bool:
367                if const {
368                    true
369                } else {
370                    // `size` is the size of a Rust type, so we know that
371                    // `size <= isize::MAX` and thus `as` cast here is not lossy.
372                    let Some(byte_offset) = count.checked_mul(size as isize) else {
373                        return false;
374                    };
375                    let (_, overflow) = this.addr().overflowing_add_signed(byte_offset);
376                    !overflow
377                }
378            )
379        }
380
381        {
    #[rustc_no_mir_inline]
    #[inline]
    #[rustc_nounwind]
    #[track_caller]
    const fn precondition_check(this: *const (), count: isize, size: usize) {
        if !runtime_offset_nowrap(this, count, size) {
            let msg =
                "unsafe precondition(s) violated: ptr::offset requires the address calculation to not overflow\n\nThis indicates a bug in the program. This Undefined Behavior check is optional, and cannot be relied on for safety.";
            ::core::panicking::panic_nounwind_fmt(::core::fmt::Arguments::from_str(msg),
                false);
        }
    }
    if ::core::ub_checks::check_language_ub() {
        precondition_check(self as *const (), count, size_of::<T>());
    }
};ub_checks::assert_unsafe_precondition!(
382            check_language_ub,
383            "ptr::offset requires the address calculation to not overflow",
384            (
385                this: *const () = self as *const (),
386                count: isize = count,
387                size: usize = size_of::<T>(),
388            ) => runtime_offset_nowrap(this, count, size)
389        );
390
391        // SAFETY: the caller must uphold the safety contract for `offset`.
392        // The obtained pointer is valid for writes since the caller must
393        // guarantee that it points to the same allocation as `self`.
394        unsafe { intrinsics::offset(self, count) }
395    }
396
397    /// Adds a signed offset in bytes to a pointer.
398    ///
399    /// `count` is in units of **bytes**.
400    ///
401    /// This is purely a convenience for casting to a `u8` pointer and
402    /// using [offset][pointer::offset] on it. See that method for documentation
403    /// and safety requirements.
404    ///
405    /// For non-`Sized` pointees this operation changes only the data pointer,
406    /// leaving the metadata untouched.
407    #[must_use]
408    #[inline(always)]
409    #[stable(feature = "pointer_byte_offsets", since = "1.75.0")]
410    #[rustc_const_stable(feature = "const_pointer_byte_offsets", since = "1.75.0")]
411    #[track_caller]
412    pub const unsafe fn byte_offset(self, count: isize) -> Self {
413        // SAFETY: the caller must uphold the safety contract for `offset`.
414        unsafe { self.cast::<u8>().offset(count).with_metadata_of(self) }
415    }
416
417    /// Adds a signed offset to a pointer using wrapping arithmetic.
418    ///
419    /// `count` is in units of T; e.g., a `count` of 3 represents a pointer
420    /// offset of `3 * size_of::<T>()` bytes.
421    ///
422    /// # Safety
423    ///
424    /// This operation itself is always safe, but using the resulting pointer is not.
425    ///
426    /// The resulting pointer "remembers" the [allocation] that `self` points to
427    /// (this is called "[Provenance](ptr/index.html#provenance)").
428    /// The pointer must not be used to read or write other allocations.
429    ///
430    /// In other words, `let z = x.wrapping_offset((y as isize) - (x as isize))` does *not* make `z`
431    /// the same as `y` even if we assume `T` has size `1` and there is no overflow: `z` is still
432    /// attached to the object `x` is attached to, and dereferencing it is Undefined Behavior unless
433    /// `x` and `y` point into the same allocation.
434    ///
435    /// Compared to [`offset`], this method basically delays the requirement of staying within the
436    /// same allocation: [`offset`] is immediate Undefined Behavior when crossing object
437    /// boundaries; `wrapping_offset` produces a pointer but still leads to Undefined Behavior if a
438    /// pointer is dereferenced when it is out-of-bounds of the object it is attached to. [`offset`]
439    /// can be optimized better and is thus preferable in performance-sensitive code.
440    ///
441    /// The delayed check only considers the value of the pointer that was dereferenced, not the
442    /// intermediate values used during the computation of the final result. For example,
443    /// `x.wrapping_offset(o).wrapping_offset(o.wrapping_neg())` is always the same as `x`. In other
444    /// words, leaving the allocation and then re-entering it later is permitted.
445    ///
446    /// [`offset`]: #method.offset
447    /// [allocation]: crate::ptr#allocation
448    ///
449    /// # Examples
450    ///
451    /// ```
452    /// // Iterate using a raw pointer in increments of two elements
453    /// let mut data = [1u8, 2, 3, 4, 5];
454    /// let mut ptr: *mut u8 = data.as_mut_ptr();
455    /// let step = 2;
456    /// let end_rounded_up = ptr.wrapping_offset(6);
457    ///
458    /// while ptr != end_rounded_up {
459    ///     unsafe {
460    ///         *ptr = 0;
461    ///     }
462    ///     ptr = ptr.wrapping_offset(step);
463    /// }
464    /// assert_eq!(&data, &[0, 2, 0, 4, 0]);
465    /// ```
466    #[stable(feature = "ptr_wrapping_offset", since = "1.16.0")]
467    #[must_use = "returns a new pointer rather than modifying its argument"]
468    #[rustc_const_stable(feature = "const_ptr_offset", since = "1.61.0")]
469    #[inline(always)]
470    pub const fn wrapping_offset(self, count: isize) -> *mut T
471    where
472        T: Sized,
473    {
474        // SAFETY: the `arith_offset` intrinsic has no prerequisites to be called.
475        unsafe { intrinsics::arith_offset(self, count) as *mut T }
476    }
477
478    /// Adds a signed offset in bytes to a pointer using wrapping arithmetic.
479    ///
480    /// `count` is in units of **bytes**.
481    ///
482    /// This is purely a convenience for casting to a `u8` pointer and
483    /// using [wrapping_offset][pointer::wrapping_offset] on it. See that method
484    /// for documentation.
485    ///
486    /// For non-`Sized` pointees this operation changes only the data pointer,
487    /// leaving the metadata untouched.
488    #[must_use]
489    #[inline(always)]
490    #[stable(feature = "pointer_byte_offsets", since = "1.75.0")]
491    #[rustc_const_stable(feature = "const_pointer_byte_offsets", since = "1.75.0")]
492    pub const fn wrapping_byte_offset(self, count: isize) -> Self {
493        self.cast::<u8>().wrapping_offset(count).with_metadata_of(self)
494    }
495
496    /// Masks out bits of the pointer according to a mask.
497    ///
498    /// This is convenience for `ptr.map_addr(|a| a & mask)`.
499    ///
500    /// For non-`Sized` pointees this operation changes only the data pointer,
501    /// leaving the metadata untouched.
502    ///
503    /// ## Examples
504    ///
505    /// ```
506    /// #![feature(ptr_mask)]
507    /// let mut v = 17_u32;
508    /// let ptr: *mut u32 = &mut v;
509    ///
510    /// // `u32` is 4 bytes aligned,
511    /// // which means that lower 2 bits are always 0.
512    /// let tag_mask = 0b11;
513    /// let ptr_mask = !tag_mask;
514    ///
515    /// // We can store something in these lower bits
516    /// let tagged_ptr = ptr.map_addr(|a| a | 0b10);
517    ///
518    /// // Get the "tag" back
519    /// let tag = tagged_ptr.addr() & tag_mask;
520    /// assert_eq!(tag, 0b10);
521    ///
522    /// // Note that `tagged_ptr` is unaligned, it's UB to read from/write to it.
523    /// // To get original pointer `mask` can be used:
524    /// let masked_ptr = tagged_ptr.mask(ptr_mask);
525    /// assert_eq!(unsafe { *masked_ptr }, 17);
526    ///
527    /// unsafe { *masked_ptr = 0 };
528    /// assert_eq!(v, 0);
529    /// ```
530    #[unstable(feature = "ptr_mask", issue = "98290")]
531    #[must_use = "returns a new pointer rather than modifying its argument"]
532    #[inline(always)]
533    pub fn mask(self, mask: usize) -> *mut T {
534        intrinsics::ptr_mask(self.cast::<()>(), mask).cast_mut().with_metadata_of(self)
535    }
536
537    /// Returns `None` if the pointer is null, or else returns a unique reference to
538    /// the value wrapped in `Some`. If the value may be uninitialized, [`as_uninit_mut`]
539    /// must be used instead. If the value is known to be non-null, [`as_mut_unchecked`]
540    /// can be used instead.
541    ///
542    /// For the shared counterpart see [`as_ref`].
543    ///
544    /// [`as_uninit_mut`]: #method.as_uninit_mut
545    /// [`as_mut_unchecked`]: #method.as_mut_unchecked
546    /// [`as_ref`]: pointer#method.as_ref-1
547    ///
548    /// # Safety
549    ///
550    /// When calling this method, you have to ensure that *either*
551    /// the pointer is null *or*
552    /// the pointer is [convertible to a reference](crate::ptr#pointer-to-reference-conversion).
553    ///
554    /// # Panics during const evaluation
555    ///
556    /// This method will panic during const evaluation if the pointer cannot be
557    /// determined to be null or not. See [`is_null`] for more information.
558    ///
559    /// [`is_null`]: #method.is_null-1
560    ///
561    /// # Examples
562    ///
563    /// ```
564    /// let mut s = [1, 2, 3];
565    /// let ptr: *mut u32 = s.as_mut_ptr();
566    /// let first_value = unsafe { ptr.as_mut().unwrap() };
567    /// *first_value = 4;
568    /// # assert_eq!(s, [4, 2, 3]);
569    /// println!("{s:?}"); // It'll print: "[4, 2, 3]".
570    /// ```
571    ///
572    /// # Null-unchecked version
573    ///
574    /// If you are sure the pointer can never be null, you can use `as_mut_unchecked` which returns
575    /// `&mut T` instead of `Option<&mut T>`.
576    ///
577    /// ```
578    /// let mut s = [1, 2, 3];
579    /// let ptr: *mut u32 = s.as_mut_ptr();
580    /// let first_value = unsafe { ptr.as_mut_unchecked() };
581    /// *first_value = 4;
582    /// # assert_eq!(s, [4, 2, 3]);
583    /// println!("{s:?}"); // It'll print: "[4, 2, 3]".
584    /// ```
585    #[stable(feature = "ptr_as_ref", since = "1.9.0")]
586    #[rustc_const_stable(feature = "const_ptr_is_null", since = "1.84.0")]
587    #[inline]
588    pub const unsafe fn as_mut<'a>(self) -> Option<&'a mut T> {
589        // SAFETY: the caller must guarantee that `self` is be valid for
590        // a mutable reference if it isn't null.
591        if self.is_null() { None } else { unsafe { Some(&mut *self) } }
592    }
593
594    /// Returns a unique reference to the value behind the pointer.
595    /// If the pointer may be null or the value may be uninitialized, [`as_uninit_mut`] must be used instead.
596    /// If the pointer may be null, but the value is known to have been initialized, [`as_mut`] must be used instead.
597    ///
598    /// For the shared counterpart see [`as_ref_unchecked`].
599    ///
600    /// [`as_mut`]: #method.as_mut
601    /// [`as_uninit_mut`]: #method.as_uninit_mut
602    /// [`as_ref_unchecked`]: #method.as_ref_unchecked
603    ///
604    /// # Safety
605    ///
606    /// When calling this method, you have to ensure that
607    /// the pointer is [convertible to a reference](crate::ptr#pointer-to-reference-conversion).
608    ///
609    /// # Examples
610    ///
611    /// ```
612    /// let mut s = [1, 2, 3];
613    /// let ptr: *mut u32 = s.as_mut_ptr();
614    /// let first_value = unsafe { ptr.as_mut_unchecked() };
615    /// *first_value = 4;
616    /// # assert_eq!(s, [4, 2, 3]);
617    /// println!("{s:?}"); // It'll print: "[4, 2, 3]".
618    /// ```
619    #[stable(feature = "ptr_as_ref_unchecked", since = "1.95.0")]
620    #[rustc_const_stable(feature = "ptr_as_ref_unchecked", since = "1.95.0")]
621    #[inline]
622    #[must_use]
623    pub const unsafe fn as_mut_unchecked<'a>(self) -> &'a mut T {
624        // SAFETY: the caller must guarantee that `self` is valid for a reference
625        unsafe { &mut *self }
626    }
627
628    /// Returns `None` if the pointer is null, or else returns a unique reference to
629    /// the value wrapped in `Some`. In contrast to [`as_mut`], this does not require
630    /// that the value has to be initialized.
631    ///
632    /// For the shared counterpart see [`as_uninit_ref`].
633    ///
634    /// [`as_mut`]: #method.as_mut
635    /// [`as_uninit_ref`]: pointer#method.as_uninit_ref-1
636    ///
637    /// # Safety
638    ///
639    /// When calling this method, you have to ensure that *either* the pointer is null *or*
640    /// the pointer is [convertible to a reference](crate::ptr#pointer-to-reference-conversion).
641    /// Note that because the created reference is to `MaybeUninit<T>`, the
642    /// source pointer can point to uninitialized memory.
643    ///
644    /// # Panics during const evaluation
645    ///
646    /// This method will panic during const evaluation if the pointer cannot be
647    /// determined to be null or not. See [`is_null`] for more information.
648    ///
649    /// [`is_null`]: #method.is_null-1
650    #[inline]
651    #[unstable(feature = "ptr_as_uninit", issue = "75402")]
652    pub const unsafe fn as_uninit_mut<'a>(self) -> Option<&'a mut MaybeUninit<T>>
653    where
654        T: Sized,
655    {
656        // SAFETY: the caller must guarantee that `self` meets all the
657        // requirements for a reference.
658        if self.is_null() { None } else { Some(unsafe { &mut *(self as *mut MaybeUninit<T>) }) }
659    }
660
661    /// Returns whether two pointers are guaranteed to be equal.
662    ///
663    /// At runtime this function behaves like `Some(self == other)`.
664    /// However, in some contexts (e.g., compile-time evaluation),
665    /// it is not always possible to determine equality of two pointers, so this function may
666    /// spuriously return `None` for pointers that later actually turn out to have its equality known.
667    /// But when it returns `Some`, the pointers' equality is guaranteed to be known.
668    ///
669    /// The return value may change from `Some` to `None` and vice versa depending on the compiler
670    /// version and unsafe code must not
671    /// rely on the result of this function for soundness. It is suggested to only use this function
672    /// for performance optimizations where spurious `None` return values by this function do not
673    /// affect the outcome, but just the performance.
674    /// The consequences of using this method to make runtime and compile-time code behave
675    /// differently have not been explored. This method should not be used to introduce such
676    /// differences, and it should also not be stabilized before we have a better understanding
677    /// of this issue.
678    #[unstable(feature = "const_raw_ptr_comparison", issue = "53020")]
679    #[rustc_const_unstable(feature = "const_raw_ptr_comparison", issue = "53020")]
680    #[inline]
681    pub const fn guaranteed_eq(self, other: *mut T) -> Option<bool>
682    where
683        T: Sized,
684    {
685        (self as *const T).guaranteed_eq(other as _)
686    }
687
688    /// Returns whether two pointers are guaranteed to be inequal.
689    ///
690    /// At runtime this function behaves like `Some(self != other)`.
691    /// However, in some contexts (e.g., compile-time evaluation),
692    /// it is not always possible to determine inequality of two pointers, so this function may
693    /// spuriously return `None` for pointers that later actually turn out to have its inequality known.
694    /// But when it returns `Some`, the pointers' inequality is guaranteed to be known.
695    ///
696    /// The return value may change from `Some` to `None` and vice versa depending on the compiler
697    /// version and unsafe code must not
698    /// rely on the result of this function for soundness. It is suggested to only use this function
699    /// for performance optimizations where spurious `None` return values by this function do not
700    /// affect the outcome, but just the performance.
701    /// The consequences of using this method to make runtime and compile-time code behave
702    /// differently have not been explored. This method should not be used to introduce such
703    /// differences, and it should also not be stabilized before we have a better understanding
704    /// of this issue.
705    #[unstable(feature = "const_raw_ptr_comparison", issue = "53020")]
706    #[rustc_const_unstable(feature = "const_raw_ptr_comparison", issue = "53020")]
707    #[inline]
708    pub const fn guaranteed_ne(self, other: *mut T) -> Option<bool>
709    where
710        T: Sized,
711    {
712        (self as *const T).guaranteed_ne(other as _)
713    }
714
715    /// Calculates the distance between two pointers within the same allocation. The returned value is in
716    /// units of T: the distance in bytes divided by `size_of::<T>()`.
717    ///
718    /// This is equivalent to `(self as isize - origin as isize) / (size_of::<T>() as isize)`,
719    /// except that it has a lot more opportunities for UB, in exchange for the compiler
720    /// better understanding what you are doing.
721    ///
722    /// The primary motivation of this method is for computing the `len` of an array/slice
723    /// of `T` that you are currently representing as a "start" and "end" pointer
724    /// (and "end" is "one past the end" of the array).
725    /// In that case, `end.offset_from(start)` gets you the length of the array.
726    ///
727    /// All of the following safety requirements are trivially satisfied for this usecase.
728    ///
729    /// [`offset`]: pointer#method.offset-1
730    ///
731    /// # Safety
732    ///
733    /// If any of the following conditions are violated, the result is Undefined Behavior:
734    ///
735    /// * `self` and `origin` must either
736    ///
737    ///   * point to the same address, or
738    ///   * both be [derived from][crate::ptr#provenance] a pointer to the same [allocation], and the memory range between
739    ///     the two pointers must be in bounds of that object. (See below for an example.)
740    ///
741    /// * The distance between the pointers, in bytes, must be an exact multiple
742    ///   of the size of `T`.
743    ///
744    /// As a consequence, the absolute distance between the pointers, in bytes, computed on
745    /// mathematical integers (without "wrapping around"), cannot overflow an `isize`. This is
746    /// implied by the in-bounds requirement, and the fact that no allocation can be larger
747    /// than `isize::MAX` bytes.
748    ///
749    /// The requirement for pointers to be derived from the same allocation is primarily
750    /// needed for `const`-compatibility: the distance between pointers into *different* allocated
751    /// objects is not known at compile-time. However, the requirement also exists at
752    /// runtime and may be exploited by optimizations. If you wish to compute the difference between
753    /// pointers that are not guaranteed to be from the same allocation, use
754    /// `(self.addr() as isize - origin.addr() as isize) / size_of::<T>()`.
755    ///
756    /// [`add`]: #method.add
757    /// [allocation]: crate::ptr#allocation
758    ///
759    /// # Panics
760    ///
761    /// This function panics if `T` is a Zero-Sized Type ("ZST").
762    ///
763    /// # Examples
764    ///
765    /// Basic usage:
766    ///
767    /// ```
768    /// let mut a = [0; 5];
769    /// let ptr1: *mut i32 = &mut a[1];
770    /// let ptr2: *mut i32 = &mut a[3];
771    /// unsafe {
772    ///     assert_eq!(ptr2.offset_from(ptr1), 2);
773    ///     assert_eq!(ptr1.offset_from(ptr2), -2);
774    ///     assert_eq!(ptr1.offset(2), ptr2);
775    ///     assert_eq!(ptr2.offset(-2), ptr1);
776    /// }
777    /// ```
778    ///
779    /// *Incorrect* usage:
780    ///
781    /// ```rust,no_run
782    /// let ptr1 = Box::into_raw(Box::new(0u8));
783    /// let ptr2 = Box::into_raw(Box::new(1u8));
784    /// let diff = (ptr2 as isize).wrapping_sub(ptr1 as isize);
785    /// // Make ptr2_other an "alias" of ptr2.add(1), but derived from ptr1.
786    /// let ptr2_other = (ptr1 as *mut u8).wrapping_offset(diff).wrapping_offset(1);
787    /// assert_eq!(ptr2 as usize, ptr2_other as usize);
788    /// // Since ptr2_other and ptr2 are derived from pointers to different objects,
789    /// // computing their offset is undefined behavior, even though
790    /// // they point to addresses that are in-bounds of the same object!
791    /// unsafe {
792    ///     let one = ptr2_other.offset_from(ptr2); // Undefined Behavior! ⚠️
793    /// }
794    /// ```
795    #[stable(feature = "ptr_offset_from", since = "1.47.0")]
796    #[rustc_const_stable(feature = "const_ptr_offset_from", since = "1.65.0")]
797    #[inline(always)]
798    #[cfg_attr(miri, track_caller)] // even without panics, this helps for Miri backtraces
799    pub const unsafe fn offset_from(self, origin: *const T) -> isize
800    where
801        T: Sized,
802    {
803        // SAFETY: the caller must uphold the safety contract for `offset_from`.
804        unsafe { (self as *const T).offset_from(origin) }
805    }
806
807    /// Calculates the distance between two pointers within the same allocation. The returned value is in
808    /// units of **bytes**.
809    ///
810    /// This is purely a convenience for casting to a `u8` pointer and
811    /// using [`offset_from`][pointer::offset_from] on it. See that method for
812    /// documentation and safety requirements.
813    ///
814    /// For non-`Sized` pointees this operation considers only the data pointers,
815    /// ignoring the metadata.
816    #[inline(always)]
817    #[stable(feature = "pointer_byte_offsets", since = "1.75.0")]
818    #[rustc_const_stable(feature = "const_pointer_byte_offsets", since = "1.75.0")]
819    #[cfg_attr(miri, track_caller)] // even without panics, this helps for Miri backtraces
820    pub const unsafe fn byte_offset_from<U: ?Sized>(self, origin: *const U) -> isize {
821        // SAFETY: the caller must uphold the safety contract for `offset_from`.
822        unsafe { self.cast::<u8>().offset_from(origin.cast::<u8>()) }
823    }
824
825    /// Calculates the distance between two pointers within the same allocation, *where it's known that
826    /// `self` is equal to or greater than `origin`*. The returned value is in
827    /// units of T: the distance in bytes is divided by `size_of::<T>()`.
828    ///
829    /// This computes the same value that [`offset_from`](#method.offset_from)
830    /// would compute, but with the added precondition that the offset is
831    /// guaranteed to be non-negative.  This method is equivalent to
832    /// `usize::try_from(self.offset_from(origin)).unwrap_unchecked()`,
833    /// but it provides slightly more information to the optimizer, which can
834    /// sometimes allow it to optimize slightly better with some backends.
835    ///
836    /// This method can be thought of as recovering the `count` that was passed
837    /// to [`add`](#method.add) (or, with the parameters in the other order,
838    /// to [`sub`](#method.sub)).  The following are all equivalent, assuming
839    /// that their safety preconditions are met:
840    /// ```rust
841    /// # unsafe fn blah(ptr: *mut i32, origin: *mut i32, count: usize) -> bool { unsafe {
842    /// ptr.offset_from_unsigned(origin) == count
843    /// # &&
844    /// origin.add(count) == ptr
845    /// # &&
846    /// ptr.sub(count) == origin
847    /// # } }
848    /// ```
849    ///
850    /// # Safety
851    ///
852    /// - The distance between the pointers must be non-negative (`self >= origin`)
853    ///
854    /// - *All* the safety conditions of [`offset_from`](#method.offset_from)
855    ///   apply to this method as well; see it for the full details.
856    ///
857    /// Importantly, despite the return type of this method being able to represent
858    /// a larger offset, it's still *not permitted* to pass pointers which differ
859    /// by more than `isize::MAX` *bytes*.  As such, the result of this method will
860    /// always be less than or equal to `isize::MAX as usize`.
861    ///
862    /// # Panics
863    ///
864    /// This function panics if `T` is a Zero-Sized Type ("ZST").
865    ///
866    /// # Examples
867    ///
868    /// ```
869    /// let mut a = [0; 5];
870    /// let p: *mut i32 = a.as_mut_ptr();
871    /// unsafe {
872    ///     let ptr1: *mut i32 = p.add(1);
873    ///     let ptr2: *mut i32 = p.add(3);
874    ///
875    ///     assert_eq!(ptr2.offset_from_unsigned(ptr1), 2);
876    ///     assert_eq!(ptr1.add(2), ptr2);
877    ///     assert_eq!(ptr2.sub(2), ptr1);
878    ///     assert_eq!(ptr2.offset_from_unsigned(ptr2), 0);
879    /// }
880    ///
881    /// // This would be incorrect, as the pointers are not correctly ordered:
882    /// // ptr1.offset_from(ptr2)
883    /// ```
884    #[stable(feature = "ptr_sub_ptr", since = "1.87.0")]
885    #[rustc_const_stable(feature = "const_ptr_sub_ptr", since = "1.87.0")]
886    #[inline]
887    #[track_caller]
888    pub const unsafe fn offset_from_unsigned(self, origin: *const T) -> usize
889    where
890        T: Sized,
891    {
892        // SAFETY: the caller must uphold the safety contract for `offset_from_unsigned`.
893        unsafe { (self as *const T).offset_from_unsigned(origin) }
894    }
895
896    /// Calculates the distance between two pointers within the same allocation, *where it's known that
897    /// `self` is equal to or greater than `origin`*. The returned value is in
898    /// units of **bytes**.
899    ///
900    /// This is purely a convenience for casting to a `u8` pointer and
901    /// using [`offset_from_unsigned`][pointer::offset_from_unsigned] on it.
902    /// See that method for documentation and safety requirements.
903    ///
904    /// For non-`Sized` pointees this operation considers only the data pointers,
905    /// ignoring the metadata.
906    #[stable(feature = "ptr_sub_ptr", since = "1.87.0")]
907    #[rustc_const_stable(feature = "const_ptr_sub_ptr", since = "1.87.0")]
908    #[inline]
909    #[track_caller]
910    pub const unsafe fn byte_offset_from_unsigned<U: ?Sized>(self, origin: *mut U) -> usize {
911        // SAFETY: the caller must uphold the safety contract for `byte_offset_from_unsigned`.
912        unsafe { (self as *const T).byte_offset_from_unsigned(origin) }
913    }
914
915    #[doc = "Adds an unsigned offset to a pointer.\n\nThis can only move the pointer forward (or not move it). If you need to move forward or\nbackward depending on the value, then you might want [`offset`](#method.offset) instead\nwhich takes a signed offset.\n\n`count` is in units of T; e.g., a `count` of 3 represents a pointer\noffset of `3 * size_of::<T>()` bytes.\n\n# Safety\n\nIf any of the following conditions are violated, the result is Undefined Behavior:\n\n* The offset in bytes, `count * size_of::<T>()`, computed on mathematical integers (without\n\"wrapping around\"), must fit in an `isize`.\n\n* Let `result` be `self.addr() + count * size_of::<T>()`, computed on mathematical integers.\nThis must fit in a `usize`.\n\n* If the computed offset is non-zero, then `self` must be [derived from][crate::ptr#provenance] a pointer to some\n[allocation], and the entire memory range between `self` and `result`\n(i.e., `self.addr()..result`) must be in bounds of that allocation.\n\nAllocations can never be larger than `isize::MAX` bytes and they can only contain addresses\nrepresentable by `usize`, so technically the last condition implies the first two. This implies, for\ninstance, that `vec.as_ptr().add(vec.len())` (for `vec: Vec<T>`) is always safe.\n\n[allocation]: crate::ptr#allocation\n"include_str!("./docs/add.md")]
916    ///
917    /// Consider using [`wrapping_add`](#method.wrapping_add) instead if these constraints are
918    /// difficult to satisfy. The only advantage of this method is that it
919    /// enables more aggressive compiler optimizations.
920    ///
921    /// # Examples
922    ///
923    /// ```
924    /// let mut s: String = "123".to_string();
925    /// let ptr: *mut u8 = s.as_mut_ptr();
926    ///
927    /// unsafe {
928    ///     assert_eq!('2', *ptr.add(1) as char);
929    ///     assert_eq!('3', *ptr.add(2) as char);
930    /// }
931    /// ```
932    #[stable(feature = "pointer_methods", since = "1.26.0")]
933    #[must_use = "returns a new pointer rather than modifying its argument"]
934    #[rustc_const_stable(feature = "const_ptr_offset", since = "1.61.0")]
935    #[inline(always)]
936    #[track_caller]
937    pub const unsafe fn add(self, count: usize) -> Self
938    where
939        T: Sized,
940    {
941        #[cfg(debug_assertions)]
942        #[inline]
943        #[rustc_allow_const_fn_unstable(const_eval_select)]
944        const fn runtime_add_nowrap(this: *const (), count: usize, size: usize) -> bool {
945            {
    #[inline]
    fn runtime(this: *const (), count: usize, size: usize) -> bool {
        {
            let Some(byte_offset) =
                count.checked_mul(size) else { return false; };
            let (_, overflow) = this.addr().overflowing_add(byte_offset);
            byte_offset <= (isize::MAX as usize) && !overflow
        }
    }
    #[inline]
    const fn compiletime(this: *const (), count: usize, size: usize) -> bool {
        let _ = this;
        let _ = count;
        let _ = size;
        { true }
    }
    const_eval_select((this, count, size), compiletime, runtime)
}const_eval_select!(
946                @capture { this: *const (), count: usize, size: usize } -> bool:
947                if const {
948                    true
949                } else {
950                    let Some(byte_offset) = count.checked_mul(size) else {
951                        return false;
952                    };
953                    let (_, overflow) = this.addr().overflowing_add(byte_offset);
954                    byte_offset <= (isize::MAX as usize) && !overflow
955                }
956            )
957        }
958
959        #[cfg(debug_assertions)] // Expensive, and doesn't catch much in the wild.
960        {
    #[rustc_no_mir_inline]
    #[inline]
    #[rustc_nounwind]
    #[track_caller]
    const fn precondition_check(this: *const (), count: usize, size: usize) {
        if !runtime_add_nowrap(this, count, size) {
            let msg =
                "unsafe precondition(s) violated: ptr::add requires that the address calculation does not overflow\n\nThis indicates a bug in the program. This Undefined Behavior check is optional, and cannot be relied on for safety.";
            ::core::panicking::panic_nounwind_fmt(::core::fmt::Arguments::from_str(msg),
                false);
        }
    }
    if ::core::ub_checks::check_language_ub() {
        precondition_check(self as *const (), count, size_of::<T>());
    }
};ub_checks::assert_unsafe_precondition!(
961            check_language_ub,
962            "ptr::add requires that the address calculation does not overflow",
963            (
964                this: *const () = self as *const (),
965                count: usize = count,
966                size: usize = size_of::<T>(),
967            ) => runtime_add_nowrap(this, count, size)
968        );
969
970        // SAFETY: the caller must uphold the safety contract for `offset`.
971        unsafe { intrinsics::offset(self, count) }
972    }
973
974    /// Adds an unsigned offset in bytes to a pointer.
975    ///
976    /// `count` is in units of bytes.
977    ///
978    /// This is purely a convenience for casting to a `u8` pointer and
979    /// using [add][pointer::add] on it. See that method for documentation
980    /// and safety requirements.
981    ///
982    /// For non-`Sized` pointees this operation changes only the data pointer,
983    /// leaving the metadata untouched.
984    #[must_use]
985    #[inline(always)]
986    #[stable(feature = "pointer_byte_offsets", since = "1.75.0")]
987    #[rustc_const_stable(feature = "const_pointer_byte_offsets", since = "1.75.0")]
988    #[track_caller]
989    pub const unsafe fn byte_add(self, count: usize) -> Self {
990        // SAFETY: the caller must uphold the safety contract for `add`.
991        unsafe { self.cast::<u8>().add(count).with_metadata_of(self) }
992    }
993
994    #[doc = "Subtracts an unsigned offset from a pointer.\n\nThis can only move the pointer backward (or not move it). If you need to move forward or\nbackward depending on the value, then you might want [`offset`](#method.offset) instead\nwhich takes a signed offset.\n\n`count` is in units of T; e.g., a `count` of 3 represents a pointer\noffset of `3 * size_of::<T>()` bytes.\n\n# Safety\n\nIf any of the following conditions are violated, the result is Undefined Behavior:\n\n* The offset in bytes, `count * size_of::<T>()`, computed on mathematical integers (without\n  \"wrapping around\"), must fit in an `isize`.\n\n* Let `result` be `self.addr() - count * size_of::<T>()`, computed on mathematical integers.\nThis must fit in a `usize`.\n\n* If the computed offset is non-zero, then `self` must be [derived from][crate::ptr#provenance] a pointer to some\n[allocation], and the entire memory range between `self` and `result`\n(i.e., `result..self.addr()`) must be in bounds of that allocation.\n\nAllocations can never be larger than `isize::MAX` bytes and they can only contain addresses\nrepresentable by `usize`, so technically the last condition implies the first two.\n\n[allocation]: crate::ptr#allocation\n"include_str!("./docs/sub.md")]
995    ///
996    /// Consider using [`wrapping_sub`](#method.wrapping_sub) instead if these constraints are
997    /// difficult to satisfy. The only advantage of this method is that it
998    /// enables more aggressive compiler optimizations.
999    ///
1000    /// # Examples
1001    ///
1002    /// ```
1003    /// let s: &str = "123";
1004    ///
1005    /// unsafe {
1006    ///     let end: *const u8 = s.as_ptr().add(3);
1007    ///     assert_eq!('3', *end.sub(1) as char);
1008    ///     assert_eq!('2', *end.sub(2) as char);
1009    /// }
1010    /// ```
1011    #[stable(feature = "pointer_methods", since = "1.26.0")]
1012    #[must_use = "returns a new pointer rather than modifying its argument"]
1013    #[rustc_const_stable(feature = "const_ptr_offset", since = "1.61.0")]
1014    #[inline(always)]
1015    #[track_caller]
1016    pub const unsafe fn sub(self, count: usize) -> Self
1017    where
1018        T: Sized,
1019    {
1020        #[cfg(debug_assertions)]
1021        #[inline]
1022        #[rustc_allow_const_fn_unstable(const_eval_select)]
1023        const fn runtime_sub_nowrap(this: *const (), count: usize, size: usize) -> bool {
1024            {
    #[inline]
    fn runtime(this: *const (), count: usize, size: usize) -> bool {
        {
            let Some(byte_offset) =
                count.checked_mul(size) else { return false; };
            byte_offset <= (isize::MAX as usize) && this.addr() >= byte_offset
        }
    }
    #[inline]
    const fn compiletime(this: *const (), count: usize, size: usize) -> bool {
        let _ = this;
        let _ = count;
        let _ = size;
        { true }
    }
    const_eval_select((this, count, size), compiletime, runtime)
}const_eval_select!(
1025                @capture { this: *const (), count: usize, size: usize } -> bool:
1026                if const {
1027                    true
1028                } else {
1029                    let Some(byte_offset) = count.checked_mul(size) else {
1030                        return false;
1031                    };
1032                    byte_offset <= (isize::MAX as usize) && this.addr() >= byte_offset
1033                }
1034            )
1035        }
1036
1037        #[cfg(debug_assertions)] // Expensive, and doesn't catch much in the wild.
1038        {
    #[rustc_no_mir_inline]
    #[inline]
    #[rustc_nounwind]
    #[track_caller]
    const fn precondition_check(this: *const (), count: usize, size: usize) {
        if !runtime_sub_nowrap(this, count, size) {
            let msg =
                "unsafe precondition(s) violated: ptr::sub requires that the address calculation does not overflow\n\nThis indicates a bug in the program. This Undefined Behavior check is optional, and cannot be relied on for safety.";
            ::core::panicking::panic_nounwind_fmt(::core::fmt::Arguments::from_str(msg),
                false);
        }
    }
    if ::core::ub_checks::check_language_ub() {
        precondition_check(self as *const (), count, size_of::<T>());
    }
};ub_checks::assert_unsafe_precondition!(
1039            check_language_ub,
1040            "ptr::sub requires that the address calculation does not overflow",
1041            (
1042                this: *const () = self as *const (),
1043                count: usize = count,
1044                size: usize = size_of::<T>(),
1045            ) => runtime_sub_nowrap(this, count, size)
1046        );
1047
1048        if T::IS_ZST {
1049            // Pointer arithmetic does nothing when the pointee is a ZST.
1050            self
1051        } else {
1052            // SAFETY: the caller must uphold the safety contract for `offset`.
1053            // Because the pointee is *not* a ZST, that means that `count` is
1054            // at most `isize::MAX`, and thus the negation cannot overflow.
1055            unsafe { intrinsics::offset(self, intrinsics::unchecked_sub(0, count as isize)) }
1056        }
1057    }
1058
1059    /// Subtracts an unsigned offset in bytes from a pointer.
1060    ///
1061    /// `count` is in units of bytes.
1062    ///
1063    /// This is purely a convenience for casting to a `u8` pointer and
1064    /// using [sub][pointer::sub] on it. See that method for documentation
1065    /// and safety requirements.
1066    ///
1067    /// For non-`Sized` pointees this operation changes only the data pointer,
1068    /// leaving the metadata untouched.
1069    #[must_use]
1070    #[inline(always)]
1071    #[stable(feature = "pointer_byte_offsets", since = "1.75.0")]
1072    #[rustc_const_stable(feature = "const_pointer_byte_offsets", since = "1.75.0")]
1073    #[track_caller]
1074    pub const unsafe fn byte_sub(self, count: usize) -> Self {
1075        // SAFETY: the caller must uphold the safety contract for `sub`.
1076        unsafe { self.cast::<u8>().sub(count).with_metadata_of(self) }
1077    }
1078
1079    /// Adds an unsigned offset to a pointer using wrapping arithmetic.
1080    ///
1081    /// `count` is in units of T; e.g., a `count` of 3 represents a pointer
1082    /// offset of `3 * size_of::<T>()` bytes.
1083    ///
1084    /// # Safety
1085    ///
1086    /// This operation itself is always safe, but using the resulting pointer is not.
1087    ///
1088    /// The resulting pointer "remembers" the [allocation] that `self` points to; it must not
1089    /// be used to read or write other allocations.
1090    ///
1091    /// In other words, `let z = x.wrapping_add((y as usize) - (x as usize))` does *not* make `z`
1092    /// the same as `y` even if we assume `T` has size `1` and there is no overflow: `z` is still
1093    /// attached to the object `x` is attached to, and dereferencing it is Undefined Behavior unless
1094    /// `x` and `y` point into the same allocation.
1095    ///
1096    /// Compared to [`add`], this method basically delays the requirement of staying within the
1097    /// same allocation: [`add`] is immediate Undefined Behavior when crossing object
1098    /// boundaries; `wrapping_add` produces a pointer but still leads to Undefined Behavior if a
1099    /// pointer is dereferenced when it is out-of-bounds of the object it is attached to. [`add`]
1100    /// can be optimized better and is thus preferable in performance-sensitive code.
1101    ///
1102    /// The delayed check only considers the value of the pointer that was dereferenced, not the
1103    /// intermediate values used during the computation of the final result. For example,
1104    /// `x.wrapping_add(o).wrapping_sub(o)` is always the same as `x`. In other words, leaving the
1105    /// allocation and then re-entering it later is permitted.
1106    ///
1107    /// [`add`]: #method.add
1108    /// [allocation]: crate::ptr#allocation
1109    ///
1110    /// # Examples
1111    ///
1112    /// ```
1113    /// // Iterate using a raw pointer in increments of two elements
1114    /// let data = [1u8, 2, 3, 4, 5];
1115    /// let mut ptr: *const u8 = data.as_ptr();
1116    /// let step = 2;
1117    /// let end_rounded_up = ptr.wrapping_add(6);
1118    ///
1119    /// // This loop prints "1, 3, 5, "
1120    /// while ptr != end_rounded_up {
1121    ///     unsafe {
1122    ///         print!("{}, ", *ptr);
1123    ///     }
1124    ///     ptr = ptr.wrapping_add(step);
1125    /// }
1126    /// ```
1127    #[stable(feature = "pointer_methods", since = "1.26.0")]
1128    #[must_use = "returns a new pointer rather than modifying its argument"]
1129    #[rustc_const_stable(feature = "const_ptr_offset", since = "1.61.0")]
1130    #[inline(always)]
1131    pub const fn wrapping_add(self, count: usize) -> Self
1132    where
1133        T: Sized,
1134    {
1135        self.wrapping_offset(count as isize)
1136    }
1137
1138    /// Adds an unsigned offset in bytes to a pointer using wrapping arithmetic.
1139    ///
1140    /// `count` is in units of bytes.
1141    ///
1142    /// This is purely a convenience for casting to a `u8` pointer and
1143    /// using [wrapping_add][pointer::wrapping_add] on it. See that method for documentation.
1144    ///
1145    /// For non-`Sized` pointees this operation changes only the data pointer,
1146    /// leaving the metadata untouched.
1147    #[must_use]
1148    #[inline(always)]
1149    #[stable(feature = "pointer_byte_offsets", since = "1.75.0")]
1150    #[rustc_const_stable(feature = "const_pointer_byte_offsets", since = "1.75.0")]
1151    pub const fn wrapping_byte_add(self, count: usize) -> Self {
1152        self.cast::<u8>().wrapping_add(count).with_metadata_of(self)
1153    }
1154
1155    /// Subtracts an unsigned offset from a pointer using wrapping arithmetic.
1156    ///
1157    /// `count` is in units of T; e.g., a `count` of 3 represents a pointer
1158    /// offset of `3 * size_of::<T>()` bytes.
1159    ///
1160    /// # Safety
1161    ///
1162    /// This operation itself is always safe, but using the resulting pointer is not.
1163    ///
1164    /// The resulting pointer "remembers" the [allocation] that `self` points to; it must not
1165    /// be used to read or write other allocations.
1166    ///
1167    /// In other words, `let z = x.wrapping_sub((x as usize) - (y as usize))` does *not* make `z`
1168    /// the same as `y` even if we assume `T` has size `1` and there is no overflow: `z` is still
1169    /// attached to the object `x` is attached to, and dereferencing it is Undefined Behavior unless
1170    /// `x` and `y` point into the same allocation.
1171    ///
1172    /// Compared to [`sub`], this method basically delays the requirement of staying within the
1173    /// same allocation: [`sub`] is immediate Undefined Behavior when crossing object
1174    /// boundaries; `wrapping_sub` produces a pointer but still leads to Undefined Behavior if a
1175    /// pointer is dereferenced when it is out-of-bounds of the object it is attached to. [`sub`]
1176    /// can be optimized better and is thus preferable in performance-sensitive code.
1177    ///
1178    /// The delayed check only considers the value of the pointer that was dereferenced, not the
1179    /// intermediate values used during the computation of the final result. For example,
1180    /// `x.wrapping_add(o).wrapping_sub(o)` is always the same as `x`. In other words, leaving the
1181    /// allocation and then re-entering it later is permitted.
1182    ///
1183    /// [`sub`]: #method.sub
1184    /// [allocation]: crate::ptr#allocation
1185    ///
1186    /// # Examples
1187    ///
1188    /// ```
1189    /// // Iterate using a raw pointer in increments of two elements (backwards)
1190    /// let data = [1u8, 2, 3, 4, 5];
1191    /// let mut ptr: *const u8 = data.as_ptr();
1192    /// let start_rounded_down = ptr.wrapping_sub(2);
1193    /// ptr = ptr.wrapping_add(4);
1194    /// let step = 2;
1195    /// // This loop prints "5, 3, 1, "
1196    /// while ptr != start_rounded_down {
1197    ///     unsafe {
1198    ///         print!("{}, ", *ptr);
1199    ///     }
1200    ///     ptr = ptr.wrapping_sub(step);
1201    /// }
1202    /// ```
1203    #[stable(feature = "pointer_methods", since = "1.26.0")]
1204    #[must_use = "returns a new pointer rather than modifying its argument"]
1205    #[rustc_const_stable(feature = "const_ptr_offset", since = "1.61.0")]
1206    #[inline(always)]
1207    pub const fn wrapping_sub(self, count: usize) -> Self
1208    where
1209        T: Sized,
1210    {
1211        self.wrapping_offset((count as isize).wrapping_neg())
1212    }
1213
1214    /// Subtracts an unsigned offset in bytes from a pointer using wrapping arithmetic.
1215    ///
1216    /// `count` is in units of bytes.
1217    ///
1218    /// This is purely a convenience for casting to a `u8` pointer and
1219    /// using [wrapping_sub][pointer::wrapping_sub] on it. See that method for documentation.
1220    ///
1221    /// For non-`Sized` pointees this operation changes only the data pointer,
1222    /// leaving the metadata untouched.
1223    #[must_use]
1224    #[inline(always)]
1225    #[stable(feature = "pointer_byte_offsets", since = "1.75.0")]
1226    #[rustc_const_stable(feature = "const_pointer_byte_offsets", since = "1.75.0")]
1227    pub const fn wrapping_byte_sub(self, count: usize) -> Self {
1228        self.cast::<u8>().wrapping_sub(count).with_metadata_of(self)
1229    }
1230
1231    /// Reads the value from `self` without moving it. This leaves the
1232    /// memory in `self` unchanged.
1233    ///
1234    /// See [`ptr::read`] for safety concerns and examples.
1235    ///
1236    /// [`ptr::read`]: crate::ptr::read()
1237    #[stable(feature = "pointer_methods", since = "1.26.0")]
1238    #[rustc_const_stable(feature = "const_ptr_read", since = "1.71.0")]
1239    #[inline(always)]
1240    #[track_caller]
1241    pub const unsafe fn read(self) -> T
1242    where
1243        T: Sized,
1244    {
1245        // SAFETY: the caller must uphold the safety contract for ``.
1246        unsafe { read(self) }
1247    }
1248
1249    /// Performs a volatile read of the value from `self` without moving it. This
1250    /// leaves the memory in `self` unchanged.
1251    ///
1252    /// Volatile operations are intended to act on I/O memory, and are guaranteed
1253    /// to not be elided or reordered by the compiler across other volatile
1254    /// operations.
1255    ///
1256    /// See [`ptr::read_volatile`] for safety concerns and examples.
1257    ///
1258    /// [`ptr::read_volatile`]: crate::ptr::read_volatile()
1259    #[stable(feature = "pointer_methods", since = "1.26.0")]
1260    #[rustc_const_unstable(feature = "const_volatile", issue = "159094")]
1261    #[inline(always)]
1262    #[track_caller]
1263    pub const unsafe fn read_volatile(self) -> T
1264    where
1265        T: Sized,
1266    {
1267        // SAFETY: the caller must uphold the safety contract for `read_volatile`.
1268        unsafe { read_volatile(self) }
1269    }
1270
1271    /// Reads the value from `self` without moving it. This leaves the
1272    /// memory in `self` unchanged.
1273    ///
1274    /// Unlike `read`, the pointer may be unaligned.
1275    ///
1276    /// See [`ptr::read_unaligned`] for safety concerns and examples.
1277    ///
1278    /// [`ptr::read_unaligned`]: crate::ptr::read_unaligned()
1279    #[stable(feature = "pointer_methods", since = "1.26.0")]
1280    #[rustc_const_stable(feature = "const_ptr_read", since = "1.71.0")]
1281    #[inline(always)]
1282    #[track_caller]
1283    pub const unsafe fn read_unaligned(self) -> T
1284    where
1285        T: Sized,
1286    {
1287        // SAFETY: the caller must uphold the safety contract for `read_unaligned`.
1288        unsafe { read_unaligned(self) }
1289    }
1290
1291    /// Copies `count * size_of::<T>()` bytes from `self` to `dest`. The source
1292    /// and destination may overlap.
1293    ///
1294    /// NOTE: this has the *same* argument order as [`ptr::copy`].
1295    ///
1296    /// See [`ptr::copy`] for safety concerns and examples.
1297    ///
1298    /// [`ptr::copy`]: crate::ptr::copy()
1299    #[rustc_const_stable(feature = "const_intrinsic_copy", since = "1.83.0")]
1300    #[stable(feature = "pointer_methods", since = "1.26.0")]
1301    #[inline(always)]
1302    #[track_caller]
1303    pub const unsafe fn copy_to(self, dest: *mut T, count: usize)
1304    where
1305        T: Sized,
1306    {
1307        // SAFETY: the caller must uphold the safety contract for `copy`.
1308        unsafe { copy(self, dest, count) }
1309    }
1310
1311    /// Copies `count * size_of::<T>()` bytes from `self` to `dest`. The source
1312    /// and destination may *not* overlap.
1313    ///
1314    /// NOTE: this has the *same* argument order as [`ptr::copy_nonoverlapping`].
1315    ///
1316    /// See [`ptr::copy_nonoverlapping`] for safety concerns and examples.
1317    ///
1318    /// [`ptr::copy_nonoverlapping`]: crate::ptr::copy_nonoverlapping()
1319    #[rustc_const_stable(feature = "const_intrinsic_copy", since = "1.83.0")]
1320    #[stable(feature = "pointer_methods", since = "1.26.0")]
1321    #[inline(always)]
1322    #[track_caller]
1323    pub const unsafe fn copy_to_nonoverlapping(self, dest: *mut T, count: usize)
1324    where
1325        T: Sized,
1326    {
1327        // SAFETY: the caller must uphold the safety contract for `copy_nonoverlapping`.
1328        unsafe { copy_nonoverlapping(self, dest, count) }
1329    }
1330
1331    /// Copies `count * size_of::<T>()` bytes from `src` to `self`. The source
1332    /// and destination may overlap.
1333    ///
1334    /// NOTE: this has the *opposite* argument order of [`ptr::copy`].
1335    ///
1336    /// See [`ptr::copy`] for safety concerns and examples.
1337    ///
1338    /// [`ptr::copy`]: crate::ptr::copy()
1339    #[rustc_const_stable(feature = "const_intrinsic_copy", since = "1.83.0")]
1340    #[stable(feature = "pointer_methods", since = "1.26.0")]
1341    #[inline(always)]
1342    #[track_caller]
1343    pub const unsafe fn copy_from(self, src: *const T, count: usize)
1344    where
1345        T: Sized,
1346    {
1347        // SAFETY: the caller must uphold the safety contract for `copy`.
1348        unsafe { copy(src, self, count) }
1349    }
1350
1351    /// Copies `count * size_of::<T>()` bytes from `src` to `self`. The source
1352    /// and destination may *not* overlap.
1353    ///
1354    /// NOTE: this has the *opposite* argument order of [`ptr::copy_nonoverlapping`].
1355    ///
1356    /// See [`ptr::copy_nonoverlapping`] for safety concerns and examples.
1357    ///
1358    /// [`ptr::copy_nonoverlapping`]: crate::ptr::copy_nonoverlapping()
1359    #[rustc_const_stable(feature = "const_intrinsic_copy", since = "1.83.0")]
1360    #[stable(feature = "pointer_methods", since = "1.26.0")]
1361    #[inline(always)]
1362    #[track_caller]
1363    pub const unsafe fn copy_from_nonoverlapping(self, src: *const T, count: usize)
1364    where
1365        T: Sized,
1366    {
1367        // SAFETY: the caller must uphold the safety contract for `copy_nonoverlapping`.
1368        unsafe { copy_nonoverlapping(src, self, count) }
1369    }
1370
1371    /// Executes the destructor (if any) of the pointed-to value.
1372    ///
1373    /// See [`ptr::drop_in_place`] for safety concerns and examples.
1374    ///
1375    /// [`ptr::drop_in_place`]: crate::ptr::drop_in_place()
1376    #[stable(feature = "pointer_methods", since = "1.26.0")]
1377    #[rustc_const_unstable(feature = "const_drop_in_place", issue = "109342")]
1378    #[inline(always)]
1379    pub const unsafe fn drop_in_place(self)
1380    where
1381        T: [const] Destruct,
1382    {
1383        // SAFETY: the caller must uphold the safety contract for `drop_in_place`.
1384        unsafe { drop_in_place(self) }
1385    }
1386
1387    /// Overwrites a memory location with the given value without reading or
1388    /// dropping the old value.
1389    ///
1390    /// See [`ptr::write`] for safety concerns and examples.
1391    ///
1392    /// [`ptr::write`]: crate::ptr::write()
1393    #[stable(feature = "pointer_methods", since = "1.26.0")]
1394    #[rustc_const_stable(feature = "const_ptr_write", since = "1.83.0")]
1395    #[inline(always)]
1396    #[track_caller]
1397    pub const unsafe fn write(self, val: T)
1398    where
1399        T: Sized,
1400    {
1401        // SAFETY: the caller must uphold the safety contract for `write`.
1402        unsafe { write(self, val) }
1403    }
1404
1405    /// Invokes memset on the specified pointer, setting `count * size_of::<T>()`
1406    /// bytes of memory starting at `self` to `val`.
1407    ///
1408    /// See [`ptr::write_bytes`] for safety concerns and examples.
1409    ///
1410    /// [`ptr::write_bytes`]: crate::ptr::write_bytes()
1411    #[doc(alias = "memset")]
1412    #[stable(feature = "pointer_methods", since = "1.26.0")]
1413    #[rustc_const_stable(feature = "const_ptr_write", since = "1.83.0")]
1414    #[inline(always)]
1415    #[track_caller]
1416    pub const unsafe fn write_bytes(self, val: u8, count: usize)
1417    where
1418        T: Sized,
1419    {
1420        // SAFETY: the caller must uphold the safety contract for `write_bytes`.
1421        unsafe { write_bytes(self, val, count) }
1422    }
1423
1424    /// Performs a volatile write of a memory location with the given value without
1425    /// reading or dropping the old value.
1426    ///
1427    /// Volatile operations are intended to act on I/O memory, and are guaranteed
1428    /// to not be elided or reordered by the compiler across other volatile
1429    /// operations.
1430    ///
1431    /// See [`ptr::write_volatile`] for safety concerns and examples.
1432    ///
1433    /// [`ptr::write_volatile`]: crate::ptr::write_volatile()
1434    #[stable(feature = "pointer_methods", since = "1.26.0")]
1435    #[rustc_const_unstable(feature = "const_volatile", issue = "159094")]
1436    #[inline(always)]
1437    #[track_caller]
1438    pub const unsafe fn write_volatile(self, val: T)
1439    where
1440        T: Sized,
1441    {
1442        // SAFETY: the caller must uphold the safety contract for `write_volatile`.
1443        unsafe { write_volatile(self, val) }
1444    }
1445
1446    /// Overwrites a memory location with the given value without reading or
1447    /// dropping the old value.
1448    ///
1449    /// Unlike `write`, the pointer may be unaligned.
1450    ///
1451    /// See [`ptr::write_unaligned`] for safety concerns and examples.
1452    ///
1453    /// [`ptr::write_unaligned`]: crate::ptr::write_unaligned()
1454    #[stable(feature = "pointer_methods", since = "1.26.0")]
1455    #[rustc_const_stable(feature = "const_ptr_write", since = "1.83.0")]
1456    #[inline(always)]
1457    #[track_caller]
1458    pub const unsafe fn write_unaligned(self, val: T)
1459    where
1460        T: Sized,
1461    {
1462        // SAFETY: the caller must uphold the safety contract for `write_unaligned`.
1463        unsafe { write_unaligned(self, val) }
1464    }
1465
1466    /// Replaces the value at `self` with `src`, returning the old
1467    /// value, without dropping either.
1468    ///
1469    /// See [`ptr::replace`] for safety concerns and examples.
1470    ///
1471    /// [`ptr::replace`]: crate::ptr::replace()
1472    #[stable(feature = "pointer_methods", since = "1.26.0")]
1473    #[rustc_const_stable(feature = "const_inherent_ptr_replace", since = "1.88.0")]
1474    #[inline(always)]
1475    pub const unsafe fn replace(self, src: T) -> T
1476    where
1477        T: Sized,
1478    {
1479        // SAFETY: the caller must uphold the safety contract for `replace`.
1480        unsafe { replace(self, src) }
1481    }
1482
1483    /// Swaps the values at two mutable locations of the same type, without
1484    /// deinitializing either. They may overlap, unlike `mem::swap` which is
1485    /// otherwise equivalent.
1486    ///
1487    /// See [`ptr::swap`] for safety concerns and examples.
1488    ///
1489    /// [`ptr::swap`]: crate::ptr::swap()
1490    #[stable(feature = "pointer_methods", since = "1.26.0")]
1491    #[rustc_const_stable(feature = "const_swap", since = "1.85.0")]
1492    #[inline(always)]
1493    pub const unsafe fn swap(self, with: *mut T)
1494    where
1495        T: Sized,
1496    {
1497        // SAFETY: the caller must uphold the safety contract for `swap`.
1498        unsafe { swap(self, with) }
1499    }
1500
1501    /// Computes the offset that needs to be applied to the pointer in order to make it aligned to
1502    /// `align`.
1503    ///
1504    /// If it is not possible to align the pointer, the implementation returns
1505    /// `usize::MAX`.
1506    ///
1507    /// The offset is expressed in number of `T` elements, and not bytes. The value returned can be
1508    /// used with the `wrapping_add` method.
1509    ///
1510    /// There are no guarantees whatsoever that offsetting the pointer will not overflow or go
1511    /// beyond the allocation that the pointer points into. It is up to the caller to ensure that
1512    /// the returned offset is correct in all terms other than alignment.
1513    ///
1514    /// # Panics
1515    ///
1516    /// The function panics if `align` is not a power-of-two.
1517    ///
1518    /// # Examples
1519    ///
1520    /// Accessing adjacent `u8` as `u16`
1521    ///
1522    /// ```
1523    /// # unsafe {
1524    /// let mut x = [5_u8, 6, 7, 8, 9];
1525    /// let ptr = x.as_mut_ptr();
1526    /// let offset = ptr.align_offset(align_of::<u16>());
1527    ///
1528    /// if offset < x.len() - 1 {
1529    ///     let u16_ptr = ptr.add(offset).cast::<u16>();
1530    ///     *u16_ptr = 0;
1531    ///
1532    ///     assert!(x == [0, 0, 7, 8, 9] || x == [5, 0, 0, 8, 9]);
1533    /// } else {
1534    ///     // while the pointer can be aligned via `offset`, it would point
1535    ///     // outside the allocation
1536    /// }
1537    /// # }
1538    /// ```
1539    #[must_use]
1540    #[inline]
1541    #[stable(feature = "align_offset", since = "1.36.0")]
1542    pub fn align_offset(self, align: usize) -> usize
1543    where
1544        T: Sized,
1545    {
1546        if !align.is_power_of_two() {
1547            {
    crate::panicking::panic_fmt(format_args!("align_offset: align is not a power-of-two"));
};panic!("align_offset: align is not a power-of-two");
1548        }
1549
1550        // SAFETY: `align` has been checked to be a power of 2 above
1551        let ret = unsafe { align_offset(self, align) };
1552
1553        // Inform Miri that we want to consider the resulting pointer to be suitably aligned.
1554        #[cfg(miri)]
1555        if ret != usize::MAX {
1556            intrinsics::miri_promise_symbolic_alignment(
1557                self.wrapping_add(ret).cast_const().cast(),
1558                align,
1559            );
1560        }
1561
1562        ret
1563    }
1564
1565    /// Returns whether the pointer is properly aligned for `T`.
1566    ///
1567    /// # Examples
1568    ///
1569    /// ```
1570    /// // On some platforms, the alignment of i32 is less than 4.
1571    /// #[repr(align(4))]
1572    /// struct AlignedI32(i32);
1573    ///
1574    /// let mut data = AlignedI32(42);
1575    /// let ptr = &mut data as *mut AlignedI32;
1576    ///
1577    /// assert!(ptr.is_aligned());
1578    /// assert!(!ptr.wrapping_byte_add(1).is_aligned());
1579    /// ```
1580    #[must_use]
1581    #[inline]
1582    #[stable(feature = "pointer_is_aligned", since = "1.79.0")]
1583    pub fn is_aligned(self) -> bool
1584    where
1585        T: Sized,
1586    {
1587        self.is_aligned_to(align_of::<T>())
1588    }
1589
1590    /// Returns whether the pointer is aligned to `align`.
1591    ///
1592    /// For non-`Sized` pointees this operation considers only the data pointer,
1593    /// ignoring the metadata.
1594    ///
1595    /// # Panics
1596    ///
1597    /// The function panics if `align` is not a power-of-two (this includes 0).
1598    ///
1599    /// # Examples
1600    ///
1601    /// ```
1602    /// #![feature(pointer_is_aligned_to)]
1603    ///
1604    /// // On some platforms, the alignment of i32 is less than 4.
1605    /// #[repr(align(4))]
1606    /// struct AlignedI32(i32);
1607    ///
1608    /// let mut data = AlignedI32(42);
1609    /// let ptr = &mut data as *mut AlignedI32;
1610    ///
1611    /// assert!(ptr.is_aligned_to(1));
1612    /// assert!(ptr.is_aligned_to(2));
1613    /// assert!(ptr.is_aligned_to(4));
1614    ///
1615    /// assert!(ptr.wrapping_byte_add(2).is_aligned_to(2));
1616    /// assert!(!ptr.wrapping_byte_add(2).is_aligned_to(4));
1617    ///
1618    /// assert_ne!(ptr.is_aligned_to(8), ptr.wrapping_add(1).is_aligned_to(8));
1619    /// ```
1620    #[must_use]
1621    #[inline]
1622    #[unstable(feature = "pointer_is_aligned_to", issue = "96284")]
1623    pub fn is_aligned_to(self, align: usize) -> bool {
1624        if !align.is_power_of_two() {
1625            {
    crate::panicking::panic_fmt(format_args!("is_aligned_to: align is not a power-of-two"));
};panic!("is_aligned_to: align is not a power-of-two");
1626        }
1627
1628        self.addr() & (align - 1) == 0
1629    }
1630}
1631
1632impl<T> *mut T {
1633    /// Casts from a type to its maybe-uninitialized version.
1634    ///
1635    /// This is always safe, since UB can only occur if the pointer is read
1636    /// before being initialized.
1637    #[must_use]
1638    #[inline(always)]
1639    #[unstable(feature = "cast_maybe_uninit", issue = "145036")]
1640    pub const fn cast_uninit(self) -> *mut MaybeUninit<T> {
1641        self as _
1642    }
1643
1644    /// Forms a raw mutable slice from a pointer and a length.
1645    ///
1646    /// The `len` argument is the number of **elements**, not the number of bytes.
1647    ///
1648    /// Performs the same functionality as [`cast_slice`] on a `*const T`, except that a
1649    /// raw mutable slice is returned, as opposed to a raw immutable slice.
1650    ///
1651    /// This function is safe, but actually using the return value is unsafe.
1652    /// See the documentation of [`slice::from_raw_parts_mut`] for slice safety requirements.
1653    ///
1654    /// [`slice::from_raw_parts_mut`]: crate::slice::from_raw_parts_mut
1655    /// [`cast_slice`]: pointer::cast_slice
1656    ///
1657    /// # Examples
1658    ///
1659    /// ```rust
1660    /// #![feature(ptr_cast_slice)]
1661    ///
1662    /// let x = &mut [5, 6, 7];
1663    /// let raw_mut_slice = x.as_mut_ptr().cast_slice(3);
1664    ///
1665    /// unsafe {
1666    ///     (*raw_mut_slice)[2] = 99; // assign a value at an index in the slice
1667    /// };
1668    ///
1669    /// assert_eq!(unsafe { &*raw_mut_slice }[2], 99);
1670    /// ```
1671    ///
1672    /// You must ensure that the pointer is valid and not null before dereferencing
1673    /// the raw slice. A slice reference must never have a null pointer, even if it's empty.
1674    ///
1675    /// ```rust,should_panic
1676    /// #![feature(ptr_cast_slice)]
1677    /// use std::ptr;
1678    /// let danger: *mut [u8] = ptr::null_mut::<u8>().cast_slice(0);
1679    /// unsafe {
1680    ///     danger.as_mut().expect("references must not be null");
1681    /// }
1682    /// ```
1683    #[inline]
1684    #[unstable(feature = "ptr_cast_slice", issue = "149103")]
1685    pub const fn cast_slice(self, len: usize) -> *mut [T] {
1686        slice_from_raw_parts_mut(self, len)
1687    }
1688}
1689
1690impl<T> *mut MaybeUninit<T> {
1691    /// Casts from a maybe-uninitialized type to its initialized version.
1692    ///
1693    /// This is always safe, since UB can only occur if the pointer is read
1694    /// before being initialized.
1695    #[must_use]
1696    #[inline(always)]
1697    #[unstable(feature = "cast_maybe_uninit", issue = "145036")]
1698    pub const fn cast_init(self) -> *mut T {
1699        self as _
1700    }
1701}
1702
1703impl<T> *mut [T] {
1704    /// Returns the length of a raw slice.
1705    ///
1706    /// The returned value is the number of **elements**, not the number of bytes.
1707    ///
1708    /// This function is safe, even when the raw slice cannot be cast to a slice
1709    /// reference because the pointer is null or unaligned.
1710    ///
1711    /// # Examples
1712    ///
1713    /// ```rust
1714    /// use std::ptr;
1715    ///
1716    /// let slice: *mut [i8] = ptr::slice_from_raw_parts_mut(ptr::null_mut(), 3);
1717    /// assert_eq!(slice.len(), 3);
1718    /// ```
1719    #[inline(always)]
1720    #[stable(feature = "slice_ptr_len", since = "1.79.0")]
1721    #[rustc_const_stable(feature = "const_slice_ptr_len", since = "1.79.0")]
1722    pub const fn len(self) -> usize {
1723        metadata(self)
1724    }
1725
1726    /// Returns `true` if the raw slice has a length of 0.
1727    ///
1728    /// # Examples
1729    ///
1730    /// ```
1731    /// use std::ptr;
1732    ///
1733    /// let slice: *mut [i8] = ptr::slice_from_raw_parts_mut(ptr::null_mut(), 3);
1734    /// assert!(!slice.is_empty());
1735    /// ```
1736    #[inline(always)]
1737    #[stable(feature = "slice_ptr_len", since = "1.79.0")]
1738    #[rustc_const_stable(feature = "const_slice_ptr_len", since = "1.79.0")]
1739    pub const fn is_empty(self) -> bool {
1740        self.len() == 0
1741    }
1742
1743    /// Gets a raw, mutable pointer to the underlying array.
1744    ///
1745    /// If `N` is not exactly equal to the length of `self`, then this method returns `None`.
1746    #[stable(feature = "core_slice_as_array", since = "1.93.0")]
1747    #[rustc_const_stable(feature = "core_slice_as_array", since = "1.93.0")]
1748    #[inline]
1749    #[must_use]
1750    pub const fn as_mut_array<const N: usize>(self) -> Option<*mut [T; N]> {
1751        if self.len() == N {
1752            let me = self.as_mut_ptr() as *mut [T; N];
1753            Some(me)
1754        } else {
1755            None
1756        }
1757    }
1758
1759    /// Divides one mutable raw slice into two at an index.
1760    ///
1761    /// The first will contain all indices from `[0, mid)` (excluding
1762    /// the index `mid` itself) and the second will contain all
1763    /// indices from `[mid, len)` (excluding the index `len` itself).
1764    ///
1765    /// # Panics
1766    ///
1767    /// Panics if `mid > len`.
1768    ///
1769    /// # Safety
1770    ///
1771    /// `mid` must be [in-bounds] of the underlying [allocation].
1772    /// Which means `self` must be dereferenceable and span a single allocation
1773    /// that is at least `mid * size_of::<T>()` bytes long. Not upholding these
1774    /// requirements is *[undefined behavior]* even if the resulting pointers are not used.
1775    ///
1776    /// Since `len` being in-bounds is not a safety invariant of `*mut [T]` the
1777    /// safety requirements of this method are the same as for [`split_at_mut_unchecked`].
1778    /// The explicit bounds check is only as useful as `len` is correct.
1779    ///
1780    /// [`split_at_mut_unchecked`]: #method.split_at_mut_unchecked
1781    /// [in-bounds]: #method.add
1782    /// [allocation]: crate::ptr#allocation
1783    /// [undefined behavior]: https://doc.rust-lang.org/reference/behavior-considered-undefined.html
1784    ///
1785    /// # Examples
1786    ///
1787    /// ```
1788    /// #![feature(raw_slice_split)]
1789    ///
1790    /// let mut v = [1, 0, 3, 0, 5, 6];
1791    /// let ptr = &mut v as *mut [_];
1792    /// unsafe {
1793    ///     let (left, right) = ptr.split_at_mut(2);
1794    ///     assert_eq!(&*left, [1, 0]);
1795    ///     assert_eq!(&*right, [3, 0, 5, 6]);
1796    /// }
1797    /// ```
1798    #[inline(always)]
1799    #[track_caller]
1800    #[unstable(feature = "raw_slice_split", issue = "95595")]
1801    pub unsafe fn split_at_mut(self, mid: usize) -> (*mut [T], *mut [T]) {
1802        if !(mid <= self.len()) {
    crate::panicking::panic("assertion failed: mid <= self.len()")
};assert!(mid <= self.len());
1803        // SAFETY: The assert above is only a safety-net as long as `self.len()` is correct
1804        // The actual safety requirements of this function are the same as for `split_at_mut_unchecked`
1805        unsafe { self.split_at_mut_unchecked(mid) }
1806    }
1807
1808    /// Divides one mutable raw slice into two at an index, without doing bounds checking.
1809    ///
1810    /// The first will contain all indices from `[0, mid)` (excluding
1811    /// the index `mid` itself) and the second will contain all
1812    /// indices from `[mid, len)` (excluding the index `len` itself).
1813    ///
1814    /// # Safety
1815    ///
1816    /// `mid` must be [in-bounds] of the underlying [allocation].
1817    /// Which means `self` must be dereferenceable and span a single allocation
1818    /// that is at least `mid * size_of::<T>()` bytes long. Not upholding these
1819    /// requirements is *[undefined behavior]* even if the resulting pointers are not used.
1820    ///
1821    /// [in-bounds]: #method.add
1822    /// [out-of-bounds index]: #method.add
1823    /// [allocation]: crate::ptr#allocation
1824    /// [undefined behavior]: https://doc.rust-lang.org/reference/behavior-considered-undefined.html
1825    ///
1826    /// # Examples
1827    ///
1828    /// ```
1829    /// #![feature(raw_slice_split)]
1830    ///
1831    /// let mut v = [1, 0, 3, 0, 5, 6];
1832    /// // scoped to restrict the lifetime of the borrows
1833    /// unsafe {
1834    ///     let ptr = &mut v as *mut [_];
1835    ///     let (left, right) = ptr.split_at_mut_unchecked(2);
1836    ///     assert_eq!(&*left, [1, 0]);
1837    ///     assert_eq!(&*right, [3, 0, 5, 6]);
1838    ///     (&mut *left)[1] = 2;
1839    ///     (&mut *right)[1] = 4;
1840    /// }
1841    /// assert_eq!(v, [1, 2, 3, 4, 5, 6]);
1842    /// ```
1843    #[inline(always)]
1844    #[unstable(feature = "raw_slice_split", issue = "95595")]
1845    pub unsafe fn split_at_mut_unchecked(self, mid: usize) -> (*mut [T], *mut [T]) {
1846        let len = self.len();
1847        let ptr = self.as_mut_ptr();
1848
1849        // SAFETY: Caller must pass a valid pointer and an index that is in-bounds.
1850        let tail = unsafe { ptr.add(mid) };
1851        (
1852            crate::ptr::slice_from_raw_parts_mut(ptr, mid),
1853            crate::ptr::slice_from_raw_parts_mut(tail, len - mid),
1854        )
1855    }
1856
1857    /// Returns a raw pointer to the slice's buffer.
1858    ///
1859    /// This is equivalent to casting `self` to `*mut T`, but more type-safe.
1860    ///
1861    /// # Examples
1862    ///
1863    /// ```rust
1864    /// #![feature(slice_ptr_get)]
1865    /// use std::ptr;
1866    ///
1867    /// let slice: *mut [i8] = ptr::slice_from_raw_parts_mut(ptr::null_mut(), 3);
1868    /// assert_eq!(slice.as_mut_ptr(), ptr::null_mut());
1869    /// ```
1870    #[inline(always)]
1871    #[unstable(feature = "slice_ptr_get", issue = "74265")]
1872    pub const fn as_mut_ptr(self) -> *mut T {
1873        self as *mut T
1874    }
1875
1876    /// Returns a raw pointer to an element or subslice, without doing bounds
1877    /// checking.
1878    ///
1879    /// Calling this method with an [out-of-bounds index] or when `self` is not dereferenceable
1880    /// is *[undefined behavior]* even if the resulting pointer is not used.
1881    ///
1882    /// [out-of-bounds index]: #method.add
1883    /// [undefined behavior]: https://doc.rust-lang.org/reference/behavior-considered-undefined.html
1884    ///
1885    /// # Examples
1886    ///
1887    /// ```
1888    /// #![feature(slice_ptr_get)]
1889    ///
1890    /// let x = &mut [1, 2, 4] as *mut [i32];
1891    ///
1892    /// unsafe {
1893    ///     assert_eq!(x.get_unchecked_mut(1), x.as_mut_ptr().add(1));
1894    /// }
1895    /// ```
1896    #[unstable(feature = "slice_ptr_get", issue = "74265")]
1897    #[rustc_const_unstable(feature = "const_index", issue = "143775")]
1898    #[inline(always)]
1899    pub const unsafe fn get_unchecked_mut<I>(self, index: I) -> *mut I::Output
1900    where
1901        I: [const] SliceIndex<[T]>,
1902    {
1903        // SAFETY: the caller ensures that `self` is dereferenceable and `index` in-bounds.
1904        unsafe { index.get_unchecked_mut(self) }
1905    }
1906
1907    #[doc = "Returns `None` if the pointer is null, or else returns a shared slice to\nthe value wrapped in `Some`. In contrast to [`as_ref`], this does not require\nthat the value has to be initialized.\n\n[`as_ref`]: #method.as_ref\n\n# Safety\n\nWhen calling this method, you have to ensure that *either* the pointer is null *or*\nall of the following is true:\n\n* The pointer must be [valid] for reads for `ptr.len() * size_of::<T>()` many bytes,\n  and it must be properly aligned. This means in particular:\n\n* The entire memory range of this slice must be contained within a single [allocation]!\n  Slices can never span across multiple allocations.\n\n* The pointer must be aligned even for zero-length slices. One\n  reason for this is that enum layout optimizations may rely on references\n  (including slices of any length) being aligned and non-null to distinguish\n  them from other data. You can obtain a pointer that is usable as `data`\n  for zero-length slices using [`NonNull::dangling()`].\n\n* The total size `ptr.len() * size_of::<T>()` of the slice must be no larger than `isize::MAX`.\n  See the safety documentation of [`pointer::offset`].\n\n* You must enforce Rust\'s aliasing rules, since the returned lifetime `\'a` is\n  arbitrarily chosen and does not necessarily reflect the actual lifetime of the data.\n  In particular, while this reference exists, the memory the pointer points to must\n  not get mutated (except inside `UnsafeCell`).\n\nThis applies even if the result of this method is unused!\n\nSee also [`slice::from_raw_parts`][].\n\n[valid]: crate::ptr#safety\n[allocation]: crate::ptr#allocation\n\n# Panics during const evaluation\n\nThis method will panic during const evaluation if the pointer cannot be\ndetermined to be null or not. See [`is_null`] for more information.\n\n[`is_null`]: #method.is_null\n"include_str!("docs/as_uninit_slice.md")]
1908    ///
1909    /// # See Also
1910    /// For the mutable counterpart see [`as_uninit_slice_mut`](pointer::as_uninit_slice_mut).
1911    #[inline]
1912    #[unstable(feature = "ptr_as_uninit", issue = "75402")]
1913    pub const unsafe fn as_uninit_slice<'a>(self) -> Option<&'a [MaybeUninit<T>]> {
1914        if self.is_null() {
1915            None
1916        } else {
1917            // SAFETY: the caller must uphold the safety contract for `as_uninit_slice`.
1918            Some(unsafe { slice::from_raw_parts(self as *const MaybeUninit<T>, self.len()) })
1919        }
1920    }
1921
1922    /// Returns `None` if the pointer is null, or else returns a unique slice to
1923    /// the value wrapped in `Some`. In contrast to [`as_mut`], this does not require
1924    /// that the value has to be initialized.
1925    ///
1926    /// For the shared counterpart see [`as_uninit_slice`].
1927    ///
1928    /// [`as_mut`]: #method.as_mut
1929    /// [`as_uninit_slice`]: #method.as_uninit_slice-1
1930    ///
1931    /// # Safety
1932    ///
1933    /// When calling this method, you have to ensure that *either* the pointer is null *or*
1934    /// all of the following is true:
1935    ///
1936    /// * The pointer must be [valid] for reads and writes for `ptr.len() * size_of::<T>()`
1937    ///   many bytes, and it must be properly aligned. This means in particular:
1938    ///
1939    ///     * The entire memory range of this slice must be contained within a single [allocation]!
1940    ///       Slices can never span across multiple allocations.
1941    ///
1942    ///     * The pointer must be aligned even for zero-length slices. One
1943    ///       reason for this is that enum layout optimizations may rely on references
1944    ///       (including slices of any length) being aligned and non-null to distinguish
1945    ///       them from other data. You can obtain a pointer that is usable as `data`
1946    ///       for zero-length slices using [`NonNull::dangling()`].
1947    ///
1948    /// * The total size `ptr.len() * size_of::<T>()` of the slice must be no larger than `isize::MAX`.
1949    ///   See the safety documentation of [`pointer::offset`].
1950    ///
1951    /// * You must enforce Rust's aliasing rules, since the returned lifetime `'a` is
1952    ///   arbitrarily chosen and does not necessarily reflect the actual lifetime of the data.
1953    ///   In particular, while this reference exists, the memory the pointer points to must
1954    ///   not get accessed (read or written) through any other pointer.
1955    ///
1956    /// This applies even if the result of this method is unused!
1957    ///
1958    /// See also [`slice::from_raw_parts_mut`][].
1959    ///
1960    /// [valid]: crate::ptr#safety
1961    /// [allocation]: crate::ptr#allocation
1962    ///
1963    /// # Panics during const evaluation
1964    ///
1965    /// This method will panic during const evaluation if the pointer cannot be
1966    /// determined to be null or not. See [`is_null`] for more information.
1967    ///
1968    /// [`is_null`]: #method.is_null-1
1969    #[inline]
1970    #[unstable(feature = "ptr_as_uninit", issue = "75402")]
1971    pub const unsafe fn as_uninit_slice_mut<'a>(self) -> Option<&'a mut [MaybeUninit<T>]> {
1972        if self.is_null() {
1973            None
1974        } else {
1975            // SAFETY: the caller must uphold the safety contract for `as_uninit_slice_mut`.
1976            Some(unsafe { slice::from_raw_parts_mut(self as *mut MaybeUninit<T>, self.len()) })
1977        }
1978    }
1979}
1980
1981impl<T> *mut T {
1982    /// Casts from a pointer-to-`T` to a pointer-to-`[T; N]`.
1983    #[inline]
1984    #[unstable(feature = "ptr_cast_array", issue = "144514")]
1985    pub const fn cast_array<const N: usize>(self) -> *mut [T; N] {
1986        self.cast()
1987    }
1988}
1989
1990impl<T, const N: usize> *mut [T; N] {
1991    /// Returns a raw pointer to the array's buffer.
1992    ///
1993    /// This is equivalent to casting `self` to `*mut T`, but more type-safe.
1994    ///
1995    /// # Examples
1996    ///
1997    /// ```rust
1998    /// #![feature(array_ptr_get)]
1999    /// use std::ptr;
2000    ///
2001    /// let arr: *mut [i8; 3] = ptr::null_mut();
2002    /// assert_eq!(arr.as_mut_ptr(), ptr::null_mut());
2003    /// ```
2004    #[inline]
2005    #[unstable(feature = "array_ptr_get", issue = "119834")]
2006    pub const fn as_mut_ptr(self) -> *mut T {
2007        self as *mut T
2008    }
2009
2010    /// Returns a raw pointer to a mutable slice containing the entire array.
2011    ///
2012    /// # Examples
2013    ///
2014    /// ```
2015    /// #![feature(array_ptr_get)]
2016    ///
2017    /// let mut arr = [1, 2, 5];
2018    /// let ptr: *mut [i32; 3] = &mut arr;
2019    /// unsafe {
2020    ///     (&mut *ptr.as_mut_slice())[..2].copy_from_slice(&[3, 4]);
2021    /// }
2022    /// assert_eq!(arr, [3, 4, 5]);
2023    /// ```
2024    #[inline]
2025    #[unstable(feature = "array_ptr_get", issue = "119834")]
2026    pub const fn as_mut_slice(self) -> *mut [T] {
2027        self
2028    }
2029}
2030
2031/// Pointer equality is by address, as produced by the [`<*mut T>::addr`](pointer::addr) method.
2032#[stable(feature = "rust1", since = "1.0.0")]
2033#[diagnostic::on_const(
2034    message = "pointers cannot be reliably compared during const eval",
2035    note = "see issue #53020 <https://github.com/rust-lang/rust/issues/53020> for more information"
2036)]
2037impl<T: PointeeSized> PartialEq for *mut T {
2038    #[inline(always)]
2039    #[allow(ambiguous_wide_pointer_comparisons)]
2040    fn eq(&self, other: &*mut T) -> bool {
2041        *self == *other
2042    }
2043}
2044
2045/// Pointer equality is an equivalence relation.
2046#[stable(feature = "rust1", since = "1.0.0")]
2047#[diagnostic::on_const(
2048    message = "pointers cannot be reliably compared during const eval",
2049    note = "see issue #53020 <https://github.com/rust-lang/rust/issues/53020> for more information"
2050)]
2051impl<T: PointeeSized> Eq for *mut T {}
2052
2053/// Pointer comparison is by address, as produced by the [`<*mut T>::addr`](pointer::addr) method.
2054#[stable(feature = "rust1", since = "1.0.0")]
2055#[diagnostic::on_const(
2056    message = "pointers cannot be reliably compared during const eval",
2057    note = "see issue #53020 <https://github.com/rust-lang/rust/issues/53020> for more information"
2058)]
2059impl<T: PointeeSized> Ord for *mut T {
2060    #[inline]
2061    #[allow(ambiguous_wide_pointer_comparisons)]
2062    fn cmp(&self, other: &*mut T) -> Ordering {
2063        if self < other {
2064            Less
2065        } else if self == other {
2066            Equal
2067        } else {
2068            Greater
2069        }
2070    }
2071}
2072
2073/// Pointer comparison is by address, as produced by the [`<*mut T>::addr`](pointer::addr) method.
2074#[stable(feature = "rust1", since = "1.0.0")]
2075#[diagnostic::on_const(
2076    message = "pointers cannot be reliably compared during const eval",
2077    note = "see issue #53020 <https://github.com/rust-lang/rust/issues/53020> for more information"
2078)]
2079impl<T: PointeeSized> PartialOrd for *mut T {
2080    #[inline(always)]
2081    #[allow(ambiguous_wide_pointer_comparisons)]
2082    fn partial_cmp(&self, other: &*mut T) -> Option<Ordering> {
2083        Some(self.cmp(other))
2084    }
2085
2086    #[inline(always)]
2087    #[allow(ambiguous_wide_pointer_comparisons)]
2088    fn lt(&self, other: &*mut T) -> bool {
2089        *self < *other
2090    }
2091
2092    #[inline(always)]
2093    #[allow(ambiguous_wide_pointer_comparisons)]
2094    fn le(&self, other: &*mut T) -> bool {
2095        *self <= *other
2096    }
2097
2098    #[inline(always)]
2099    #[allow(ambiguous_wide_pointer_comparisons)]
2100    fn gt(&self, other: &*mut T) -> bool {
2101        *self > *other
2102    }
2103
2104    #[inline(always)]
2105    #[allow(ambiguous_wide_pointer_comparisons)]
2106    fn ge(&self, other: &*mut T) -> bool {
2107        *self >= *other
2108    }
2109}
2110
2111#[stable(feature = "raw_ptr_default", since = "1.88.0")]
2112impl<T: ?Sized + Thin> Default for *mut T {
2113    /// Returns the default value of [`null_mut()`][crate::ptr::null_mut].
2114    fn default() -> Self {
2115        crate::ptr::null_mut()
2116    }
2117}