forked from rust-lang/rust-clippy
-
Notifications
You must be signed in to change notification settings - Fork 0
/
iter_on_empty_collections.fixed
73 lines (63 loc) · 2.18 KB
/
iter_on_empty_collections.fixed
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
//@run-rustfix
#![warn(clippy::iter_on_empty_collections)]
#![allow(clippy::iter_next_slice, clippy::redundant_clone)]
fn array() {
assert_eq!(std::iter::empty().next(), Option::<i32>::None);
assert_eq!(std::iter::empty().next(), Option::<&mut i32>::None);
assert_eq!(std::iter::empty().next(), Option::<&i32>::None);
assert_eq!(std::iter::empty().next(), Option::<i32>::None);
assert_eq!(std::iter::empty().next(), Option::<&mut i32>::None);
assert_eq!(std::iter::empty().next(), Option::<&i32>::None);
let x: [u32; 0] = [];
x.iter().copied().chain(std::iter::empty());
x.iter().copied().eq(std::iter::empty());
x.iter().copied().ne(std::iter::empty());
let x: Vec<u32> = vec![];
x.iter().copied().chain(std::iter::empty());
x.iter().copied().eq(std::iter::empty());
x.iter().copied().ne(std::iter::empty());
// Don't trigger on non-iter methods
let _: Option<String> = None.clone();
let _: [String; 0] = [].clone();
// FIXME: See line 135 in `single_or_empty_collections_iter`
// Don't trigger on match or if branches
// let _ = match 123 {
// 123 => [].iter(),
// _ => ["test"].iter(),
// };
// let _ = if false { ["test"].iter() } else { [].iter() };
}
macro_rules! in_macros {
() => {
assert_eq!(std::iter::empty().next(), Option::<i32>::None);
assert_eq!(std::iter::empty().next(), Option::<&mut i32>::None);
assert_eq!(std::iter::empty().next(), Option::<&i32>::None);
assert_eq!(std::iter::empty().next(), Option::<i32>::None);
assert_eq!(std::iter::empty().next(), Option::<&mut i32>::None);
assert_eq!(std::iter::empty().next(), Option::<&i32>::None);
};
}
// Don't trigger on a `None` that isn't std's option
mod custom_option {
#[allow(unused)]
enum CustomOption {
Some(i32),
None,
}
impl CustomOption {
fn iter(&self) {}
fn iter_mut(&mut self) {}
fn into_iter(self) {}
}
use CustomOption::*;
pub fn custom_option() {
None.iter();
None.iter_mut();
None.into_iter();
}
}
fn main() {
array();
custom_option::custom_option();
in_macros!();
}