]> git.lizzy.rs Git - rust.git/blob - src/tools/miri/tests/pass/vecdeque.rs
Auto merge of #104915 - weihanglo:update-cargo, r=ehuss
[rust.git] / src / tools / miri / tests / pass / vecdeque.rs
1 //@compile-flags: -Zmiri-strict-provenance
2 use std::collections::VecDeque;
3
4 fn test_all_refs<'a, T: 'a>(dummy: &mut T, iter: impl Iterator<Item = &'a mut T>) {
5     // Gather all those references.
6     let mut refs: Vec<&mut T> = iter.collect();
7     // Use them all. Twice, to be sure we got all interleavings.
8     for r in refs.iter_mut() {
9         std::mem::swap(dummy, r);
10     }
11     for r in refs {
12         std::mem::swap(dummy, r);
13     }
14 }
15
16 fn main() {
17     let mut dst = VecDeque::new();
18     dst.push_front(Box::new(1));
19     dst.push_front(Box::new(2));
20     dst.pop_back();
21
22     let mut src = VecDeque::new();
23     src.push_front(Box::new(2));
24     dst.append(&mut src);
25     for a in dst.iter() {
26         assert_eq!(**a, 2);
27     }
28
29     // Regression test for Debug impl's
30     println!("{:?} {:?}", dst, dst.iter());
31     println!("{:?}", VecDeque::<u32>::new().iter());
32
33     for a in dst {
34         assert_eq!(*a, 2);
35     }
36
37     // # Aliasing tests.
38     let mut v = std::collections::VecDeque::new();
39     v.push_back(1);
40     v.push_back(2);
41
42     // Test `fold` bad aliasing.
43     let mut it = v.iter_mut();
44     let ref0 = it.next().unwrap();
45     let sum = it.fold(0, |x, y| x + *y);
46     assert_eq!(*ref0 + sum, 3);
47
48     // Test general iterator aliasing.
49     v.push_front(0);
50     test_all_refs(&mut 0, v.iter_mut());
51 }