diff options
Diffstat (limited to '')
-rw-r--r-- | src/tools/clippy/tests/ui/same_item_push.rs | 158 |
1 files changed, 158 insertions, 0 deletions
diff --git a/src/tools/clippy/tests/ui/same_item_push.rs b/src/tools/clippy/tests/ui/same_item_push.rs new file mode 100644 index 000000000..99964f0de --- /dev/null +++ b/src/tools/clippy/tests/ui/same_item_push.rs @@ -0,0 +1,158 @@ +#![warn(clippy::same_item_push)] + +const VALUE: u8 = 7; + +fn mutate_increment(x: &mut u8) -> u8 { + *x += 1; + *x +} + +fn increment(x: u8) -> u8 { + x + 1 +} + +fn fun() -> usize { + 42 +} + +fn main() { + // ** linted cases ** + let mut vec: Vec<u8> = Vec::new(); + let item = 2; + for _ in 5..=20 { + vec.push(item); + } + + let mut vec: Vec<u8> = Vec::new(); + for _ in 0..15 { + let item = 2; + vec.push(item); + } + + let mut vec: Vec<u8> = Vec::new(); + for _ in 0..15 { + vec.push(13); + } + + let mut vec = Vec::new(); + for _ in 0..20 { + vec.push(VALUE); + } + + let mut vec = Vec::new(); + let item = VALUE; + for _ in 0..20 { + vec.push(item); + } + + // ** non-linted cases ** + let mut spaces = Vec::with_capacity(10); + for _ in 0..10 { + spaces.push(vec![b' ']); + } + + // Suggestion should not be given as pushed variable can mutate + let mut vec: Vec<u8> = Vec::new(); + let mut item: u8 = 2; + for _ in 0..30 { + vec.push(mutate_increment(&mut item)); + } + + let mut vec: Vec<u8> = Vec::new(); + let mut item: u8 = 2; + let mut item2 = &mut mutate_increment(&mut item); + for _ in 0..30 { + vec.push(mutate_increment(item2)); + } + + let mut vec: Vec<usize> = Vec::new(); + for (a, b) in [0, 1, 4, 9, 16].iter().enumerate() { + vec.push(a); + } + + let mut vec: Vec<u8> = Vec::new(); + for i in 0..30 { + vec.push(increment(i)); + } + + let mut vec: Vec<u8> = Vec::new(); + for i in 0..30 { + vec.push(i + i * i); + } + + // Suggestion should not be given as there are multiple pushes that are not the same + let mut vec: Vec<u8> = Vec::new(); + let item: u8 = 2; + for _ in 0..30 { + vec.push(item); + vec.push(item * 2); + } + + // Suggestion should not be given as Vec is not involved + for _ in 0..5 { + println!("Same Item Push"); + } + + struct A { + kind: u32, + } + let mut vec_a: Vec<A> = Vec::new(); + for i in 0..30 { + vec_a.push(A { kind: i }); + } + let mut vec: Vec<u8> = Vec::new(); + for a in vec_a { + vec.push(2u8.pow(a.kind)); + } + + // Fix #5902 + let mut vec: Vec<u8> = Vec::new(); + let mut item = 0; + for _ in 0..10 { + vec.push(item); + item += 10; + } + + // Fix #5979 + let mut vec: Vec<std::fs::File> = Vec::new(); + for _ in 0..10 { + vec.push(std::fs::File::open("foobar").unwrap()); + } + // Fix #5979 + #[derive(Clone)] + struct S; + + trait T {} + impl T for S {} + + let mut vec: Vec<Box<dyn T>> = Vec::new(); + for _ in 0..10 { + vec.push(Box::new(S {})); + } + + // Fix #5985 + let mut vec = Vec::new(); + let item = 42; + let item = fun(); + for _ in 0..20 { + vec.push(item); + } + + // Fix #5985 + let mut vec = Vec::new(); + let key = 1; + for _ in 0..20 { + let item = match key { + 1 => 10, + _ => 0, + }; + vec.push(item); + } + + // Fix #6987 + let mut vec = Vec::new(); + for _ in 0..10 { + vec.push(1); + vec.extend(&[2]); + } +} |