]> git.proxmox.com Git - rustc.git/blob - src/tools/clippy/tests/ui/search_is_some_fixable_some.rs
New upstream version 1.64.0+dfsg1
[rustc.git] / src / tools / clippy / tests / ui / search_is_some_fixable_some.rs
1 // run-rustfix
2 #![allow(dead_code, clippy::explicit_auto_deref)]
3 #![warn(clippy::search_is_some)]
4
5 fn main() {
6 let v = vec![3, 2, 1, 0, -1, -2, -3];
7 let y = &&42;
8
9 // Check `find().is_some()`, single-line case.
10 let _ = v.iter().find(|&x| *x < 0).is_some();
11 let _ = (0..1).find(|x| **y == *x).is_some(); // one dereference less
12 let _ = (0..1).find(|x| *x == 0).is_some();
13 let _ = v.iter().find(|x| **x == 0).is_some();
14 let _ = (4..5).find(|x| *x == 1 || *x == 3 || *x == 5).is_some();
15 let _ = (1..3).find(|x| [1, 2, 3].contains(x)).is_some();
16 let _ = (1..3).find(|x| *x == 0 || [1, 2, 3].contains(x)).is_some();
17 let _ = (1..3).find(|x| [1, 2, 3].contains(x) || *x == 0).is_some();
18 let _ = (1..3)
19 .find(|x| [1, 2, 3].contains(x) || *x == 0 || [4, 5, 6].contains(x) || *x == -1)
20 .is_some();
21
22 // Check `position().is_some()`, single-line case.
23 let _ = v.iter().position(|&x| x < 0).is_some();
24
25 // Check `rposition().is_some()`, single-line case.
26 let _ = v.iter().rposition(|&x| x < 0).is_some();
27
28 let s1 = String::from("hello world");
29 let s2 = String::from("world");
30 // caller of `find()` is a `&`static str`
31 let _ = "hello world".find("world").is_some();
32 let _ = "hello world".find(&s2).is_some();
33 let _ = "hello world".find(&s2[2..]).is_some();
34 // caller of `find()` is a `String`
35 let _ = s1.find("world").is_some();
36 let _ = s1.find(&s2).is_some();
37 let _ = s1.find(&s2[2..]).is_some();
38 // caller of `find()` is slice of `String`
39 let _ = s1[2..].find("world").is_some();
40 let _ = s1[2..].find(&s2).is_some();
41 let _ = s1[2..].find(&s2[2..]).is_some();
42 }
43
44 #[allow(clippy::clone_on_copy, clippy::map_clone)]
45 mod issue7392 {
46 struct Player {
47 hand: Vec<usize>,
48 }
49 fn filter() {
50 let p = Player {
51 hand: vec![1, 2, 3, 4, 5],
52 };
53 let filter_hand = vec![5];
54 let _ = p
55 .hand
56 .iter()
57 .filter(|c| filter_hand.iter().find(|cc| c == cc).is_some())
58 .map(|c| c.clone())
59 .collect::<Vec<_>>();
60 }
61
62 struct PlayerTuple {
63 hand: Vec<(usize, char)>,
64 }
65 fn filter_tuple() {
66 let p = PlayerTuple {
67 hand: vec![(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd'), (5, 'e')],
68 };
69 let filter_hand = vec![5];
70 let _ = p
71 .hand
72 .iter()
73 .filter(|(c, _)| filter_hand.iter().find(|cc| c == *cc).is_some())
74 .map(|c| c.clone())
75 .collect::<Vec<_>>();
76 }
77
78 fn field_projection() {
79 struct Foo {
80 foo: i32,
81 bar: u32,
82 }
83 let vfoo = vec![Foo { foo: 1, bar: 2 }];
84 let _ = vfoo.iter().find(|v| v.foo == 1 && v.bar == 2).is_some();
85
86 let vfoo = vec![(42, Foo { foo: 1, bar: 2 })];
87 let _ = vfoo
88 .iter()
89 .find(|(i, v)| *i == 42 && v.foo == 1 && v.bar == 2)
90 .is_some();
91 }
92
93 fn index_projection() {
94 let vfoo = vec![[0, 1, 2, 3]];
95 let _ = vfoo.iter().find(|a| a[0] == 42).is_some();
96 }
97
98 #[allow(clippy::match_like_matches_macro)]
99 fn slice_projection() {
100 let vfoo = vec![[0, 1, 2, 3, 0, 1, 2, 3]];
101 let _ = vfoo.iter().find(|sub| sub[1..4].len() == 3).is_some();
102 }
103
104 fn please(x: &u32) -> bool {
105 *x == 9
106 }
107
108 fn deref_enough(x: u32) -> bool {
109 x == 78
110 }
111
112 fn arg_no_deref(x: &&u32) -> bool {
113 **x == 78
114 }
115
116 fn more_projections() {
117 let x = 19;
118 let ppx: &u32 = &x;
119 let _ = [ppx].iter().find(|ppp_x: &&&u32| please(**ppp_x)).is_some();
120 let _ = [String::from("Hey hey")].iter().find(|s| s.len() == 2).is_some();
121
122 let v = vec![3, 2, 1, 0];
123 let _ = v.iter().find(|x| deref_enough(**x)).is_some();
124 let _ = v.iter().find(|x: &&u32| deref_enough(**x)).is_some();
125
126 #[allow(clippy::redundant_closure)]
127 let _ = v.iter().find(|x| arg_no_deref(x)).is_some();
128 #[allow(clippy::redundant_closure)]
129 let _ = v.iter().find(|x: &&u32| arg_no_deref(x)).is_some();
130 }
131
132 fn field_index_projection() {
133 struct FooDouble {
134 bar: Vec<Vec<i32>>,
135 }
136 struct Foo {
137 bar: Vec<i32>,
138 }
139 struct FooOuter {
140 inner: Foo,
141 inner_double: FooDouble,
142 }
143 let vfoo = vec![FooOuter {
144 inner: Foo { bar: vec![0, 1, 2, 3] },
145 inner_double: FooDouble {
146 bar: vec![vec![0, 1, 2, 3]],
147 },
148 }];
149 let _ = vfoo
150 .iter()
151 .find(|v| v.inner_double.bar[0][0] == 2 && v.inner.bar[0] == 2)
152 .is_some();
153 }
154
155 fn index_field_projection() {
156 struct Foo {
157 bar: i32,
158 }
159 struct FooOuter {
160 inner: Vec<Foo>,
161 }
162 let vfoo = vec![FooOuter {
163 inner: vec![Foo { bar: 0 }],
164 }];
165 let _ = vfoo.iter().find(|v| v.inner[0].bar == 2).is_some();
166 }
167
168 fn double_deref_index_projection() {
169 let vfoo = vec![&&[0, 1, 2, 3]];
170 let _ = vfoo.iter().find(|x| (**x)[0] == 9).is_some();
171 }
172
173 fn method_call_by_ref() {
174 struct Foo {
175 bar: u32,
176 }
177 impl Foo {
178 pub fn by_ref(&self, x: &u32) -> bool {
179 *x == self.bar
180 }
181 }
182 let vfoo = vec![Foo { bar: 1 }];
183 let _ = vfoo.iter().find(|v| v.by_ref(&v.bar)).is_some();
184 }
185
186 fn ref_bindings() {
187 let _ = [&(&1, 2), &(&3, 4), &(&5, 4)].iter().find(|(&x, y)| x == *y).is_some();
188 let _ = [&(&1, 2), &(&3, 4), &(&5, 4)].iter().find(|&(&x, y)| x == *y).is_some();
189 }
190
191 fn test_string_1(s: &str) -> bool {
192 s.is_empty()
193 }
194
195 fn test_u32_1(s: &u32) -> bool {
196 s.is_power_of_two()
197 }
198
199 fn test_u32_2(s: u32) -> bool {
200 s.is_power_of_two()
201 }
202
203 fn projection_in_args_test() {
204 // Index projections
205 let lst = &[String::from("Hello"), String::from("world")];
206 let v: Vec<&[String]> = vec![lst];
207 let _ = v.iter().find(|s| s[0].is_empty()).is_some();
208 let _ = v.iter().find(|s| test_string_1(&s[0])).is_some();
209
210 // Field projections
211 struct FieldProjection<'a> {
212 field: &'a u32,
213 }
214 let field = 123456789;
215 let instance = FieldProjection { field: &field };
216 let v = vec![instance];
217 let _ = v.iter().find(|fp| fp.field.is_power_of_two()).is_some();
218 let _ = v.iter().find(|fp| test_u32_1(fp.field)).is_some();
219 let _ = v.iter().find(|fp| test_u32_2(*fp.field)).is_some();
220 }
221 }
222
223 mod issue9120 {
224 fn make_arg_no_deref_impl() -> impl Fn(&&u32) -> bool {
225 move |x: &&u32| **x == 78
226 }
227
228 fn make_arg_no_deref_dyn() -> Box<dyn Fn(&&u32) -> bool> {
229 Box::new(move |x: &&u32| **x == 78)
230 }
231
232 fn wrapper<T: Fn(&&u32) -> bool>(v: Vec<u32>, func: T) -> bool {
233 #[allow(clippy::redundant_closure)]
234 v.iter().find(|x: &&u32| func(x)).is_some()
235 }
236
237 fn do_tests() {
238 let v = vec![3, 2, 1, 0];
239 let arg_no_deref_impl = make_arg_no_deref_impl();
240 let arg_no_deref_dyn = make_arg_no_deref_dyn();
241
242 #[allow(clippy::redundant_closure)]
243 let _ = v.iter().find(|x: &&u32| arg_no_deref_impl(x)).is_some();
244
245 #[allow(clippy::redundant_closure)]
246 let _ = v.iter().find(|x: &&u32| arg_no_deref_dyn(x)).is_some();
247
248 #[allow(clippy::redundant_closure)]
249 let _ = v.iter().find(|x: &&u32| (*arg_no_deref_dyn)(x)).is_some();
250 }
251 }