Skip to content

Commit aafefa1

Browse files
committed
fix IntoIter::drop on high-alignment ZST
1 parent be3a248 commit aafefa1

File tree

2 files changed

+12
-7
lines changed

2 files changed

+12
-7
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -639,6 +639,7 @@ Definite bugs found:
639639
* [Data race in `thread::scope`](https://github.com/rust-lang/rust/issues/98498)
640640
* [`regex` incorrectly handling unaligned `Vec<u8>` buffers](https://www.reddit.com/r/rust/comments/vq3mmu/comment/ienc7t0?context=3)
641641
* [Incorrect use of `compare_exchange_weak` in `once_cell`](https://github.com/matklad/once_cell/issues/186)
642+
* [Dropping with unaligned pointers in `vec::IntoIter`](https://github.com/rust-lang/rust/pull/106084)
642643

643644
Violations of [Stacked Borrows] found that are likely bugs (but Stacked Borrows is currently just an experiment):
644645

tests/pass/vec.rs

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,15 +37,19 @@ fn vec_into_iter() -> u8 {
3737
}
3838

3939
fn vec_into_iter_rev() -> u8 {
40-
vec![1, 2, 3, 4].into_iter().map(|x| x * x).fold(0, |x, y| x + y)
40+
vec![1, 2, 3, 4].into_iter().rev().map(|x| x * x).fold(0, |x, y| x + y)
4141
}
4242

43-
fn vec_into_iter_zst() -> usize {
44-
vec![[0u64; 0], [0u64; 0]].into_iter().rev().map(|x| x.len()).sum()
43+
fn vec_into_iter_zst() {
44+
for _ in vec![[0u64; 0]].into_iter() {}
45+
let v = vec![[0u64; 0], [0u64; 0]].into_iter().map(|x| x.len()).sum::<usize>();
46+
assert_eq!(v, 0);
4547
}
4648

47-
fn vec_into_iter_rev_zst() -> usize {
48-
vec![[0u64; 0], [0u64; 0]].into_iter().rev().map(|x| x.len()).sum()
49+
fn vec_into_iter_rev_zst() {
50+
for _ in vec![[0u64; 0]; 5].into_iter().rev() {}
51+
let v = vec![[0u64; 0], [0u64; 0]].into_iter().rev().map(|x| x.len()).sum::<usize>();
52+
assert_eq!(v, 0);
4953
}
5054

5155
fn vec_iter_and_mut() {
@@ -150,8 +154,8 @@ fn main() {
150154
assert_eq!(vec_into_iter(), 30);
151155
assert_eq!(vec_into_iter_rev(), 30);
152156
vec_iter_and_mut();
153-
assert_eq!(vec_into_iter_zst(), 0);
154-
assert_eq!(vec_into_iter_rev_zst(), 0);
157+
vec_into_iter_zst();
158+
vec_into_iter_rev_zst();
155159
vec_iter_and_mut_rev();
156160

157161
assert_eq!(make_vec().capacity(), 4);

0 commit comments

Comments
 (0)