1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#![allow(unused)]
#![cfg(doctest)]
// IMPORTANT: Run the test in +nightly to verify the error codes
// (Cargo doesn't test them in the stable version...)
mod borrows {
/// ```compile_fail,E0502
/// use vectree::VecTree; // | let a = tree.get_mut(1);
/// // | ---- mutable borrow occurs here
/// let mut tree = VecTree::new(); // | let b = tree.get(2); // cannot borrow `tree` as immutable because it is also borrowed as mutable
/// let a = tree.get_mut(1); // | ^^^^ immutable borrow occurs here
/// let b = tree.get(2); // | *a = "0".to_string();
/// *a = "0".to_string(); // | -- mutable borrow later used here
/// ```
fn must_not_compile1() {}
/// ```compile_fail,E0502
/// use vectree::VecTree;
/// // | let a = tree.get(1);
/// let mut tree = VecTree::new(); // | ---- immutable borrow occurs here
/// let a = tree.get(1); // | let b = tree.get_mut(2); // cannot borrow `tree` as mutable because it is also borrowed as immutable
/// let b = tree.get_mut(2); // | ^^^^^^^^^^^^^^^ mutable borrow occurs here
/// *b = "0".to_string(); // | *b = "0".to_string();
/// assert_eq!(a, "a"); // | assert_eq!(a, "a");
/// ``` // | ------------------ immutable borrow later used here
fn must_not_compile2() {}
/// ```compile_fail,E0502
/// use vectree::VecTree;
/// // |
/// let mut tree = VecTree::<String>::new(); // | let a = tree.get(1);
/// let a = tree.get(1); // | ---- immutable borrow occurs here
/// for mut inode in tree.iter_post_depth_mut() { // | for mut inode in tree.iter_post_depth_mut() { // cannot borrow `tree` as mutable because it is also borrowed as immutable
/// *inode = inode.to_uppercase(); // | ^^^^^^^^^^^^^^^^^^^^^^^^ mutable borrow occurs here
/// }
/// assert_eq!(a, "A");
/// ```
fn must_not_compile3() {}
/// ```compile_fail,E0502
/// use std::ops::Deref;
/// use vectree::VecTree;
///
/// let mut tree = VecTree::<i32>::new(); // | let mut iter = tree.iter_post_depth_simple();
/// let mut iter = tree.iter_post_depth_simple(); // | ---- immutable borrow occurs here
/// let a1_borrowed = iter.next().unwrap(); // | let a1_borrowed = iter.next().unwrap();
/// tree.clear(); // | tree.clear();
/// let value = a1_borrowed.deref(); // | ^^^^^^^^^^^^ mutable borrow occurs here
/// println!("value: {value}"); // | let value = a1_borrowed.deref();
/// ```
fn must_not_compile4() {}
/// ```compile_fail,E0502
/// use std::ops::Deref;
/// use vectree::VecTree;
///
/// let mut tree = VecTree::<i32>::new(); // | let mut iter = tree.iter_post_depth();
/// let mut iter = tree.iter_post_depth(); // | ---- immutable borrow occurs here
/// let a1_borrowed = iter.next().unwrap(); // | let a1_borrowed = iter.next().unwrap();
/// tree.clear(); // | tree.clear();
/// let value = a1_borrowed.deref(); // | ^^^^^^^^^^^^ mutable borrow occurs here
/// println!("value: {value}"); // | let value = a1_borrowed.deref();
/// ```
fn must_not_compile5() {}
/// ```compile_fail,E0502
/// use std::ops::Deref;
/// use vectree::VecTree;
///
/// let mut tree = VecTree::<i32>::new();
/// let mut iter = tree.iter_post_depth(); // |
/// let _a1 = iter.next(); // | let mut iter = tree.iter_post_depth();
/// let _a2 = iter.next(); // | ---- immutable borrow occurs here
/// let a = iter.next().unwrap(); //
/// let a1_borrowed = a.iter_children() // | tree.clear(); // OK: doesn't compile
/// .next().unwrap(); // | ^^^^^^^^^^^^ mutable borrow occurs here
/// tree.clear(); // | let value = a1_borrowed.deref();
/// let value = a1_borrowed.deref(); // | ----------- immutable borrow later used here
/// println!("value: {value}");
/// ```
fn must_not_compile6() {}
/// ```compile_fail,E0502
/// use std::ops::Deref;
/// use vectree::VecTree;
///
/// let mut tree = VecTree::<String>::new();
/// let mut iter = tree.iter_post_depth(); // |
/// let _a1 = iter.next(); // | let mut iter = tree.iter_post_depth();
/// let _a2 = iter.next(); // | ---- immutable borrow occurs here
/// let a = iter.next().unwrap(); //
/// let a1_borrowed = a.iter_children() // | let a1_mut = tree.get_mut(4);
/// .next().unwrap(); // | ^^^^^^^^^^^^^^^ mutable borrow occurs here
/// let value1 = a1_borrowed.clone(); // | *a1_mut = "new a1".to_string();
/// let a1_mut = tree.get_mut(4); // | let value2 = a1_borrowed.clone();
/// *a1_mut = "new a1".to_string(); // | ----------- immutable borrow later used here
/// let value2 = a1_borrowed.clone();
/// println!("value: {value1}, {value2}");
/// ```
fn must_not_compile7() {}
/// ```compile_fail,E0499
/// use std::ops::Deref;
/// use vectree::VecTree;
///
/// let mut tree = VecTree::<i32>::new();
/// let mut iter = tree.iter_post_depth_mut(); // |
/// let _a1 = iter.next().unwrap(); // | let mut iter = tree.iter_post_depth_mut();
/// let _a2 = iter.next(); // | ---- first mutable borrow occurs here
/// let a_mut = iter.next().unwrap(); //
/// let a1_borrowed = a_mut.iter_children() // | tree.clear();
/// .next().unwrap(); // | ^^^^ second mutable borrow occurs here
/// tree.clear();
/// let value = a1_borrowed.deref();
/// println!("value: {value}");
/// ```
fn must_not_compile8() {}
/// ```compile_fail,E0502
/// use vectree::VecTree;
///
/// let mut tree = VecTree::<String>::new();
/// let mut iter = tree.iter_post_depth_mut();
/// let mut a1_mut = iter.next().unwrap(); // |
/// let a1_borrowed = tree.get(4); // | let mut iter = tree.iter_post_depth_mut();
/// let value1 = a1_borrowed.clone(); // | ---- mutable borrow occurs here
/// *a1_mut = "new a1".to_string(); //
/// let value2 = a1_borrowed.clone(); // | let a1_borrowed = tree.get(4);
/// println!("value: {value1}, {value2}"); // | ^^^^ immutable borrow occurs here
/// ````
fn must_not_compile9() {}
}