@@ -295,6 +295,72 @@ impl<T: ?Sized> *const T {
295
295
intrinsics:: ptr_offset_from ( self , origin)
296
296
}
297
297
298
+ /// Returns whether two pointers are guaranteed to be equal.
299
+ ///
300
+ /// At runtime this function behaves like `self == other`.
301
+ /// However, in some contexts (e.g., compile-time evaluation),
302
+ /// it is not always possible to determine equality of two pointers, so this function may
303
+ /// spuriously return `false` for pointers that later actually turn out to be equal.
304
+ /// But when it returns `true`, the pointers are guaranteed to be equal.
305
+ ///
306
+ /// This function is the mirror of [`guaranteed_ne`], but not its inverse. There are pointer
307
+ /// comparisons for which both functions return `false`.
308
+ ///
309
+ /// [`guaranteed_ne`]: #method.guaranteed_ne
310
+ ///
311
+ /// The return value may change depending on the compiler version and unsafe code may not
312
+ /// rely on the result of this function for soundness. It is suggested to only use this function
313
+ /// for performance optimizations where spurious `false` return values by this function do not
314
+ /// affect the outcome, but just the performance.
315
+ /// The consequences of using this method to make runtime and compile-time code behave
316
+ /// differently have not been explored. This method should not be used to introduce such
317
+ /// differences, and it should also not be stabilized before we have a better understanding
318
+ /// of this issue.
319
+ /// ```
320
+ #[ unstable( feature = "const_raw_ptr_comparison" , issue = "53020" ) ]
321
+ #[ rustc_const_unstable( feature = "const_raw_ptr_comparison" , issue = "53020" ) ]
322
+ #[ inline]
323
+ #[ cfg( not( bootstrap) ) ]
324
+ pub const fn guaranteed_eq ( self , other : * const T ) -> bool
325
+ where
326
+ T : Sized ,
327
+ {
328
+ intrinsics:: ptr_guaranteed_eq ( self , other)
329
+ }
330
+
331
+ /// Returns whether two pointers are guaranteed to be inequal.
332
+ ///
333
+ /// At runtime this function behaves like `self != other`.
334
+ /// However, in some contexts (e.g., compile-time evaluation),
335
+ /// it is not always possible to determine the inequality of two pointers, so this function may
336
+ /// spuriously return `false` for pointers that later actually turn out to be inequal.
337
+ /// But when it returns `true`, the pointers are guaranteed to be inequal.
338
+ ///
339
+ /// This function is the mirror of [`guaranteed_eq`], but not its inverse. There are pointer
340
+ /// comparisons for which both functions return `false`.
341
+ ///
342
+ /// [`guaranteed_eq`]: #method.guaranteed_eq
343
+ ///
344
+ /// The return value may change depending on the compiler version and unsafe code may not
345
+ /// rely on the result of this function for soundness. It is suggested to only use this function
346
+ /// for performance optimizations where spurious `false` return values by this function do not
347
+ /// affect the outcome, but just the performance.
348
+ /// The consequences of using this method to make runtime and compile-time code behave
349
+ /// differently have not been explored. This method should not be used to introduce such
350
+ /// differences, and it should also not be stabilized before we have a better understanding
351
+ /// of this issue.
352
+ /// ```
353
+ #[ unstable( feature = "const_raw_ptr_comparison" , issue = "53020" ) ]
354
+ #[ rustc_const_unstable( feature = "const_raw_ptr_comparison" , issue = "53020" ) ]
355
+ #[ inline]
356
+ #[ cfg( not( bootstrap) ) ]
357
+ pub const fn guaranteed_ne ( self , other : * const T ) -> bool
358
+ where
359
+ T : Sized ,
360
+ {
361
+ intrinsics:: ptr_guaranteed_ne ( self , other)
362
+ }
363
+
298
364
/// Calculates the distance between two pointers. The returned value is in
299
365
/// units of T: the distance in bytes is divided by `mem::size_of::<T>()`.
300
366
///
0 commit comments