|
1 | 1 | //@compile-flags: -Zmiri-strict-provenance
|
| 2 | +#![feature(iter_advance_by, iter_next_chunk)] |
| 3 | + |
2 | 4 | // Gather all references from a mutable iterator and make sure Miri notices if
|
3 | 5 | // using them is dangerous.
|
4 | 6 | fn test_all_refs<'a, T: 'a>(dummy: &mut T, iter: impl Iterator<Item = &'a mut T>) {
|
@@ -37,15 +39,31 @@ fn vec_into_iter() -> u8 {
|
37 | 39 | }
|
38 | 40 |
|
39 | 41 | fn vec_into_iter_rev() -> u8 {
|
40 |
| - vec![1, 2, 3, 4].into_iter().map(|x| x * x).fold(0, |x, y| x + y) |
| 42 | + vec![1, 2, 3, 4].into_iter().rev().map(|x| x * x).fold(0, |x, y| x + y) |
41 | 43 | }
|
42 | 44 |
|
43 |
| -fn vec_into_iter_zst() -> usize { |
44 |
| - vec![[0u64; 0], [0u64; 0]].into_iter().rev().map(|x| x.len()).sum() |
| 45 | +fn vec_into_iter_zst() { |
| 46 | + for _ in vec![[0u64; 0]].into_iter() {} |
| 47 | + let v = vec![[0u64; 0], [0u64; 0]].into_iter().map(|x| x.len()).sum::<usize>(); |
| 48 | + assert_eq!(v, 0); |
| 49 | + |
| 50 | + let mut it = vec![[0u64; 0], [0u64; 0]].into_iter(); |
| 51 | + it.advance_by(1); |
| 52 | + drop(it); |
| 53 | + |
| 54 | + let mut it = vec![[0u64; 0], [0u64; 0]].into_iter(); |
| 55 | + it.next_chunk::<1>().unwrap(); |
| 56 | + drop(it); |
| 57 | + |
| 58 | + let mut it = vec![[0u64; 0], [0u64; 0]].into_iter(); |
| 59 | + it.next_chunk::<4>().unwrap_err(); |
| 60 | + drop(it); |
45 | 61 | }
|
46 | 62 |
|
47 |
| -fn vec_into_iter_rev_zst() -> usize { |
48 |
| - vec![[0u64; 0], [0u64; 0]].into_iter().rev().map(|x| x.len()).sum() |
| 63 | +fn vec_into_iter_rev_zst() { |
| 64 | + for _ in vec![[0u64; 0]; 5].into_iter().rev() {} |
| 65 | + let v = vec![[0u64; 0], [0u64; 0]].into_iter().rev().map(|x| x.len()).sum::<usize>(); |
| 66 | + assert_eq!(v, 0); |
49 | 67 | }
|
50 | 68 |
|
51 | 69 | fn vec_iter_and_mut() {
|
@@ -150,8 +168,8 @@ fn main() {
|
150 | 168 | assert_eq!(vec_into_iter(), 30);
|
151 | 169 | assert_eq!(vec_into_iter_rev(), 30);
|
152 | 170 | vec_iter_and_mut();
|
153 |
| - assert_eq!(vec_into_iter_zst(), 0); |
154 |
| - assert_eq!(vec_into_iter_rev_zst(), 0); |
| 171 | + vec_into_iter_zst(); |
| 172 | + vec_into_iter_rev_zst(); |
155 | 173 | vec_iter_and_mut_rev();
|
156 | 174 |
|
157 | 175 | assert_eq!(make_vec().capacity(), 4);
|
|
0 commit comments