diff --git a/library/alloc/src/vec/into_iter.rs b/library/alloc/src/vec/into_iter.rs index 358bdeacae790..af68938399889 100644 --- a/library/alloc/src/vec/into_iter.rs +++ b/library/alloc/src/vec/into_iter.rs @@ -411,7 +411,12 @@ impl DoubleEndedIterator for IntoIter { // SAFETY: same as for advance_by() self.end = unsafe { self.end.sub(step_size) }; } - let to_drop = ptr::slice_from_raw_parts_mut(self.end as *mut T, step_size); + let to_drop = if T::IS_ZST { + //ZST may cause unalignment + ptr::slice_from_raw_parts_mut(ptr::NonNull::::dangling().as_ptr(), step_size) + } else { + ptr::slice_from_raw_parts_mut(self.end as *mut T, step_size) + }; // SAFETY: same as for advance_by() unsafe { ptr::drop_in_place(to_drop); @@ -419,7 +424,6 @@ impl DoubleEndedIterator for IntoIter { NonZero::new(n - step_size).map_or(Ok(()), Err) } } - #[stable(feature = "rust1", since = "1.0.0")] impl ExactSizeIterator for IntoIter { fn is_empty(&self) -> bool { diff --git a/tests/ui/iterators/ZST-nthback.rs b/tests/ui/iterators/ZST-nthback.rs new file mode 100644 index 0000000000000..14ee98857b442 --- /dev/null +++ b/tests/ui/iterators/ZST-nthback.rs @@ -0,0 +1,10 @@ +//@ check-pass +// test Intolter::nth_back does not cause UB for ZSTs with high alignment + +#[repr(align(8))] +struct Thing; + +fn main() { + let v = vec![Thing, Thing]; + let _ = v.into_iter().nth_back(1); +}