1 #![warn(clippy::same_item_push)]
2 
3 const VALUE: u8 = 7;
4 
mutate_increment(x: &mut u8) -> u85 fn mutate_increment(x: &mut u8) -> u8 {
6     *x += 1;
7     *x
8 }
9 
increment(x: u8) -> u810 fn increment(x: u8) -> u8 {
11     x + 1
12 }
13 
fun() -> usize14 fn fun() -> usize {
15     42
16 }
17 
main()18 fn main() {
19     // ** linted cases **
20     let mut vec: Vec<u8> = Vec::new();
21     let item = 2;
22     for _ in 5..=20 {
23         vec.push(item);
24     }
25 
26     let mut vec: Vec<u8> = Vec::new();
27     for _ in 0..15 {
28         let item = 2;
29         vec.push(item);
30     }
31 
32     let mut vec: Vec<u8> = Vec::new();
33     for _ in 0..15 {
34         vec.push(13);
35     }
36 
37     let mut vec = Vec::new();
38     for _ in 0..20 {
39         vec.push(VALUE);
40     }
41 
42     let mut vec = Vec::new();
43     let item = VALUE;
44     for _ in 0..20 {
45         vec.push(item);
46     }
47 
48     // ** non-linted cases **
49     let mut spaces = Vec::with_capacity(10);
50     for _ in 0..10 {
51         spaces.push(vec![b' ']);
52     }
53 
54     // Suggestion should not be given as pushed variable can mutate
55     let mut vec: Vec<u8> = Vec::new();
56     let mut item: u8 = 2;
57     for _ in 0..30 {
58         vec.push(mutate_increment(&mut item));
59     }
60 
61     let mut vec: Vec<u8> = Vec::new();
62     let mut item: u8 = 2;
63     let mut item2 = &mut mutate_increment(&mut item);
64     for _ in 0..30 {
65         vec.push(mutate_increment(item2));
66     }
67 
68     let mut vec: Vec<usize> = Vec::new();
69     for (a, b) in [0, 1, 4, 9, 16].iter().enumerate() {
70         vec.push(a);
71     }
72 
73     let mut vec: Vec<u8> = Vec::new();
74     for i in 0..30 {
75         vec.push(increment(i));
76     }
77 
78     let mut vec: Vec<u8> = Vec::new();
79     for i in 0..30 {
80         vec.push(i + i * i);
81     }
82 
83     // Suggestion should not be given as there are multiple pushes that are not the same
84     let mut vec: Vec<u8> = Vec::new();
85     let item: u8 = 2;
86     for _ in 0..30 {
87         vec.push(item);
88         vec.push(item * 2);
89     }
90 
91     // Suggestion should not be given as Vec is not involved
92     for _ in 0..5 {
93         println!("Same Item Push");
94     }
95 
96     struct A {
97         kind: u32,
98     }
99     let mut vec_a: Vec<A> = Vec::new();
100     for i in 0..30 {
101         vec_a.push(A { kind: i });
102     }
103     let mut vec: Vec<u8> = Vec::new();
104     for a in vec_a {
105         vec.push(2u8.pow(a.kind));
106     }
107 
108     // Fix #5902
109     let mut vec: Vec<u8> = Vec::new();
110     let mut item = 0;
111     for _ in 0..10 {
112         vec.push(item);
113         item += 10;
114     }
115 
116     // Fix #5979
117     let mut vec: Vec<std::fs::File> = Vec::new();
118     for _ in 0..10 {
119         vec.push(std::fs::File::open("foobar").unwrap());
120     }
121     // Fix #5979
122     #[derive(Clone)]
123     struct S {}
124 
125     trait T {}
126     impl T for S {}
127 
128     let mut vec: Vec<Box<dyn T>> = Vec::new();
129     for _ in 0..10 {
130         vec.push(Box::new(S {}));
131     }
132 
133     // Fix #5985
134     let mut vec = Vec::new();
135     let item = 42;
136     let item = fun();
137     for _ in 0..20 {
138         vec.push(item);
139     }
140 
141     // Fix #5985
142     let mut vec = Vec::new();
143     let key = 1;
144     for _ in 0..20 {
145         let item = match key {
146             1 => 10,
147             _ => 0,
148         };
149         vec.push(item);
150     }
151 
152     // Fix #6987
153     let mut vec = Vec::new();
154     for _ in 0..10 {
155         vec.push(1);
156         vec.extend(&[2]);
157     }
158 }
159