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!(f32, |x: f32| x.to_bits() == 0);
|
||||||
impl_is_zero!(f64, |x: f64| x.to_bits() == 0);
|
impl_is_zero!(f64, |x: f64| x.to_bits() == 0);
|
||||||
|
|
||||||
unsafe impl<T> IsZero for *const T {
|
// `IsZero` cannot be soundly implemented for pointers because of provenance
|
||||||
#[inline]
|
// (see #135338).
|
||||||
fn is_zero(&self) -> bool {
|
|
||||||
(*self).is_null()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
unsafe impl<T> IsZero for *mut T {
|
|
||||||
#[inline]
|
|
||||||
fn is_zero(&self) -> bool {
|
|
||||||
(*self).is_null()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
unsafe impl<T: IsZero, const N: usize> IsZero for [T; N] {
|
unsafe impl<T: IsZero, const N: usize> IsZero for [T; N] {
|
||||||
#[inline]
|
#[inline]
|
||||||
|
|
|
@ -2742,3 +2742,13 @@ fn max_swap_remove() {
|
||||||
let mut v = vec![0];
|
let mut v = vec![0];
|
||||||
v.swap_remove(usize::MAX);
|
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