Skip to content

Commit

Permalink
add lib tests for vec::IntoIter alignment issues
Browse files Browse the repository at this point in the history
  • Loading branch information
RalfJung committed Dec 24, 2022
1 parent 5eeb6c4 commit 4170f3b
Showing 1 changed file with 27 additions and 2 deletions.
29 changes: 27 additions & 2 deletions alloc/tests/vec.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@ use std::borrow::Cow;
use std::cell::Cell;
use std::collections::TryReserveErrorKind::*;
use std::fmt::Debug;
use std::hint;
use std::iter::InPlaceIterable;
use std::mem;
use std::mem::{size_of, swap};
use std::ops::Bound::*;
use std::panic::{catch_unwind, AssertUnwindSafe};
Expand Down Expand Up @@ -1107,8 +1109,31 @@ fn test_into_iter_drop_allocator() {

#[test]
fn test_into_iter_zst() {
for _ in vec![[0u64; 0]].into_iter() {}
for _ in vec![[0u64; 0]; 5].into_iter().rev() {}
#[derive(Debug, Clone)]
struct AlignedZstWithDrop([u64; 0]);
impl Drop for AlignedZstWithDrop {
fn drop(&mut self) {
let addr = self as *mut _ as usize;
assert!(hint::black_box(addr) % mem::align_of::<u64>() == 0);
}
}

const C: AlignedZstWithDrop = AlignedZstWithDrop([0u64; 0]);

for _ in vec![C].into_iter() {}
for _ in vec![C; 5].into_iter().rev() {}

let mut it = vec![C, C].into_iter();
it.advance_by(1).unwrap();
drop(it);

let mut it = vec![C, C].into_iter();
it.next_chunk::<1>().unwrap();
drop(it);

let mut it = vec![C, C].into_iter();
it.next_chunk::<4>().unwrap_err();
drop(it);
}

#[test]
Expand Down

0 comments on commit 4170f3b

Please sign in to comment.