|
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