impl<T: ?Sized> *const T {
/// Returns `true` if the pointer is null.
///
- /// Note that unsized types have many possible null pointers, as only the
- /// raw data pointer is considered, not their length, vtable, etc.
- /// Therefore, two pointers that are null may still not compare equal to
- /// each other.
- ///
/// # Examples
///
/// Basic usage:
/// ```
#[stable(feature = "rust1", since = "1.0.0")]
#[inline]
- pub fn is_null(self) -> bool {
- // Compare via a cast to a thin pointer, so fat pointers are only
- // considering their "data" part for null-ness.
- (self as *const u8) == null()
+ pub fn is_null(self) -> bool where T: Sized {
+ self == null()
}
/// Returns `None` if the pointer is null, or else returns a reference to
#[stable(feature = "ptr_as_ref", since = "1.9.0")]
#[inline]
pub unsafe fn as_ref<'a>(self) -> Option<&'a T> {
- if self.is_null() {
+ // Check for null via a cast to a thin pointer, so fat pointers are only
+ // considering their "data" part for null-ness.
+ if (self as *const u8).is_null() {
None
} else {
Some(&*self)
impl<T: ?Sized> *mut T {
/// Returns `true` if the pointer is null.
///
- /// Note that unsized types have many possible null pointers, as only the
- /// raw data pointer is considered, not their length, vtable, etc.
- /// Therefore, two pointers that are null may still not compare equal to
- /// each other.
- ///
/// # Examples
///
/// Basic usage:
/// ```
#[stable(feature = "rust1", since = "1.0.0")]
#[inline]
- pub fn is_null(self) -> bool {
- // Compare via a cast to a thin pointer, so fat pointers are only
- // considering their "data" part for null-ness.
- (self as *mut u8) == null_mut()
+ pub fn is_null(self) -> bool where T: Sized {
+ self == null_mut()
}
/// Returns `None` if the pointer is null, or else returns a reference to
#[stable(feature = "ptr_as_ref", since = "1.9.0")]
#[inline]
pub unsafe fn as_ref<'a>(self) -> Option<&'a T> {
- if self.is_null() {
+ // Check for null via a cast to a thin pointer, so fat pointers are only
+ // considering their "data" part for null-ness.
+ if (self as *const u8).is_null() {
None
} else {
Some(&*self)
#[stable(feature = "ptr_as_ref", since = "1.9.0")]
#[inline]
pub unsafe fn as_mut<'a>(self) -> Option<&'a mut T> {
- if self.is_null() {
+ // Check for null via a cast to a thin pointer, so fat pointers are only
+ // considering their "data" part for null-ness.
+ if (self as *mut u8).is_null() {
None
} else {
Some(&mut *self)
let mq = unsafe { mp.offset(1) };
assert!(!mq.is_null());
-
- // Pointers to unsized types -- slices
- let s: &mut [u8] = &mut [1, 2, 3];
- let cs: *const [u8] = s;
- assert!(!cs.is_null());
-
- let ms: *mut [u8] = s;
- assert!(!ms.is_null());
-
- let cz: *const [u8] = &[];
- assert!(!cz.is_null());
-
- let mz: *mut [u8] = &mut [];
- assert!(!mz.is_null());
-
- let ncs: *const [u8] = null::<[u8; 3]>();
- assert!(ncs.is_null());
-
- let nms: *mut [u8] = null_mut::<[u8; 3]>();
- assert!(nms.is_null());
-
- // Pointers to unsized types -- trait objects
- let ci: *const ToString = &3;
- assert!(!ci.is_null());
-
- let mi: *mut ToString = &mut 3;
- assert!(!mi.is_null());
-
- let nci: *const ToString = null::<isize>();
- assert!(nci.is_null());
-
- let nmi: *mut ToString = null_mut::<isize>();
- assert!(nmi.is_null());
}
#[test]