parent
336209eef1
commit
4426e9a3c2
2 changed files with 12 additions and 13 deletions
|
@ -40,19 +40,8 @@ impl_is_zero!(char, |x| x == '\0');
|
|||
impl_is_zero!(f32, |x: f32| x.to_bits() == 0);
|
||||
impl_is_zero!(f64, |x: f64| x.to_bits() == 0);
|
||||
|
||||
unsafe impl<T> IsZero for *const T {
|
||||
#[inline]
|
||||
fn is_zero(&self) -> bool {
|
||||
(*self).is_null()
|
||||
}
|
||||
}
|
||||
|
||||
unsafe impl<T> IsZero for *mut T {
|
||||
#[inline]
|
||||
fn is_zero(&self) -> bool {
|
||||
(*self).is_null()
|
||||
}
|
||||
}
|
||||
// `IsZero` cannot be soundly implemented for pointers because of provenance
|
||||
// (see #135338).
|
||||
|
||||
unsafe impl<T: IsZero, const N: usize> IsZero for [T; N] {
|
||||
#[inline]
|
||||
|
|
|
@ -2742,3 +2742,13 @@ fn max_swap_remove() {
|
|||
let mut v = vec![0];
|
||||
v.swap_remove(usize::MAX);
|
||||
}
|
||||
|
||||
// Regression test for #135338
|
||||
#[test]
|
||||
fn vec_null_ptr_roundtrip() {
|
||||
let ptr = std::ptr::from_ref(&42);
|
||||
let zero = ptr.with_addr(0);
|
||||
let roundtripped = vec![zero; 1].pop().unwrap();
|
||||
let new = roundtripped.with_addr(ptr.addr());
|
||||
unsafe { new.read() };
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue