|
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