]> git.lizzy.rs Git - rust.git/blob - src/tools/miri/tests/pass/linked-list.rs
Auto merge of #104915 - weihanglo:update-cargo, r=ehuss
[rust.git] / src / tools / miri / tests / pass / linked-list.rs
1 #![feature(linked_list_cursors)]
2 use std::collections::LinkedList;
3
4 fn list_from<T: Clone>(v: &[T]) -> LinkedList<T> {
5     v.iter().cloned().collect()
6 }
7
8 // Gather all references from a mutable iterator and make sure Miri notices if
9 // using them is dangerous.
10 fn test_all_refs<'a, T: 'a>(dummy: &mut T, iter: impl Iterator<Item = &'a mut T>) {
11     // Gather all those references.
12     let mut refs: Vec<&mut T> = iter.collect();
13     // Use them all. Twice, to be sure we got all interleavings.
14     for r in refs.iter_mut() {
15         std::mem::swap(dummy, r);
16     }
17     for r in refs {
18         std::mem::swap(dummy, r);
19     }
20 }
21
22 fn main() {
23     let mut m = list_from(&[0, 2, 4, 6, 8]);
24     let len = m.len();
25     {
26         let mut it = m.cursor_front_mut();
27         it.insert_before(-2);
28         loop {
29             match it.current().copied() {
30                 None => break,
31                 Some(elt) => {
32                     match it.peek_next() {
33                         Some(x) => assert_eq!(*x, elt + 2),
34                         None => assert_eq!(8, elt),
35                     }
36                     it.insert_after(elt + 1);
37                     it.move_next(); // Move by 2 to skip the one we inserted.
38                     it.move_next();
39                 }
40             }
41         }
42         it.insert_before(99);
43         it.insert_after(-10);
44     }
45
46     assert_eq!(m.len(), 3 + len * 2);
47     let mut m2 = m.clone();
48     assert_eq!(m.into_iter().collect::<Vec<_>>(), [-10, -2, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 99]);
49
50     test_all_refs(&mut 13, m2.iter_mut());
51 }