| 
448 | 448 | 
 
  | 
449 | 449 | use crate::cmp::Ordering;  | 
450 | 450 | use crate::marker::FnPtr;  | 
451 |  | -use crate::mem::{self, MaybeUninit};  | 
 | 451 | +use crate::mem::{self, MaybeUninit, SizedTypeProperties};  | 
452 | 452 | use crate::{fmt, hash, intrinsics, ub_checks};  | 
453 | 453 | 
 
  | 
454 | 454 | mod alignment;  | 
@@ -1165,10 +1165,12 @@ pub const unsafe fn swap_nonoverlapping<T>(x: *mut T, y: *mut T, count: usize) {  | 
1165 | 1165 |             size: usize = size_of::<T>(),  | 
1166 | 1166 |             align: usize = align_of::<T>(),  | 
1167 | 1167 |             count: usize = count,  | 
1168 |  | -        ) =>  | 
1169 |  | -        ub_checks::is_aligned_and_not_null(x, align)  | 
1170 |  | -            && ub_checks::is_aligned_and_not_null(y, align)  | 
1171 |  | -            && ub_checks::is_nonoverlapping(x, y, size, count)  | 
 | 1168 | +        ) => {  | 
 | 1169 | +            let zero_size = size == 0 || count == 0;  | 
 | 1170 | +            ub_checks::is_aligned_and_not_null(x, align, zero_size)  | 
 | 1171 | +                && ub_checks::is_aligned_and_not_null(y, align, zero_size)  | 
 | 1172 | +                && ub_checks::is_nonoverlapping(x, y, size, count)  | 
 | 1173 | +        }  | 
1172 | 1174 |     );  | 
1173 | 1175 | 
 
  | 
1174 | 1176 |     // Split up the slice into small power-of-two-sized chunks that LLVM is able  | 
@@ -1278,7 +1280,8 @@ pub const unsafe fn replace<T>(dst: *mut T, src: T) -> T {  | 
1278 | 1280 |             (  | 
1279 | 1281 |                 addr: *const () = dst as *const (),  | 
1280 | 1282 |                 align: usize = align_of::<T>(),  | 
1281 |  | -            ) => ub_checks::is_aligned_and_not_null(addr, align)  | 
 | 1283 | +                is_zst: bool = T::IS_ZST,  | 
 | 1284 | +            ) => ub_checks::is_aligned_and_not_null(addr, align, is_zst)  | 
1282 | 1285 |         );  | 
1283 | 1286 |         mem::replace(&mut *dst, src)  | 
1284 | 1287 |     }  | 
@@ -1430,7 +1433,8 @@ pub const unsafe fn read<T>(src: *const T) -> T {  | 
1430 | 1433 |             (  | 
1431 | 1434 |                 addr: *const () = src as *const (),  | 
1432 | 1435 |                 align: usize = align_of::<T>(),  | 
1433 |  | -            ) => ub_checks::is_aligned_and_not_null(addr, align)  | 
 | 1436 | +                is_zst: bool = T::IS_ZST,  | 
 | 1437 | +            ) => ub_checks::is_aligned_and_not_null(addr, align, is_zst)  | 
1434 | 1438 |         );  | 
1435 | 1439 |         crate::intrinsics::read_via_copy(src)  | 
1436 | 1440 |     }  | 
@@ -1635,7 +1639,8 @@ pub const unsafe fn write<T>(dst: *mut T, src: T) {  | 
1635 | 1639 |             (  | 
1636 | 1640 |                 addr: *mut () = dst as *mut (),  | 
1637 | 1641 |                 align: usize = align_of::<T>(),  | 
1638 |  | -            ) => ub_checks::is_aligned_and_not_null(addr, align)  | 
 | 1642 | +                is_zst: bool = T::IS_ZST,  | 
 | 1643 | +            ) => ub_checks::is_aligned_and_not_null(addr, align, is_zst)  | 
1639 | 1644 |         );  | 
1640 | 1645 |         intrinsics::write_via_move(dst, src)  | 
1641 | 1646 |     }  | 
@@ -1808,7 +1813,8 @@ pub unsafe fn read_volatile<T>(src: *const T) -> T {  | 
1808 | 1813 |             (  | 
1809 | 1814 |                 addr: *const () = src as *const (),  | 
1810 | 1815 |                 align: usize = align_of::<T>(),  | 
1811 |  | -            ) => ub_checks::is_aligned_and_not_null(addr, align)  | 
 | 1816 | +                is_zst: bool = T::IS_ZST,  | 
 | 1817 | +            ) => ub_checks::is_aligned_and_not_null(addr, align, is_zst)  | 
1812 | 1818 |         );  | 
1813 | 1819 |         intrinsics::volatile_load(src)  | 
1814 | 1820 |     }  | 
@@ -1887,7 +1893,8 @@ pub unsafe fn write_volatile<T>(dst: *mut T, src: T) {  | 
1887 | 1893 |             (  | 
1888 | 1894 |                 addr: *mut () = dst as *mut (),  | 
1889 | 1895 |                 align: usize = align_of::<T>(),  | 
1890 |  | -            ) => ub_checks::is_aligned_and_not_null(addr, align)  | 
 | 1896 | +                is_zst: bool = T::IS_ZST,  | 
 | 1897 | +            ) => ub_checks::is_aligned_and_not_null(addr, align, is_zst)  | 
1891 | 1898 |         );  | 
1892 | 1899 |         intrinsics::volatile_store(dst, src);  | 
1893 | 1900 |     }  | 
 | 
0 commit comments