| //@revisions: stack tree tree_implicit_writes | |
| //@[tree_implicit_writes]compile-flags: -Zmiri-tree-borrows -Zmiri-tree-borrows-implicit-writes | |
| //@compile-flags: -Zmiri-strict-provenance | |
| //@[tree]compile-flags: -Zmiri-tree-borrows | |
| use std::collections::VecDeque; | |
| fn test_all_refs<'a, T: 'a>(dummy: &mut T, iter: impl Iterator<Item = &'a mut T>) { | |
| // Gather all those references. | |
| let mut refs: Vec<&mut T> = iter.collect(); | |
| // Use them all. Twice, to be sure we got all interleavings. | |
| for r in refs.iter_mut() { | |
| std::mem::swap(dummy, r); | |
| } | |
| for r in refs { | |
| std::mem::swap(dummy, r); | |
| } | |
| } | |
| fn main() { | |
| let mut dst = VecDeque::new(); | |
| dst.push_front(Box::new(1)); | |
| dst.push_front(Box::new(2)); | |
| dst.pop_back(); | |
| let mut src = VecDeque::new(); | |
| src.push_front(Box::new(2)); | |
| dst.append(&mut src); | |
| for a in dst.iter() { | |
| assert_eq!(**a, 2); | |
| } | |
| // Regression test for Debug impl's | |
| let _ = format!("{:?} {:?}", dst, dst.iter()); | |
| let _ = format!("{:?}", VecDeque::<u32>::new().iter()); | |
| for a in dst { | |
| assert_eq!(*a, 2); | |
| } | |
| // # Aliasing tests. | |
| let mut v = std::collections::VecDeque::new(); | |
| v.push_back(1); | |
| v.push_back(2); | |
| // Test `fold` bad aliasing. | |
| let mut it = v.iter_mut(); | |
| let ref0 = it.next().unwrap(); | |
| let sum = it.fold(0, |x, y| x + *y); | |
| assert_eq!(*ref0 + sum, 3); | |
| // Test general iterator aliasing. | |
| v.push_front(0); | |
| test_all_refs(&mut 0, v.iter_mut()); | |
| } |