1 #![warn(clippy::same_item_push)] 2 3 const VALUE: u8 = 7; 4 mutate_increment(x: &mut u8) -> u85fn mutate_increment(x: &mut u8) -> u8 { 6 *x += 1; 7 *x 8 } 9 increment(x: u8) -> u810fn increment(x: u8) -> u8 { 11 x + 1 12 } 13 fun() -> usize14fn fun() -> usize { 15 42 16 } 17 main()18fn 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