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    /// let mut x = 0u64;
44    ///
45    /// let aligned: *mut u64 = &mut x;
46    /// let unaligned = unsafe { aligned.byte_add(1) };
47    ///
48    /// assert!(aligned.try_cast_aligned::<u32>().is_some());
49    /// assert!(unaligned.try_cast_aligned::<u32>().is_none());
50    /// ```
51    #[stable(feature = "pointer_try_cast_aligned", since = "CURRENT_RUSTC_VERSION")]
52    #[must_use = "this returns the result of the operation, \
53                  without modifying the original"]
54    #[inline]
55    pub fn try_cast_aligned<U>(self) -> Option<*mut U> {
56        if self.is_aligned_to(align_of::<U>()) { Some(self.cast()) } else { None }
57    }
58
59    /// Uses the address value in a new pointer of another type.
60    ///
61    /// This operation will ignore the address part of its `meta` operand and discard existing
62    /// metadata of `self`. For pointers to a sized types (thin pointers), this has the same effect
63    /// as a simple cast. For pointers to an unsized type (fat pointers) this recombines the address
64    /// with new metadata such as slice lengths or `dyn`-vtable.
65    ///
66    /// The resulting pointer will have provenance of `self`. This operation is semantically the
67    /// same as creating a new pointer with the data pointer value of `self` but the metadata of
68    /// `meta`, being fat or thin depending on the `meta` operand.
69    ///
70    /// # Examples
71    ///
72    /// This function is primarily useful for enabling pointer arithmetic on potentially fat
73    /// pointers. The pointer is cast to a sized pointee to utilize offset operations and then
74    /// recombined with its own original metadata.
75    ///
76    /// ```
77    /// #![feature(set_ptr_value)]
78    /// # use core::fmt::Debug;
79    /// let mut arr: [i32; 3] = [1, 2, 3];
80    /// let mut ptr = arr.as_mut_ptr() as *mut dyn Debug;
81    /// let thin = ptr as *mut u8;
82    /// unsafe {
83    ///     ptr = thin.add(8).with_metadata_of(ptr);
84    ///     # assert_eq!(*(ptr as *mut i32), 3);
85    ///     println!("{:?}", &*ptr); // will print "3"
86    /// }
87    /// ```
88    ///
89    /// # *Incorrect* usage
90    ///
91    /// The provenance from pointers is *not* combined. The result must only be used to refer to the
92    /// address allowed by `self`.
93    ///
94    /// ```rust,no_run
95    /// #![feature(set_ptr_value)]
96    /// let mut x = 0u32;
97    /// let mut y = 1u32;
98    ///
99    /// let x = (&mut x) as *mut u32;
100    /// let y = (&mut y) as *mut u32;
101    ///
102    /// let offset = (x as usize - y as usize) / 4;
103    /// let bad = x.wrapping_add(offset).with_metadata_of(y);
104    ///
105    /// // This dereference is UB. The pointer only has provenance for `x` but points to `y`.
106    /// println!("{:?}", unsafe { &*bad });
107    /// ```
108    #[unstable(feature = "set_ptr_value", issue = "75091")]
109    #[must_use = "returns a new pointer rather than modifying its argument"]
110    #[inline]
111    pub const fn with_metadata_of<U>(self, meta: *const U) -> *mut U
112    where
113        U: PointeeSized,
114    {
115        from_raw_parts_mut::<U>(self as *mut (), metadata(meta))
116    }
117
118    /// Changes constness without changing the type.
119    ///
120    /// This is a bit safer than `as` because it wouldn't silently change the type if the code is
121    /// refactored.
122    ///
123    /// While not strictly required (`*mut T` coerces to `*const T`), this is provided for symmetry
124    /// with [`cast_mut`] on `*const T` and may have documentation value if used instead of implicit
125    /// coercion.
126    ///
127    /// [`cast_mut`]: pointer::cast_mut
128    #[stable(feature = "ptr_const_cast", since = "1.65.0")]
129    #[rustc_const_stable(feature = "ptr_const_cast", since = "1.65.0")]
130    #[rustc_diagnostic_item = "ptr_cast_const"]
131    #[inline(always)]
132    pub const fn cast_const(self) -> *const T {
133        self as _
134    }
135
136    #[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")]
137    ///
138    /// [without_provenance]: without_provenance_mut
139    #[must_use]
140    #[inline(always)]
141    #[expect(clippy::transmutes_expressible_as_ptr_casts, reason = "implements pointer cast")]
142    #[stable(feature = "strict_provenance", since = "1.84.0")]
143    pub fn addr(self) -> usize {
144        // A pointer-to-integer transmute currently has exactly the right semantics: it returns the
145        // address without exposing the provenance. Note that this is *not* a stable guarantee about
146        // transmute semantics, it relies on sysroot crates having special status.
147        // SAFETY: Pointer-to-integer transmutes are valid (if you are okay with losing the
148        // provenance).
149        unsafe { mem::transmute(self.cast::<()>()) }
150    }
151
152    /// Exposes the ["provenance"][crate::ptr#provenance] part of the pointer for future use in
153    /// [`with_exposed_provenance_mut`] and returns the "address" portion.
154    ///
155    /// This is equivalent to `self as usize`, which semantically discards provenance information.
156    /// Furthermore, this (like the `as` cast) has the implicit side-effect of marking the
157    /// provenance as 'exposed', so on platforms that support it you can later call
158    /// [`with_exposed_provenance_mut`] to reconstitute the original pointer including its provenance.
159    ///
160    /// Due to its inherent ambiguity, [`with_exposed_provenance_mut`] may not be supported by tools
161    /// that help you to stay conformant with the Rust memory model. It is recommended to use
162    /// [Strict Provenance][crate::ptr#strict-provenance] APIs such as [`with_addr`][pointer::with_addr]
163    /// wherever possible, in which case [`addr`][pointer::addr] should be used instead of `expose_provenance`.
164    ///
165    /// On most platforms this will produce a value with the same bytes as the original pointer,
166    /// because all the bytes are dedicated to describing the address. Platforms which need to store
167    /// additional information in the pointer may not support this operation, since the 'expose'
168    /// side-effect which is required for [`with_exposed_provenance_mut`] to work is typically not
169    /// available.
170    ///
171    /// This is an [Exposed Provenance][crate::ptr#exposed-provenance] API.
172    ///
173    /// [`with_exposed_provenance_mut`]: with_exposed_provenance_mut
174    #[inline(always)]
175    #[stable(feature = "exposed_provenance", since = "1.84.0")]
176    #[expect(implicit_provenance_casts, reason = "this *is* the replacement")]
177    pub fn expose_provenance(self) -> usize {
178        self.cast::<()>() as usize
179    }
180
181    /// Creates a new pointer with the given address and the [provenance][crate::ptr#provenance] of
182    /// `self`.
183    ///
184    /// This is similar to a `addr as *mut T` cast, but copies
185    /// the *provenance* of `self` to the new pointer.
186    /// This avoids the inherent ambiguity of the unary cast.
187    ///
188    /// This is equivalent to using [`wrapping_offset`][pointer::wrapping_offset] to offset
189    /// `self` to the given address, and therefore has all the same capabilities and restrictions.
190    ///
191    /// This is a [Strict Provenance][crate::ptr#strict-provenance] API.
192    #[must_use]
193    #[inline]
194    #[stable(feature = "strict_provenance", since = "1.84.0")]
195    pub fn with_addr(self, addr: usize) -> Self {
196        // This should probably be an intrinsic to avoid doing any sort of arithmetic, but
197        // meanwhile, we can implement it with `wrapping_offset`, which preserves the pointer's
198        // provenance.
199        let self_addr = self.addr() as isize;
200        let dest_addr = addr as isize;
201        let offset = dest_addr.wrapping_sub(self_addr);
202        self.wrapping_byte_offset(offset)
203    }
204
205    /// Creates a new pointer by mapping `self`'s address to a new one, preserving the original
206    /// pointer's [provenance][crate::ptr#provenance].
207    ///
208    /// This is a convenience for [`with_addr`][pointer::with_addr], see that method for details.
209    ///
210    /// This is a [Strict Provenance][crate::ptr#strict-provenance] API.
211    #[must_use]
212    #[inline]
213    #[stable(feature = "strict_provenance", since = "1.84.0")]
214    pub fn map_addr(self, f: impl FnOnce(usize) -> usize) -> Self {
215        self.with_addr(f(self.addr()))
216    }
217
218    /// Decompose a (possibly wide) pointer into its data pointer and metadata components.
219    ///
220    /// The pointer can be later reconstructed with [`from_raw_parts_mut`].
221    #[unstable(feature = "ptr_metadata", issue = "81513")]
222    #[inline]
223    pub const fn to_raw_parts(self) -> (*mut (), <T as super::Pointee>::Metadata) {
224        (self.cast(), super::metadata(self))
225    }
226
227    #[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`&T` instead of `Option<&T>`.\n"include_str!("./docs/as_ref.md")]
228    ///
229    /// ```
230    /// let ptr: *mut u8 = &mut 10u8 as *mut u8;
231    ///
232    /// unsafe {
233    ///     let val_back = ptr.as_ref_unchecked();
234    ///     println!("We got back the value: {val_back}!");
235    /// }
236    /// ```
237    ///
238    /// # Examples
239    ///
240    /// ```
241    /// let ptr: *mut u8 = &mut 10u8 as *mut u8;
242    ///
243    /// unsafe {
244    ///     if let Some(val_back) = ptr.as_ref() {
245    ///         println!("We got back the value: {val_back}!");
246    ///     }
247    /// }
248    /// ```
249    ///
250    /// # See Also
251    ///
252    /// For the mutable counterpart see [`as_mut`].
253    ///
254    /// [`is_null`]: #method.is_null-1
255    /// [`as_uninit_ref`]: #method.as_uninit_ref-1
256    /// [`as_ref_unchecked`]: #method.as_ref_unchecked-1
257    /// [`as_mut`]: #method.as_mut
258    #[stable(feature = "ptr_as_ref", since = "1.9.0")]
259    #[rustc_const_stable(feature = "const_ptr_is_null", since = "1.84.0")]
260    #[inline]
261    pub const unsafe fn as_ref<'a>(self) -> Option<&'a T> {
262        // SAFETY: the caller must guarantee that `self` is valid for a
263        // reference if it isn't null.
264        if self.is_null() { None } else { unsafe { Some(&*self) } }
265    }
266
267    /// Returns a shared reference to the value behind the pointer.
268    /// If the pointer may be null or the value may be uninitialized, [`as_uninit_ref`] must be used instead.
269    /// If the pointer may be null, but the value is known to have been initialized, [`as_ref`] must be used instead.
270    ///
271    /// For the mutable counterpart see [`as_mut_unchecked`].
272    ///
273    /// [`as_ref`]: #method.as_ref
274    /// [`as_uninit_ref`]: #method.as_uninit_ref
275    /// [`as_mut_unchecked`]: #method.as_mut_unchecked
276    ///
277    /// # Safety
278    ///
279    /// When calling this method, you have to ensure that the pointer is [convertible to a reference](crate::ptr#pointer-to-reference-conversion).
280    ///
281    /// # Examples
282    ///
283    /// ```
284    /// let ptr: *mut u8 = &mut 10u8 as *mut u8;
285    ///
286    /// unsafe {
287    ///     println!("We got back the value: {}!", ptr.as_ref_unchecked());
288    /// }
289    /// ```
290    #[stable(feature = "ptr_as_ref_unchecked", since = "1.95.0")]
291    #[rustc_const_stable(feature = "ptr_as_ref_unchecked", since = "1.95.0")]
292    #[inline]
293    #[must_use]
294    pub const unsafe fn as_ref_unchecked<'a>(self) -> &'a T {
295        // SAFETY: the caller must guarantee that `self` is valid for a reference
296        unsafe { &*self }
297    }
298
299    #[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")]
300    ///
301    /// [`is_null`]: #method.is_null-1
302    /// [`as_ref`]: pointer#method.as_ref-1
303    ///
304    /// # See Also
305    /// For the mutable counterpart see [`as_uninit_mut`].
306    ///
307    /// [`as_uninit_mut`]: #method.as_uninit_mut
308    ///
309    /// # Examples
310    ///
311    /// ```
312    /// #![feature(ptr_as_uninit)]
313    ///
314    /// let ptr: *mut u8 = &mut 10u8 as *mut u8;
315    ///
316    /// unsafe {
317    ///     if let Some(val_back) = ptr.as_uninit_ref() {
318    ///         println!("We got back the value: {}!", val_back.assume_init());
319    ///     }
320    /// }
321    /// ```
322    #[inline]
323    #[unstable(feature = "ptr_as_uninit", issue = "75402")]
324    pub const unsafe fn as_uninit_ref<'a>(self) -> Option<&'a MaybeUninit<T>>
325    where
326        T: Sized,
327    {
328        // SAFETY: the caller must guarantee that `self` meets all the
329        // requirements for a reference.
330        if self.is_null() { None } else { Some(unsafe { &*(self as *const MaybeUninit<T>) }) }
331    }
332
333    #[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")]
334    ///
335    /// Consider using [`wrapping_offset`](#method.wrapping_offset) instead if these constraints are
336    /// difficult to satisfy. The only advantage of this method is that it
337    /// enables more aggressive compiler optimizations.
338    ///
339    /// # Examples
340    ///
341    /// ```
342    /// let mut s = [1, 2, 3];
343    /// let ptr: *mut u32 = s.as_mut_ptr();
344    ///
345    /// unsafe {
346    ///     assert_eq!(2, *ptr.offset(1));
347    ///     assert_eq!(3, *ptr.offset(2));
348    /// }
349    /// ```
350    #[stable(feature = "rust1", since = "1.0.0")]
351    #[must_use = "returns a new pointer rather than modifying its argument"]
352    #[rustc_const_stable(feature = "const_ptr_offset", since = "1.61.0")]
353    #[inline(always)]
354    #[track_caller]
355    pub const unsafe fn offset(self, count: isize) -> *mut T
356    where
357        T: Sized,
358    {
359        #[inline]
360        #[rustc_allow_const_fn_unstable(const_eval_select)]
361        const fn runtime_offset_nowrap(this: *const (), count: isize, size: usize) -> bool {
362            // We can use const_eval_select here because this is only for UB checks.
363            {
    #[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!(
364                @capture { this: *const (), count: isize, size: usize } -> bool:
365                if const {
366                    true
367                } else {
368                    // `size` is the size of a Rust type, so we know that
369                    // `size <= isize::MAX` and thus `as` cast here is not lossy.
370                    let Some(byte_offset) = count.checked_mul(size as isize) else {
371                        return false;
372                    };
373                    let (_, overflow) = this.addr().overflowing_add_signed(byte_offset);
374                    !overflow
375                }
376            )
377        }
378
379        {
    #[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!(
380            check_language_ub,
381            "ptr::offset requires the address calculation to not overflow",
382            (
383                this: *const () = self as *const (),
384                count: isize = count,
385                size: usize = size_of::<T>(),
386            ) => runtime_offset_nowrap(this, count, size)
387        );
388
389        // SAFETY: the caller must uphold the safety contract for `offset`.
390        // The obtained pointer is valid for writes since the caller must
391        // guarantee that it points to the same allocation as `self`.
392        unsafe { intrinsics::offset(self, count) }
393    }
394
395    /// Adds a signed offset in bytes to a pointer.
396    ///
397    /// `count` is in units of **bytes**.
398    ///
399    /// This is purely a convenience for casting to a `u8` pointer and
400    /// using [offset][pointer::offset] on it. See that method for documentation
401    /// and safety requirements.
402    ///
403    /// For non-`Sized` pointees this operation changes only the data pointer,
404    /// leaving the metadata untouched.
405    #[must_use]
406    #[inline(always)]
407    #[stable(feature = "pointer_byte_offsets", since = "1.75.0")]
408    #[rustc_const_stable(feature = "const_pointer_byte_offsets", since = "1.75.0")]
409    #[track_caller]
410    pub const unsafe fn byte_offset(self, count: isize) -> Self {
411        // SAFETY: the caller must uphold the safety contract for `offset`.
412        unsafe { self.cast::<u8>().offset(count).with_metadata_of(self) }
413    }
414
415    /// Adds a signed offset to a pointer using wrapping arithmetic.
416    ///
417    /// `count` is in units of T; e.g., a `count` of 3 represents a pointer
418    /// offset of `3 * size_of::<T>()` bytes.
419    ///
420    /// # Safety
421    ///
422    /// This operation itself is always safe, but using the resulting pointer is not.
423    ///
424    /// The resulting pointer "remembers" the [allocation] that `self` points to
425    /// (this is called "[Provenance](ptr/index.html#provenance)").
426    /// The pointer must not be used to read or write other allocations.
427    ///
428    /// In other words, `let z = x.wrapping_offset((y as isize) - (x as isize))` does *not* make `z`
429    /// the same as `y` even if we assume `T` has size `1` and there is no overflow: `z` is still
430    /// attached to the object `x` is attached to, and dereferencing it is Undefined Behavior unless
431    /// `x` and `y` point into the same allocation.
432    ///
433    /// Compared to [`offset`], this method basically delays the requirement of staying within the
434    /// same allocation: [`offset`] is immediate Undefined Behavior when crossing object
435    /// boundaries; `wrapping_offset` produces a pointer but still leads to Undefined Behavior if a
436    /// pointer is dereferenced when it is out-of-bounds of the object it is attached to. [`offset`]
437    /// can be optimized better and is thus preferable in performance-sensitive code.
438    ///
439    /// The delayed check only considers the value of the pointer that was dereferenced, not the
440    /// intermediate values used during the computation of the final result. For example,
441    /// `x.wrapping_offset(o).wrapping_offset(o.wrapping_neg())` is always the same as `x`. In other
442    /// words, leaving the allocation and then re-entering it later is permitted.
443    ///
444    /// [`offset`]: #method.offset
445    /// [allocation]: crate::ptr#allocation
446    ///
447    /// # Examples
448    ///
449    /// ```
450    /// // Iterate using a raw pointer in increments of two elements
451    /// let mut data = [1u8, 2, 3, 4, 5];
452    /// let mut ptr: *mut u8 = data.as_mut_ptr();
453    /// let step = 2;
454    /// let end_rounded_up = ptr.wrapping_offset(6);
455    ///
456    /// while ptr != end_rounded_up {
457    ///     unsafe {
458    ///         *ptr = 0;
459    ///     }
460    ///     ptr = ptr.wrapping_offset(step);
461    /// }
462    /// assert_eq!(&data, &[0, 2, 0, 4, 0]);
463    /// ```
464    #[stable(feature = "ptr_wrapping_offset", since = "1.16.0")]
465    #[must_use = "returns a new pointer rather than modifying its argument"]
466    #[rustc_const_stable(feature = "const_ptr_offset", since = "1.61.0")]
467    #[inline(always)]
468    pub const fn wrapping_offset(self, count: isize) -> *mut T
469    where
470        T: Sized,
471    {
472        // SAFETY: the `arith_offset` intrinsic has no prerequisites to be called.
473        unsafe { intrinsics::arith_offset(self, count) as *mut T }
474    }
475
476    /// Adds a signed offset in bytes to a pointer using wrapping arithmetic.
477    ///
478    /// `count` is in units of **bytes**.
479    ///
480    /// This is purely a convenience for casting to a `u8` pointer and
481    /// using [wrapping_offset][pointer::wrapping_offset] on it. See that method
482    /// for documentation.
483    ///
484    /// For non-`Sized` pointees this operation changes only the data pointer,
485    /// leaving the metadata untouched.
486    #[must_use]
487    #[inline(always)]
488    #[stable(feature = "pointer_byte_offsets", since = "1.75.0")]
489    #[rustc_const_stable(feature = "const_pointer_byte_offsets", since = "1.75.0")]
490    pub const fn wrapping_byte_offset(self, count: isize) -> Self {
491        self.cast::<u8>().wrapping_offset(count).with_metadata_of(self)
492    }
493
494    /// Masks out bits of the pointer according to a mask.
495    ///
496    /// This is convenience for `ptr.map_addr(|a| a & mask)`.
497    ///
498    /// For non-`Sized` pointees this operation changes only the data pointer,
499    /// leaving the metadata untouched.
500    ///
501    /// ## Examples
502    ///
503    /// ```
504    /// #![feature(ptr_mask)]
505    /// let mut v = 17_u32;
506    /// let ptr: *mut u32 = &mut v;
507    ///
508    /// // `u32` is 4 bytes aligned,
509    /// // which means that lower 2 bits are always 0.
510    /// let tag_mask = 0b11;
511    /// let ptr_mask = !tag_mask;
512    ///
513    /// // We can store something in these lower bits
514    /// let tagged_ptr = ptr.map_addr(|a| a | 0b10);
515    ///
516    /// // Get the "tag" back
517    /// let tag = tagged_ptr.addr() & tag_mask;
518    /// assert_eq!(tag, 0b10);
519    ///
520    /// // Note that `tagged_ptr` is unaligned, it's UB to read from/write to it.
521    /// // To get original pointer `mask` can be used:
522    /// let masked_ptr = tagged_ptr.mask(ptr_mask);
523    /// assert_eq!(unsafe { *masked_ptr }, 17);
524    ///
525    /// unsafe { *masked_ptr = 0 };
526    /// assert_eq!(v, 0);
527    /// ```
528    #[unstable(feature = "ptr_mask", issue = "98290")]
529    #[must_use = "returns a new pointer rather than modifying its argument"]
530    #[inline(always)]
531    pub fn mask(self, mask: usize) -> *mut T {
532        intrinsics::ptr_mask(self.cast::<()>(), mask).cast_mut().with_metadata_of(self)
533    }
534
535    /// Returns `None` if the pointer is null, or else returns a unique reference to
536    /// the value wrapped in `Some`. If the value may be uninitialized, [`as_uninit_mut`]
537    /// must be used instead. If the value is known to be non-null, [`as_mut_unchecked`]
538    /// can be used instead.
539    ///
540    /// For the shared counterpart see [`as_ref`].
541    ///
542    /// [`as_uninit_mut`]: #method.as_uninit_mut
543    /// [`as_mut_unchecked`]: #method.as_mut_unchecked
544    /// [`as_ref`]: pointer#method.as_ref-1
545    ///
546    /// # Safety
547    ///
548    /// When calling this method, you have to ensure that *either*
549    /// the pointer is null *or*
550    /// the pointer is [convertible to a reference](crate::ptr#pointer-to-reference-conversion).
551    ///
552    /// # Panics during const evaluation
553    ///
554    /// This method will panic during const evaluation if the pointer cannot be
555    /// determined to be null or not. See [`is_null`] for more information.
556    ///
557    /// [`is_null`]: #method.is_null-1
558    ///
559    /// # Examples
560    ///
561    /// ```
562    /// let mut s = [1, 2, 3];
563    /// let ptr: *mut u32 = s.as_mut_ptr();
564    /// let first_value = unsafe { ptr.as_mut().unwrap() };
565    /// *first_value = 4;
566    /// # assert_eq!(s, [4, 2, 3]);
567    /// println!("{s:?}"); // It'll print: "[4, 2, 3]".
568    /// ```
569    ///
570    /// # Null-unchecked version
571    ///
572    /// If you are sure the pointer can never be null, you can use `as_mut_unchecked` which returns
573    /// `&mut T` instead of `Option<&mut T>`.
574    ///
575    /// ```
576    /// let mut s = [1, 2, 3];
577    /// let ptr: *mut u32 = s.as_mut_ptr();
578    /// let first_value = unsafe { ptr.as_mut_unchecked() };
579    /// *first_value = 4;
580    /// # assert_eq!(s, [4, 2, 3]);
581    /// println!("{s:?}"); // It'll print: "[4, 2, 3]".
582    /// ```
583    #[stable(feature = "ptr_as_ref", since = "1.9.0")]
584    #[rustc_const_stable(feature = "const_ptr_is_null", since = "1.84.0")]
585    #[inline]
586    pub const unsafe fn as_mut<'a>(self) -> Option<&'a mut T> {
587        // SAFETY: the caller must guarantee that `self` is be valid for
588        // a mutable reference if it isn't null.
589        if self.is_null() { None } else { unsafe { Some(&mut *self) } }
590    }
591
592    /// Returns a unique reference to the value behind the pointer.
593    /// If the pointer may be null or the value may be uninitialized, [`as_uninit_mut`] must be used instead.
594    /// If the pointer may be null, but the value is known to have been initialized, [`as_mut`] must be used instead.
595    ///
596    /// For the shared counterpart see [`as_ref_unchecked`].
597    ///
598    /// [`as_mut`]: #method.as_mut
599    /// [`as_uninit_mut`]: #method.as_uninit_mut
600    /// [`as_ref_unchecked`]: #method.as_ref_unchecked
601    ///
602    /// # Safety
603    ///
604    /// When calling this method, you have to ensure that
605    /// the pointer is [convertible to a reference](crate::ptr#pointer-to-reference-conversion).
606    ///
607    /// # Examples
608    ///
609    /// ```
610    /// let mut s = [1, 2, 3];
611    /// let ptr: *mut u32 = s.as_mut_ptr();
612    /// let first_value = unsafe { ptr.as_mut_unchecked() };
613    /// *first_value = 4;
614    /// # assert_eq!(s, [4, 2, 3]);
615    /// println!("{s:?}"); // It'll print: "[4, 2, 3]".
616    /// ```
617    #[stable(feature = "ptr_as_ref_unchecked", since = "1.95.0")]
618    #[rustc_const_stable(feature = "ptr_as_ref_unchecked", since = "1.95.0")]
619    #[inline]
620    #[must_use]
621    pub const unsafe fn as_mut_unchecked<'a>(self) -> &'a mut T {
622        // SAFETY: the caller must guarantee that `self` is valid for a reference
623        unsafe { &mut *self }
624    }
625
626    /// Returns `None` if the pointer is null, or else returns a unique reference to
627    /// the value wrapped in `Some`. In contrast to [`as_mut`], this does not require
628    /// that the value has to be initialized.
629    ///
630    /// For the shared counterpart see [`as_uninit_ref`].
631    ///
632    /// [`as_mut`]: #method.as_mut
633    /// [`as_uninit_ref`]: pointer#method.as_uninit_ref-1
634    ///
635    /// # Safety
636    ///
637    /// When calling this method, you have to ensure that *either* the pointer is null *or*
638    /// the pointer is [convertible to a reference](crate::ptr#pointer-to-reference-conversion).
639    /// Note that because the created reference is to `MaybeUninit<T>`, the
640    /// source pointer can point to uninitialized memory.
641    ///
642    /// # Panics during const evaluation
643    ///
644    /// This method will panic during const evaluation if the pointer cannot be
645    /// determined to be null or not. See [`is_null`] for more information.
646    ///
647    /// [`is_null`]: #method.is_null-1
648    #[inline]
649    #[unstable(feature = "ptr_as_uninit", issue = "75402")]
650    pub const unsafe fn as_uninit_mut<'a>(self) -> Option<&'a mut MaybeUninit<T>>
651    where
652        T: Sized,
653    {
654        // SAFETY: the caller must guarantee that `self` meets all the
655        // requirements for a reference.
656        if self.is_null() { None } else { Some(unsafe { &mut *(self as *mut MaybeUninit<T>) }) }
657    }
658
659    /// Returns whether two pointers are guaranteed to be equal.
660    ///
661    /// At runtime this function behaves like `Some(self == other)`.
662    /// However, in some contexts (e.g., compile-time evaluation),
663    /// it is not always possible to determine equality of two pointers, so this function may
664    /// spuriously return `None` for pointers that later actually turn out to have its equality known.
665    /// But when it returns `Some`, the pointers' equality is guaranteed to be known.
666    ///
667    /// The return value may change from `Some` to `None` and vice versa depending on the compiler
668    /// version and unsafe code must not
669    /// rely on the result of this function for soundness. It is suggested to only use this function
670    /// for performance optimizations where spurious `None` return values by this function do not
671    /// affect the outcome, but just the performance.
672    /// The consequences of using this method to make runtime and compile-time code behave
673    /// differently have not been explored. This method should not be used to introduce such
674    /// differences, and it should also not be stabilized before we have a better understanding
675    /// of this issue.
676    #[unstable(feature = "const_raw_ptr_comparison", issue = "53020")]
677    #[rustc_const_unstable(feature = "const_raw_ptr_comparison", issue = "53020")]
678    #[inline]
679    pub const fn guaranteed_eq(self, other: *mut T) -> Option<bool>
680    where
681        T: Sized,
682    {
683        (self as *const T).guaranteed_eq(other as _)
684    }
685
686    /// Returns whether two pointers are guaranteed to be inequal.
687    ///
688    /// At runtime this function behaves like `Some(self != other)`.
689    /// However, in some contexts (e.g., compile-time evaluation),
690    /// it is not always possible to determine inequality of two pointers, so this function may
691    /// spuriously return `None` for pointers that later actually turn out to have its inequality known.
692    /// But when it returns `Some`, the pointers' inequality is guaranteed to be known.
693    ///
694    /// The return value may change from `Some` to `None` and vice versa depending on the compiler
695    /// version and unsafe code must not
696    /// rely on the result of this function for soundness. It is suggested to only use this function
697    /// for performance optimizations where spurious `None` return values by this function do not
698    /// affect the outcome, but just the performance.
699    /// The consequences of using this method to make runtime and compile-time code behave
700    /// differently have not been explored. This method should not be used to introduce such
701    /// differences, and it should also not be stabilized before we have a better understanding
702    /// of this issue.
703    #[unstable(feature = "const_raw_ptr_comparison", issue = "53020")]
704    #[rustc_const_unstable(feature = "const_raw_ptr_comparison", issue = "53020")]
705    #[inline]
706    pub const fn guaranteed_ne(self, other: *mut T) -> Option<bool>
707    where
708        T: Sized,
709    {
710        (self as *const T).guaranteed_ne(other as _)
711    }
712
713    /// Calculates the distance between two pointers within the same allocation. The returned value is in
714    /// units of T: the distance in bytes divided by `size_of::<T>()`.
715    ///
716    /// This is equivalent to `(self as isize - origin as isize) / (size_of::<T>() as isize)`,
717    /// except that it has a lot more opportunities for UB, in exchange for the compiler
718    /// better understanding what you are doing.
719    ///
720    /// The primary motivation of this method is for computing the `len` of an array/slice
721    /// of `T` that you are currently representing as a "start" and "end" pointer
722    /// (and "end" is "one past the end" of the array).
723    /// In that case, `end.offset_from(start)` gets you the length of the array.
724    ///
725    /// All of the following safety requirements are trivially satisfied for this usecase.
726    ///
727    /// [`offset`]: pointer#method.offset-1
728    ///
729    /// # Safety
730    ///
731    /// If any of the following conditions are violated, the result is Undefined Behavior:
732    ///
733    /// * `self` and `origin` must either
734    ///
735    ///   * point to the same address, or
736    ///   * both be [derived from][crate::ptr#provenance] a pointer to the same [allocation], and the memory range between
737    ///     the two pointers must be in bounds of that object. (See below for an example.)
738    ///
739    /// * The distance between the pointers, in bytes, must be an exact multiple
740    ///   of the size of `T`.
741    ///
742    /// As a consequence, the absolute distance between the pointers, in bytes, computed on
743    /// mathematical integers (without "wrapping around"), cannot overflow an `isize`. This is
744    /// implied by the in-bounds requirement, and the fact that no allocation can be larger
745    /// than `isize::MAX` bytes.
746    ///
747    /// The requirement for pointers to be derived from the same allocation is primarily
748    /// needed for `const`-compatibility: the distance between pointers into *different* allocated
749    /// objects is not known at compile-time. However, the requirement also exists at
750    /// runtime and may be exploited by optimizations. If you wish to compute the difference between
751    /// pointers that are not guaranteed to be from the same allocation, use
752    /// `(self.addr() as isize - origin.addr() as isize) / size_of::<T>()`.
753    ///
754    /// [`add`]: #method.add
755    /// [allocation]: crate::ptr#allocation
756    ///
757    /// # Panics
758    ///
759    /// This function panics if `T` is a Zero-Sized Type ("ZST").
760    ///
761    /// # Examples
762    ///
763    /// Basic usage:
764    ///
765    /// ```
766    /// let mut a = [0; 5];
767    /// let ptr1: *mut i32 = &mut a[1];
768    /// let ptr2: *mut i32 = &mut a[3];
769    /// unsafe {
770    ///     assert_eq!(ptr2.offset_from(ptr1), 2);
771    ///     assert_eq!(ptr1.offset_from(ptr2), -2);
772    ///     assert_eq!(ptr1.offset(2), ptr2);
773    ///     assert_eq!(ptr2.offset(-2), ptr1);
774    /// }
775    /// ```
776    ///
777    /// *Incorrect* usage:
778    ///
779    /// ```rust,no_run
780    /// let ptr1 = Box::into_raw(Box::new(0u8));
781    /// let ptr2 = Box::into_raw(Box::new(1u8));
782    /// let diff = (ptr2 as isize).wrapping_sub(ptr1 as isize);
783    /// // Make ptr2_other an "alias" of ptr2.add(1), but derived from ptr1.
784    /// let ptr2_other = (ptr1 as *mut u8).wrapping_offset(diff).wrapping_offset(1);
785    /// assert_eq!(ptr2 as usize, ptr2_other as usize);
786    /// // Since ptr2_other and ptr2 are derived from pointers to different objects,
787    /// // computing their offset is undefined behavior, even though
788    /// // they point to addresses that are in-bounds of the same object!
789    /// unsafe {
790    ///     let one = ptr2_other.offset_from(ptr2); // Undefined Behavior! ⚠️
791    /// }
792    /// ```
793    #[stable(feature = "ptr_offset_from", since = "1.47.0")]
794    #[rustc_const_stable(feature = "const_ptr_offset_from", since = "1.65.0")]
795    #[inline(always)]
796    #[cfg_attr(miri, track_caller)] // even without panics, this helps for Miri backtraces
797    pub const unsafe fn offset_from(self, origin: *const T) -> isize
798    where
799        T: Sized,
800    {
801        // SAFETY: the caller must uphold the safety contract for `offset_from`.
802        unsafe { (self as *const T).offset_from(origin) }
803    }
804
805    /// Calculates the distance between two pointers within the same allocation. The returned value is in
806    /// units of **bytes**.
807    ///
808    /// This is purely a convenience for casting to a `u8` pointer and
809    /// using [`offset_from`][pointer::offset_from] on it. See that method for
810    /// documentation and safety requirements.
811    ///
812    /// For non-`Sized` pointees this operation considers only the data pointers,
813    /// ignoring the metadata.
814    #[inline(always)]
815    #[stable(feature = "pointer_byte_offsets", since = "1.75.0")]
816    #[rustc_const_stable(feature = "const_pointer_byte_offsets", since = "1.75.0")]
817    #[cfg_attr(miri, track_caller)] // even without panics, this helps for Miri backtraces
818    pub const unsafe fn byte_offset_from<U: ?Sized>(self, origin: *const U) -> isize {
819        // SAFETY: the caller must uphold the safety contract for `offset_from`.
820        unsafe { self.cast::<u8>().offset_from(origin.cast::<u8>()) }
821    }
822
823    /// Calculates the distance between two pointers within the same allocation, *where it's known that
824    /// `self` is equal to or greater than `origin`*. The returned value is in
825    /// units of T: the distance in bytes is divided by `size_of::<T>()`.
826    ///
827    /// This computes the same value that [`offset_from`](#method.offset_from)
828    /// would compute, but with the added precondition that the offset is
829    /// guaranteed to be non-negative.  This method is equivalent to
830    /// `usize::try_from(self.offset_from(origin)).unwrap_unchecked()`,
831    /// but it provides slightly more information to the optimizer, which can
832    /// sometimes allow it to optimize slightly better with some backends.
833    ///
834    /// This method can be thought of as recovering the `count` that was passed
835    /// to [`add`](#method.add) (or, with the parameters in the other order,
836    /// to [`sub`](#method.sub)).  The following are all equivalent, assuming
837    /// that their safety preconditions are met:
838    /// ```rust
839    /// # unsafe fn blah(ptr: *mut i32, origin: *mut i32, count: usize) -> bool { unsafe {
840    /// ptr.offset_from_unsigned(origin) == count
841    /// # &&
842    /// origin.add(count) == ptr
843    /// # &&
844    /// ptr.sub(count) == origin
845    /// # } }
846    /// ```
847    ///
848    /// # Safety
849    ///
850    /// - The distance between the pointers must be non-negative (`self >= origin`)
851    ///
852    /// - *All* the safety conditions of [`offset_from`](#method.offset_from)
853    ///   apply to this method as well; see it for the full details.
854    ///
855    /// Importantly, despite the return type of this method being able to represent
856    /// a larger offset, it's still *not permitted* to pass pointers which differ
857    /// by more than `isize::MAX` *bytes*.  As such, the result of this method will
858    /// always be less than or equal to `isize::MAX as usize`.
859    ///
860    /// # Panics
861    ///
862    /// This function panics if `T` is a Zero-Sized Type ("ZST").
863    ///
864    /// # Examples
865    ///
866    /// ```
867    /// let mut a = [0; 5];
868    /// let p: *mut i32 = a.as_mut_ptr();
869    /// unsafe {
870    ///     let ptr1: *mut i32 = p.add(1);
871    ///     let ptr2: *mut i32 = p.add(3);
872    ///
873    ///     assert_eq!(ptr2.offset_from_unsigned(ptr1), 2);
874    ///     assert_eq!(ptr1.add(2), ptr2);
875    ///     assert_eq!(ptr2.sub(2), ptr1);
876    ///     assert_eq!(ptr2.offset_from_unsigned(ptr2), 0);
877    /// }
878    ///
879    /// // This would be incorrect, as the pointers are not correctly ordered:
880    /// // ptr1.offset_from(ptr2)
881    /// ```
882    #[stable(feature = "ptr_sub_ptr", since = "1.87.0")]
883    #[rustc_const_stable(feature = "const_ptr_sub_ptr", since = "1.87.0")]
884    #[inline]
885    #[track_caller]
886    pub const unsafe fn offset_from_unsigned(self, origin: *const T) -> usize
887    where
888        T: Sized,
889    {
890        // SAFETY: the caller must uphold the safety contract for `offset_from_unsigned`.
891        unsafe { (self as *const T).offset_from_unsigned(origin) }
892    }
893
894    /// Calculates the distance between two pointers within the same allocation, *where it's known that
895    /// `self` is equal to or greater than `origin`*. The returned value is in
896    /// units of **bytes**.
897    ///
898    /// This is purely a convenience for casting to a `u8` pointer and
899    /// using [`offset_from_unsigned`][pointer::offset_from_unsigned] on it.
900    /// See that method for documentation and safety requirements.
901    ///
902    /// For non-`Sized` pointees this operation considers only the data pointers,
903    /// ignoring the metadata.
904    #[stable(feature = "ptr_sub_ptr", since = "1.87.0")]
905    #[rustc_const_stable(feature = "const_ptr_sub_ptr", since = "1.87.0")]
906    #[inline]
907    #[track_caller]
908    pub const unsafe fn byte_offset_from_unsigned<U: ?Sized>(self, origin: *mut U) -> usize {
909        // SAFETY: the caller must uphold the safety contract for `byte_offset_from_unsigned`.
910        unsafe { (self as *const T).byte_offset_from_unsigned(origin) }
911    }
912
913    #[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")]
914    ///
915    /// Consider using [`wrapping_add`](#method.wrapping_add) instead if these constraints are
916    /// difficult to satisfy. The only advantage of this method is that it
917    /// enables more aggressive compiler optimizations.
918    ///
919    /// # Examples
920    ///
921    /// ```
922    /// let mut s: String = "123".to_string();
923    /// let ptr: *mut u8 = s.as_mut_ptr();
924    ///
925    /// unsafe {
926    ///     assert_eq!('2', *ptr.add(1) as char);
927    ///     assert_eq!('3', *ptr.add(2) as char);
928    /// }
929    /// ```
930    #[stable(feature = "pointer_methods", since = "1.26.0")]
931    #[must_use = "returns a new pointer rather than modifying its argument"]
932    #[rustc_const_stable(feature = "const_ptr_offset", since = "1.61.0")]
933    #[inline(always)]
934    #[track_caller]
935    pub const unsafe fn add(self, count: usize) -> Self
936    where
937        T: Sized,
938    {
939        #[cfg(debug_assertions)]
940        #[inline]
941        #[rustc_allow_const_fn_unstable(const_eval_select)]
942        const fn runtime_add_nowrap(this: *const (), count: usize, size: usize) -> bool {
943            {
    #[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!(
944                @capture { this: *const (), count: usize, size: usize } -> bool:
945                if const {
946                    true
947                } else {
948                    let Some(byte_offset) = count.checked_mul(size) else {
949                        return false;
950                    };
951                    let (_, overflow) = this.addr().overflowing_add(byte_offset);
952                    byte_offset <= (isize::MAX as usize) && !overflow
953                }
954            )
955        }
956
957        #[cfg(debug_assertions)] // Expensive, and doesn't catch much in the wild.
958        {
    #[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!(
959            check_language_ub,
960            "ptr::add requires that the address calculation does not overflow",
961            (
962                this: *const () = self as *const (),
963                count: usize = count,
964                size: usize = size_of::<T>(),
965            ) => runtime_add_nowrap(this, count, size)
966        );
967
968        // SAFETY: the caller must uphold the safety contract for `offset`.
969        unsafe { intrinsics::offset(self, count) }
970    }
971
972    /// Adds an unsigned offset in bytes to a pointer.
973    ///
974    /// `count` is in units of bytes.
975    ///
976    /// This is purely a convenience for casting to a `u8` pointer and
977    /// using [add][pointer::add] on it. See that method for documentation
978    /// and safety requirements.
979    ///
980    /// For non-`Sized` pointees this operation changes only the data pointer,
981    /// leaving the metadata untouched.
982    #[must_use]
983    #[inline(always)]
984    #[stable(feature = "pointer_byte_offsets", since = "1.75.0")]
985    #[rustc_const_stable(feature = "const_pointer_byte_offsets", since = "1.75.0")]
986    #[track_caller]
987    pub const unsafe fn byte_add(self, count: usize) -> Self {
988        // SAFETY: the caller must uphold the safety contract for `add`.
989        unsafe { self.cast::<u8>().add(count).with_metadata_of(self) }
990    }
991
992    #[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")]
993    ///
994    /// Consider using [`wrapping_sub`](#method.wrapping_sub) instead if these constraints are
995    /// difficult to satisfy. The only advantage of this method is that it
996    /// enables more aggressive compiler optimizations.
997    ///
998    /// # Examples
999    ///
1000    /// ```
1001    /// let s: &str = "123";
1002    ///
1003    /// unsafe {
1004    ///     let end: *const u8 = s.as_ptr().add(3);
1005    ///     assert_eq!('3', *end.sub(1) as char);
1006    ///     assert_eq!('2', *end.sub(2) as char);
1007    /// }
1008    /// ```
1009    #[stable(feature = "pointer_methods", since = "1.26.0")]
1010    #[must_use = "returns a new pointer rather than modifying its argument"]
1011    #[rustc_const_stable(feature = "const_ptr_offset", since = "1.61.0")]
1012    #[inline(always)]
1013    #[track_caller]
1014    pub const unsafe fn sub(self, count: usize) -> Self
1015    where
1016        T: Sized,
1017    {
1018        #[cfg(debug_assertions)]
1019        #[inline]
1020        #[rustc_allow_const_fn_unstable(const_eval_select)]
1021        const fn runtime_sub_nowrap(this: *const (), count: usize, size: usize) -> bool {
1022            {
    #[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!(
1023                @capture { this: *const (), count: usize, size: usize } -> bool:
1024                if const {
1025                    true
1026                } else {
1027                    let Some(byte_offset) = count.checked_mul(size) else {
1028                        return false;
1029                    };
1030                    byte_offset <= (isize::MAX as usize) && this.addr() >= byte_offset
1031                }
1032            )
1033        }
1034
1035        #[cfg(debug_assertions)] // Expensive, and doesn't catch much in the wild.
1036        {
    #[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!(
1037            check_language_ub,
1038            "ptr::sub requires that the address calculation does not overflow",
1039            (
1040                this: *const () = self as *const (),
1041                count: usize = count,
1042                size: usize = size_of::<T>(),
1043            ) => runtime_sub_nowrap(this, count, size)
1044        );
1045
1046        if T::IS_ZST {
1047            // Pointer arithmetic does nothing when the pointee is a ZST.
1048            self
1049        } else {
1050            // SAFETY: the caller must uphold the safety contract for `offset`.
1051            // Because the pointee is *not* a ZST, that means that `count` is
1052            // at most `isize::MAX`, and thus the negation cannot overflow.
1053            unsafe { intrinsics::offset(self, intrinsics::unchecked_sub(0, count as isize)) }
1054        }
1055    }
1056
1057    /// Subtracts an unsigned offset in bytes from a pointer.
1058    ///
1059    /// `count` is in units of bytes.
1060    ///
1061    /// This is purely a convenience for casting to a `u8` pointer and
1062    /// using [sub][pointer::sub] on it. See that method for documentation
1063    /// and safety requirements.
1064    ///
1065    /// For non-`Sized` pointees this operation changes only the data pointer,
1066    /// leaving the metadata untouched.
1067    #[must_use]
1068    #[inline(always)]
1069    #[stable(feature = "pointer_byte_offsets", since = "1.75.0")]
1070    #[rustc_const_stable(feature = "const_pointer_byte_offsets", since = "1.75.0")]
1071    #[track_caller]
1072    pub const unsafe fn byte_sub(self, count: usize) -> Self {
1073        // SAFETY: the caller must uphold the safety contract for `sub`.
1074        unsafe { self.cast::<u8>().sub(count).with_metadata_of(self) }
1075    }
1076
1077    /// Adds an unsigned offset to a pointer using wrapping arithmetic.
1078    ///
1079    /// `count` is in units of T; e.g., a `count` of 3 represents a pointer
1080    /// offset of `3 * size_of::<T>()` bytes.
1081    ///
1082    /// # Safety
1083    ///
1084    /// This operation itself is always safe, but using the resulting pointer is not.
1085    ///
1086    /// The resulting pointer "remembers" the [allocation] that `self` points to; it must not
1087    /// be used to read or write other allocations.
1088    ///
1089    /// In other words, `let z = x.wrapping_add((y as usize) - (x as usize))` does *not* make `z`
1090    /// the same as `y` even if we assume `T` has size `1` and there is no overflow: `z` is still
1091    /// attached to the object `x` is attached to, and dereferencing it is Undefined Behavior unless
1092    /// `x` and `y` point into the same allocation.
1093    ///
1094    /// Compared to [`add`], this method basically delays the requirement of staying within the
1095    /// same allocation: [`add`] is immediate Undefined Behavior when crossing object
1096    /// boundaries; `wrapping_add` produces a pointer but still leads to Undefined Behavior if a
1097    /// pointer is dereferenced when it is out-of-bounds of the object it is attached to. [`add`]
1098    /// can be optimized better and is thus preferable in performance-sensitive code.
1099    ///
1100    /// The delayed check only considers the value of the pointer that was dereferenced, not the
1101    /// intermediate values used during the computation of the final result. For example,
1102    /// `x.wrapping_add(o).wrapping_sub(o)` is always the same as `x`. In other words, leaving the
1103    /// allocation and then re-entering it later is permitted.
1104    ///
1105    /// [`add`]: #method.add
1106    /// [allocation]: crate::ptr#allocation
1107    ///
1108    /// # Examples
1109    ///
1110    /// ```
1111    /// // Iterate using a raw pointer in increments of two elements
1112    /// let data = [1u8, 2, 3, 4, 5];
1113    /// let mut ptr: *const u8 = data.as_ptr();
1114    /// let step = 2;
1115    /// let end_rounded_up = ptr.wrapping_add(6);
1116    ///
1117    /// // This loop prints "1, 3, 5, "
1118    /// while ptr != end_rounded_up {
1119    ///     unsafe {
1120    ///         print!("{}, ", *ptr);
1121    ///     }
1122    ///     ptr = ptr.wrapping_add(step);
1123    /// }
1124    /// ```
1125    #[stable(feature = "pointer_methods", since = "1.26.0")]
1126    #[must_use = "returns a new pointer rather than modifying its argument"]
1127    #[rustc_const_stable(feature = "const_ptr_offset", since = "1.61.0")]
1128    #[allow(clippy::ptr_offset_with_cast)]
1129    #[inline(always)]
1130    pub const fn wrapping_add(self, count: usize) -> Self
1131    where
1132        T: Sized,
1133    {
1134        self.wrapping_offset(count as isize)
1135    }
1136
1137    /// Adds an unsigned offset in bytes to a pointer using wrapping arithmetic.
1138    ///
1139    /// `count` is in units of bytes.
1140    ///
1141    /// This is purely a convenience for casting to a `u8` pointer and
1142    /// using [wrapping_add][pointer::wrapping_add] on it. See that method for documentation.
1143    ///
1144    /// For non-`Sized` pointees this operation changes only the data pointer,
1145    /// leaving the metadata untouched.
1146    #[must_use]
1147    #[inline(always)]
1148    #[stable(feature = "pointer_byte_offsets", since = "1.75.0")]
1149    #[rustc_const_stable(feature = "const_pointer_byte_offsets", since = "1.75.0")]
1150    pub const fn wrapping_byte_add(self, count: usize) -> Self {
1151        self.cast::<u8>().wrapping_add(count).with_metadata_of(self)
1152    }
1153
1154    /// Subtracts an unsigned offset from a pointer using wrapping arithmetic.
1155    ///
1156    /// `count` is in units of T; e.g., a `count` of 3 represents a pointer
1157    /// offset of `3 * size_of::<T>()` bytes.
1158    ///
1159    /// # Safety
1160    ///
1161    /// This operation itself is always safe, but using the resulting pointer is not.
1162    ///
1163    /// The resulting pointer "remembers" the [allocation] that `self` points to; it must not
1164    /// be used to read or write other allocations.
1165    ///
1166    /// In other words, `let z = x.wrapping_sub((x as usize) - (y as usize))` does *not* make `z`
1167    /// the same as `y` even if we assume `T` has size `1` and there is no overflow: `z` is still
1168    /// attached to the object `x` is attached to, and dereferencing it is Undefined Behavior unless
1169    /// `x` and `y` point into the same allocation.
1170    ///
1171    /// Compared to [`sub`], this method basically delays the requirement of staying within the
1172    /// same allocation: [`sub`] is immediate Undefined Behavior when crossing object
1173    /// boundaries; `wrapping_sub` produces a pointer but still leads to Undefined Behavior if a
1174    /// pointer is dereferenced when it is out-of-bounds of the object it is attached to. [`sub`]
1175    /// can be optimized better and is thus preferable in performance-sensitive code.
1176    ///
1177    /// The delayed check only considers the value of the pointer that was dereferenced, not the
1178    /// intermediate values used during the computation of the final result. For example,
1179    /// `x.wrapping_add(o).wrapping_sub(o)` is always the same as `x`. In other words, leaving the
1180    /// allocation and then re-entering it later is permitted.
1181    ///
1182    /// [`sub`]: #method.sub
1183    /// [allocation]: crate::ptr#allocation
1184    ///
1185    /// # Examples
1186    ///
1187    /// ```
1188    /// // Iterate using a raw pointer in increments of two elements (backwards)
1189    /// let data = [1u8, 2, 3, 4, 5];
1190    /// let mut ptr: *const u8 = data.as_ptr();
1191    /// let start_rounded_down = ptr.wrapping_sub(2);
1192    /// ptr = ptr.wrapping_add(4);
1193    /// let step = 2;
1194    /// // This loop prints "5, 3, 1, "
1195    /// while ptr != start_rounded_down {
1196    ///     unsafe {
1197    ///         print!("{}, ", *ptr);
1198    ///     }
1199    ///     ptr = ptr.wrapping_sub(step);
1200    /// }
1201    /// ```
1202    #[stable(feature = "pointer_methods", since = "1.26.0")]
1203    #[must_use = "returns a new pointer rather than modifying its argument"]
1204    #[rustc_const_stable(feature = "const_ptr_offset", since = "1.61.0")]
1205    #[inline(always)]
1206    pub const fn wrapping_sub(self, count: usize) -> Self
1207    where
1208        T: Sized,
1209    {
1210        self.wrapping_offset((count as isize).wrapping_neg())
1211    }
1212
1213    /// Subtracts an unsigned offset in bytes from a pointer using wrapping arithmetic.
1214    ///
1215    /// `count` is in units of bytes.
1216    ///
1217    /// This is purely a convenience for casting to a `u8` pointer and
1218    /// using [wrapping_sub][pointer::wrapping_sub] on it. See that method for documentation.
1219    ///
1220    /// For non-`Sized` pointees this operation changes only the data pointer,
1221    /// leaving the metadata untouched.
1222    #[must_use]
1223    #[inline(always)]
1224    #[stable(feature = "pointer_byte_offsets", since = "1.75.0")]
1225    #[rustc_const_stable(feature = "const_pointer_byte_offsets", since = "1.75.0")]
1226    pub const fn wrapping_byte_sub(self, count: usize) -> Self {
1227        self.cast::<u8>().wrapping_sub(count).with_metadata_of(self)
1228    }
1229
1230    /// Reads the value from `self` without moving it. This leaves the
1231    /// memory in `self` unchanged.
1232    ///
1233    /// See [`ptr::read`] for safety concerns and examples.
1234    ///
1235    /// [`ptr::read`]: crate::ptr::read()
1236    #[stable(feature = "pointer_methods", since = "1.26.0")]
1237    #[rustc_const_stable(feature = "const_ptr_read", since = "1.71.0")]
1238    #[inline(always)]
1239    #[track_caller]
1240    pub const unsafe fn read(self) -> T
1241    where
1242        T: Sized,
1243    {
1244        // SAFETY: the caller must uphold the safety contract for ``.
1245        unsafe { read(self) }
1246    }
1247
1248    /// Performs a volatile read of the value from `self` without moving it. This
1249    /// leaves the memory in `self` unchanged.
1250    ///
1251    /// Volatile operations are intended to act on I/O memory, and are guaranteed
1252    /// to not be elided or reordered by the compiler across other volatile
1253    /// operations.
1254    ///
1255    /// See [`ptr::read_volatile`] for safety concerns and examples.
1256    ///
1257    /// [`ptr::read_volatile`]: crate::ptr::read_volatile()
1258    #[stable(feature = "pointer_methods", since = "1.26.0")]
1259    #[rustc_const_unstable(feature = "const_volatile", issue = "159094")]
1260    #[inline(always)]
1261    #[track_caller]
1262    pub const unsafe fn read_volatile(self) -> T
1263    where
1264        T: Sized,
1265    {
1266        // SAFETY: the caller must uphold the safety contract for `read_volatile`.
1267        unsafe { read_volatile(self) }
1268    }
1269
1270    /// Reads the value from `self` without moving it. This leaves the
1271    /// memory in `self` unchanged.
1272    ///
1273    /// Unlike `read`, the pointer may be unaligned.
1274    ///
1275    /// See [`ptr::read_unaligned`] for safety concerns and examples.
1276    ///
1277    /// [`ptr::read_unaligned`]: crate::ptr::read_unaligned()
1278    #[stable(feature = "pointer_methods", since = "1.26.0")]
1279    #[rustc_const_stable(feature = "const_ptr_read", since = "1.71.0")]
1280    #[inline(always)]
1281    #[track_caller]
1282    pub const unsafe fn read_unaligned(self) -> T
1283    where
1284        T: Sized,
1285    {
1286        // SAFETY: the caller must uphold the safety contract for `read_unaligned`.
1287        unsafe { read_unaligned(self) }
1288    }
1289
1290    /// Copies `count * size_of::<T>()` bytes from `self` to `dest`. The source
1291    /// and destination may overlap.
1292    ///
1293    /// NOTE: this has the *same* argument order as [`ptr::copy`].
1294    ///
1295    /// See [`ptr::copy`] for safety concerns and examples.
1296    ///
1297    /// [`ptr::copy`]: crate::ptr::copy()
1298    #[rustc_const_stable(feature = "const_intrinsic_copy", since = "1.83.0")]
1299    #[stable(feature = "pointer_methods", since = "1.26.0")]
1300    #[inline(always)]
1301    #[track_caller]
1302    pub const unsafe fn copy_to(self, dest: *mut T, count: usize)
1303    where
1304        T: Sized,
1305    {
1306        // SAFETY: the caller must uphold the safety contract for `copy`.
1307        unsafe { copy(self, dest, count) }
1308    }
1309
1310    /// Copies `count * size_of::<T>()` bytes from `self` to `dest`. The source
1311    /// and destination may *not* overlap.
1312    ///
1313    /// NOTE: this has the *same* argument order as [`ptr::copy_nonoverlapping`].
1314    ///
1315    /// See [`ptr::copy_nonoverlapping`] for safety concerns and examples.
1316    ///
1317    /// [`ptr::copy_nonoverlapping`]: crate::ptr::copy_nonoverlapping()
1318    #[rustc_const_stable(feature = "const_intrinsic_copy", since = "1.83.0")]
1319    #[stable(feature = "pointer_methods", since = "1.26.0")]
1320    #[inline(always)]
1321    #[track_caller]
1322    pub const unsafe fn copy_to_nonoverlapping(self, dest: *mut T, count: usize)
1323    where
1324        T: Sized,
1325    {
1326        // SAFETY: the caller must uphold the safety contract for `copy_nonoverlapping`.
1327        unsafe { copy_nonoverlapping(self, dest, count) }
1328    }
1329
1330    /// Copies `count * size_of::<T>()` bytes from `src` to `self`. The source
1331    /// and destination may overlap.
1332    ///
1333    /// NOTE: this has the *opposite* argument order of [`ptr::copy`].
1334    ///
1335    /// See [`ptr::copy`] for safety concerns and examples.
1336    ///
1337    /// [`ptr::copy`]: crate::ptr::copy()
1338    #[rustc_const_stable(feature = "const_intrinsic_copy", since = "1.83.0")]
1339    #[stable(feature = "pointer_methods", since = "1.26.0")]
1340    #[inline(always)]
1341    #[track_caller]
1342    pub const unsafe fn copy_from(self, src: *const T, count: usize)
1343    where
1344        T: Sized,
1345    {
1346        // SAFETY: the caller must uphold the safety contract for `copy`.
1347        unsafe { copy(src, self, count) }
1348    }
1349
1350    /// Copies `count * size_of::<T>()` bytes from `src` to `self`. The source
1351    /// and destination may *not* overlap.
1352    ///
1353    /// NOTE: this has the *opposite* argument order of [`ptr::copy_nonoverlapping`].
1354    ///
1355    /// See [`ptr::copy_nonoverlapping`] for safety concerns and examples.
1356    ///
1357    /// [`ptr::copy_nonoverlapping`]: crate::ptr::copy_nonoverlapping()
1358    #[rustc_const_stable(feature = "const_intrinsic_copy", since = "1.83.0")]
1359    #[stable(feature = "pointer_methods", since = "1.26.0")]
1360    #[inline(always)]
1361    #[track_caller]
1362    pub const unsafe fn copy_from_nonoverlapping(self, src: *const T, count: usize)
1363    where
1364        T: Sized,
1365    {
1366        // SAFETY: the caller must uphold the safety contract for `copy_nonoverlapping`.
1367        unsafe { copy_nonoverlapping(src, self, count) }
1368    }
1369
1370    /// Executes the destructor (if any) of the pointed-to value.
1371    ///
1372    /// See [`ptr::drop_in_place`] for safety concerns and examples.
1373    ///
1374    /// [`ptr::drop_in_place`]: crate::ptr::drop_in_place()
1375    #[stable(feature = "pointer_methods", since = "1.26.0")]
1376    #[rustc_const_unstable(feature = "const_drop_in_place", issue = "109342")]
1377    #[rustc_diagnostic_item = "ptr_drop_in_place_self"]
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 are 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}