1 #![warn(clippy::manual_retain)]
2 #![allow(unused, clippy::redundant_clone)]
3 use std
::collections
::{BTreeMap, BTreeSet, BinaryHeap, HashMap, HashSet, VecDeque}
;
19 fn binary_heap_retain() {
20 let mut binary_heap
= BinaryHeap
::from([1, 2, 3]);
22 binary_heap
= binary_heap
.into_iter().filter(|x
| x
% 2 == 0).collect();
23 binary_heap
= binary_heap
.iter().filter(|&x
| x
% 2 == 0).copied().collect();
24 binary_heap
= binary_heap
.iter().filter(|&x
| x
% 2 == 0).cloned().collect();
26 // Do not lint, because type conversion is performed
27 binary_heap
= binary_heap
29 .filter(|x
| x
% 2 == 0)
30 .collect
::<BinaryHeap
<i8>>();
31 binary_heap
= binary_heap
33 .filter(|&x
| x
% 2 == 0)
35 .collect
::<BinaryHeap
<i8>>();
36 binary_heap
= binary_heap
38 .filter(|&x
| x
% 2 == 0)
40 .collect
::<BinaryHeap
<i8>>();
42 // Do not lint, because this expression is not assign.
43 let mut bar
: BinaryHeap
<i8> = binary_heap
.iter().filter(|&x
| x
% 2 == 0).copied().collect();
44 let mut foobar
: BinaryHeap
<i8> = binary_heap
.into_iter().filter(|x
| x
% 2 == 0).collect();
46 // Do not lint, because it is an assignment to a different variable.
47 bar
= foobar
.iter().filter(|&x
| x
% 2 == 0).copied().collect();
48 bar
= foobar
.into_iter().filter(|x
| x
% 2 == 0).collect();
51 fn btree_map_retain() {
52 let mut btree_map
: BTreeMap
<i8, i8> = (0..8).map(|x
| (x
, x
* 10)).collect();
54 btree_map
= btree_map
.into_iter().filter(|(k
, _
)| k
% 2 == 0).collect();
55 btree_map
= btree_map
.into_iter().filter(|(_
, v
)| v
% 2 == 0).collect();
58 .filter(|(k
, v
)| (k
% 2 == 0) && (v
% 2 == 0))
64 .filter(|(x
, _
)| x
% 2 == 0)
65 .collect
::<BTreeMap
<i8, i8>>();
67 // Do not lint, because this expression is not assign.
68 let mut foobar
: BTreeMap
<i8, i8> = btree_map
.into_iter().filter(|(k
, _
)| k
% 2 == 0).collect();
70 // Do not lint, because it is an assignment to a different variable.
71 btree_map
= foobar
.into_iter().filter(|(k
, _
)| k
% 2 == 0).collect();
74 fn btree_set_retain() {
75 let mut btree_set
= BTreeSet
::from([1, 2, 3, 4, 5, 6]);
78 btree_set
= btree_set
.iter().filter(|&x
| x
% 2 == 0).copied().collect();
79 btree_set
= btree_set
.iter().filter(|&x
| x
% 2 == 0).cloned().collect();
80 btree_set
= btree_set
.into_iter().filter(|x
| x
% 2 == 0).collect();
82 // Do not lint, because type conversion is performed
85 .filter(|&x
| x
% 2 == 0)
87 .collect
::<BTreeSet
<i8>>();
91 .filter(|&x
| x
% 2 == 0)
93 .collect
::<BTreeSet
<i8>>();
95 btree_set
= btree_set
.into_iter().filter(|x
| x
% 2 == 0).collect
::<BTreeSet
<i8>>();
97 // Do not lint, because this expression is not assign.
98 let mut foobar
: BTreeSet
<i8> = btree_set
.iter().filter(|&x
| x
% 2 == 0).copied().collect();
99 let mut bar
: BTreeSet
<i8> = btree_set
.into_iter().filter(|x
| x
% 2 == 0).collect();
101 // Do not lint, because it is an assignment to a different variable.
102 bar
= foobar
.iter().filter(|&x
| x
% 2 == 0).copied().collect();
103 bar
= foobar
.iter().filter(|&x
| x
% 2 == 0).cloned().collect();
104 bar
= foobar
.into_iter().filter(|x
| x
% 2 == 0).collect();
107 fn hash_map_retain() {
108 let mut hash_map
: HashMap
<i8, i8> = (0..8).map(|x
| (x
, x
* 10)).collect();
110 hash_map
= hash_map
.into_iter().filter(|(k
, _
)| k
% 2 == 0).collect();
111 hash_map
= hash_map
.into_iter().filter(|(_
, v
)| v
% 2 == 0).collect();
114 .filter(|(k
, v
)| (k
% 2 == 0) && (v
% 2 == 0))
120 .filter(|(x
, _
)| x
% 2 == 0)
121 .collect
::<HashMap
<i8, i8>>();
123 // Do not lint, because this expression is not assign.
124 let mut foobar
: HashMap
<i8, i8> = hash_map
.into_iter().filter(|(k
, _
)| k
% 2 == 0).collect();
126 // Do not lint, because it is an assignment to a different variable.
127 hash_map
= foobar
.into_iter().filter(|(k
, _
)| k
% 2 == 0).collect();
130 fn hash_set_retain() {
131 let mut hash_set
= HashSet
::from([1, 2, 3, 4, 5, 6]);
133 hash_set
= hash_set
.into_iter().filter(|x
| x
% 2 == 0).collect();
134 hash_set
= hash_set
.iter().filter(|&x
| x
% 2 == 0).copied().collect();
135 hash_set
= hash_set
.iter().filter(|&x
| x
% 2 == 0).cloned().collect();
137 // Do not lint, because type conversion is performed
138 hash_set
= hash_set
.into_iter().filter(|x
| x
% 2 == 0).collect
::<HashSet
<i8>>();
141 .filter(|&x
| x
% 2 == 0)
143 .collect
::<HashSet
<i8>>();
147 .filter(|&x
| x
% 2 == 0)
149 .collect
::<HashSet
<i8>>();
151 // Do not lint, because this expression is not assign.
152 let mut bar
: HashSet
<i8> = hash_set
.iter().filter(|&x
| x
% 2 == 0).copied().collect();
153 let mut foobar
: HashSet
<i8> = hash_set
.into_iter().filter(|x
| x
% 2 == 0).collect();
155 // Do not lint, because it is an assignment to a different variable.
156 bar
= foobar
.iter().filter(|&x
| x
% 2 == 0).copied().collect();
157 bar
= foobar
.iter().filter(|&x
| x
% 2 == 0).cloned().collect();
158 bar
= foobar
.into_iter().filter(|&x
| x
% 2 == 0).collect();
162 let mut s
= String
::from("foobar");
164 s
= s
.chars().filter(|&c
| c
!= 'o'
).to_owned().collect();
166 // Do not lint, because this expression is not assign.
167 let mut bar
: String
= s
.chars().filter(|&c
| c
!= 'o'
).to_owned().collect();
169 // Do not lint, because it is an assignment to a different variable.
170 s
= bar
.chars().filter(|&c
| c
!= 'o'
).to_owned().collect();
174 let mut vec
= vec
![0, 1, 2];
176 vec
= vec
.iter().filter(|&x
| x
% 2 == 0).copied().collect();
177 vec
= vec
.iter().filter(|&x
| x
% 2 == 0).cloned().collect();
178 vec
= vec
.into_iter().filter(|x
| x
% 2 == 0).collect();
180 // Do not lint, because type conversion is performed
181 vec
= vec
.into_iter().filter(|x
| x
% 2 == 0).collect
::<Vec
<i8>>();
182 vec
= vec
.iter().filter(|&x
| x
% 2 == 0).copied().collect
::<Vec
<i8>>();
183 vec
= vec
.iter().filter(|&x
| x
% 2 == 0).cloned().collect
::<Vec
<i8>>();
185 // Do not lint, because this expression is not assign.
186 let mut bar
: Vec
<i8> = vec
.iter().filter(|&x
| x
% 2 == 0).copied().collect();
187 let mut foobar
: Vec
<i8> = vec
.into_iter().filter(|x
| x
% 2 == 0).collect();
189 // Do not lint, because it is an assignment to a different variable.
190 bar
= foobar
.iter().filter(|&x
| x
% 2 == 0).copied().collect();
191 bar
= foobar
.iter().filter(|&x
| x
% 2 == 0).cloned().collect();
192 bar
= foobar
.into_iter().filter(|x
| x
% 2 == 0).collect();
195 fn vec_deque_retain() {
196 let mut vec_deque
= VecDeque
::new();
197 vec_deque
.extend(1..5);
200 vec_deque
= vec_deque
.iter().filter(|&x
| x
% 2 == 0).copied().collect();
201 vec_deque
= vec_deque
.iter().filter(|&x
| x
% 2 == 0).cloned().collect();
202 vec_deque
= vec_deque
.into_iter().filter(|x
| x
% 2 == 0).collect();
204 // Do not lint, because type conversion is performed
205 vec_deque
= vec_deque
207 .filter(|&x
| x
% 2 == 0)
209 .collect
::<VecDeque
<i8>>();
210 vec_deque
= vec_deque
212 .filter(|&x
| x
% 2 == 0)
214 .collect
::<VecDeque
<i8>>();
215 vec_deque
= vec_deque
.into_iter().filter(|x
| x
% 2 == 0).collect
::<VecDeque
<i8>>();
217 // Do not lint, because this expression is not assign.
218 let mut bar
: VecDeque
<i8> = vec_deque
.iter().filter(|&x
| x
% 2 == 0).copied().collect();
219 let mut foobar
: VecDeque
<i8> = vec_deque
.into_iter().filter(|x
| x
% 2 == 0).collect();
221 // Do not lint, because it is an assignment to a different variable.
222 bar
= foobar
.iter().filter(|&x
| x
% 2 == 0).copied().collect();
223 bar
= foobar
.iter().filter(|&x
| x
% 2 == 0).cloned().collect();
224 bar
= foobar
.into_iter().filter(|x
| x
% 2 == 0).collect();
227 #[clippy::msrv = "1.69"]
229 let mut binary_heap
= BinaryHeap
::from([1, 2, 3]);
230 binary_heap
= binary_heap
.into_iter().filter(|x
| x
% 2 == 0).collect();
233 #[clippy::msrv = "1.52"]
235 let mut btree_map
: BTreeMap
<i8, i8> = (0..8).map(|x
| (x
, x
* 10)).collect();
236 btree_map
= btree_map
.into_iter().filter(|(k
, _
)| k
% 2 == 0).collect();
238 let mut btree_set
= BTreeSet
::from([1, 2, 3, 4, 5, 6]);
239 btree_set
= btree_set
.iter().filter(|&x
| x
% 2 == 0).copied().collect();
242 #[clippy::msrv = "1.25"]
244 let mut s
= String
::from("foobar");
245 s
= s
.chars().filter(|&c
| c
!= 'o'
).to_owned().collect();
248 #[clippy::msrv = "1.17"]
250 let mut hash_set
= HashSet
::from([1, 2, 3, 4, 5, 6]);
251 hash_set
= hash_set
.into_iter().filter(|x
| x
% 2 == 0).collect();
252 let mut hash_map
: HashMap
<i8, i8> = (0..8).map(|x
| (x
, x
* 10)).collect();
253 hash_map
= hash_map
.into_iter().filter(|(k
, _
)| k
% 2 == 0).collect();