const: make ptr.is_null() stop execution on ambiguity
This commit is contained in:
@@ -40,15 +40,17 @@ impl<T: ?Sized> *const T {
|
||||
|
||||
#[inline]
|
||||
const fn const_impl(ptr: *const u8) -> bool {
|
||||
// Compare via a cast to a thin pointer, so fat pointers are only
|
||||
// considering their "data" part for null-ness.
|
||||
match (ptr).guaranteed_eq(null_mut()) {
|
||||
None => false,
|
||||
Some(res) => res,
|
||||
// To remain maximally convervative, we stop execution when we don't
|
||||
// know whether the pointer is null or not.
|
||||
// We can *not* return `false` here, that would be unsound in `NonNull::new`!
|
||||
None => panic!("null-ness of this pointer cannot be determined in const context"),
|
||||
}
|
||||
}
|
||||
|
||||
#[allow(unused_unsafe)]
|
||||
// Compare via a cast to a thin pointer, so fat pointers are only
|
||||
// considering their "data" part for null-ness.
|
||||
const_eval_select((self as *const u8,), const_impl, runtime_impl)
|
||||
}
|
||||
|
||||
|
||||
@@ -33,22 +33,7 @@ impl<T: ?Sized> *mut T {
|
||||
#[rustc_diagnostic_item = "ptr_is_null"]
|
||||
#[inline]
|
||||
pub const fn is_null(self) -> bool {
|
||||
#[inline]
|
||||
fn runtime_impl(ptr: *mut u8) -> bool {
|
||||
ptr.addr() == 0
|
||||
}
|
||||
|
||||
#[inline]
|
||||
const fn const_impl(ptr: *mut u8) -> bool {
|
||||
// Compare via a cast to a thin pointer, so fat pointers are only
|
||||
// considering their "data" part for null-ness.
|
||||
match (ptr).guaranteed_eq(null_mut()) {
|
||||
None => false,
|
||||
Some(res) => res,
|
||||
}
|
||||
}
|
||||
|
||||
const_eval_select((self as *mut u8,), const_impl, runtime_impl)
|
||||
self.cast_const().is_null()
|
||||
}
|
||||
|
||||
/// Casts to a pointer of another type.
|
||||
|
||||
Reference in New Issue
Block a user