| #![warn(clippy::useless_vec)] | |
| use std::rc::Rc; | |
| struct StructWithVec { | |
| _x: Vec<i32>, | |
| } | |
| fn on_slice(_: &[u8]) {} | |
| fn on_mut_slice(_: &mut [u8]) {} | |
| #[allow(clippy::ptr_arg)] | |
| fn on_vec(_: &Vec<u8>) {} | |
| fn on_mut_vec(_: &mut Vec<u8>) {} | |
| struct Line { | |
| length: usize, | |
| } | |
| impl Line { | |
| fn length(&self) -> usize { | |
| self.length | |
| } | |
| } | |
| fn main() { | |
| on_slice(&vec![]); | |
| //~^ useless_vec | |
| on_slice(&[]); | |
| on_mut_slice(&mut vec![]); | |
| //~^ useless_vec | |
| on_slice(&vec![1, 2]); | |
| //~^ useless_vec | |
| on_slice(&[1, 2]); | |
| on_mut_slice(&mut vec![1, 2]); | |
| //~^ useless_vec | |
| #[rustfmt::skip] | |
| #[allow(clippy::nonstandard_macro_braces)] // not an `expect` as it will only lint _before_ the fix | |
| { | |
| on_slice(&vec!(1, 2)); | |
| //~^ useless_vec | |
| on_mut_slice(&mut vec!(1, 2)); | |
| //~^ useless_vec | |
| }; | |
| on_slice(&vec![1; 2]); | |
| //~^ useless_vec | |
| on_slice(&[1; 2]); | |
| on_mut_slice(&mut vec![1; 2]); | |
| //~^ useless_vec | |
| on_vec(&vec![]); | |
| on_vec(&vec![1, 2]); | |
| on_vec(&vec![1; 2]); | |
| on_mut_vec(&mut vec![]); | |
| on_mut_vec(&mut vec![1, 2]); | |
| on_mut_vec(&mut vec![1; 2]); | |
| // Now with non-constant expressions | |
| let line = Line { length: 2 }; | |
| on_slice(&vec![2; line.length]); | |
| on_slice(&vec![2; line.length()]); | |
| on_mut_slice(&mut vec![2; line.length]); | |
| on_mut_slice(&mut vec![2; line.length()]); | |
| on_vec(&vec![1; 201]); // Ok, size of `vec` higher than `too_large_for_stack` | |
| on_mut_vec(&mut vec![1; 201]); // Ok, size of `vec` higher than `too_large_for_stack` | |
| // Ok, size of `vec` higher than `too_large_for_stack` | |
| for a in vec![1; 201] { | |
| println!("{a:?}"); | |
| } | |
| // https://github.com/rust-lang/rust-clippy/issues/2262#issuecomment-783979246 | |
| let _x: i32 = vec![1, 2, 3].iter().sum(); | |
| //~^ useless_vec | |
| // Do lint, only used as slice | |
| { | |
| let mut x = vec![1, 2, 3]; | |
| //~^ useless_vec | |
| x.fill(123); | |
| dbg!(x[0]); | |
| dbg!(x.len()); | |
| dbg!(x.iter().sum::<i32>()); | |
| } | |
| let _x: &[i32] = &vec![1, 2, 3]; | |
| //~^ useless_vec | |
| for _ in vec![1, 2, 3] {} | |
| //~^ useless_vec | |
| // Don't lint | |
| let x = vec![1, 2, 3]; | |
| let _v: Vec<i32> = x; | |
| let x = vec![1, 2, 3]; | |
| let _s = StructWithVec { _x: x }; | |
| // Explicit type annotation would make the change to [1, 2, 3] | |
| // a compile error. | |
| let _x: Vec<i32> = vec![1, 2, 3]; | |
| // Calling a Vec method through a mutable reference | |
| let mut x = vec![1, 2, 3]; | |
| let re = &mut x; | |
| re.push(4); | |
| // Comparing arrays whose length is not equal is a compile error | |
| let x = vec![1, 2, 3]; | |
| let y = vec![1, 2, 3, 4]; | |
| dbg!(x == y); | |
| // Non-copy types | |
| let _x = vec![String::new(); 10]; | |
| #[allow(clippy::rc_clone_in_vec_init)] | |
| let _x = vec![Rc::new(1); 10]; | |
| // Too large | |
| let _x = vec![1; 201]; | |
| } | |
| fn issue11075() { | |
| macro_rules! repro { | |
| ($e:expr) => { | |
| stringify!($e) | |
| }; | |
| } | |
| #[allow(clippy::never_loop)] | |
| for _string in vec![repro!(true), repro!(null)] { | |
| //~^ useless_vec | |
| unimplemented!(); | |
| } | |
| macro_rules! in_macro { | |
| ($e:expr, $vec:expr, $vec2:expr) => {{ | |
| vec![1; 2].fill(3); | |
| vec![1, 2].fill(3); | |
| for _ in vec![1, 2] {} | |
| for _ in vec![1; 2] {} | |
| for _ in vec![$e, $e] {} | |
| for _ in vec![$e; 2] {} | |
| for _ in $vec {} | |
| for _ in $vec2 {} | |
| }}; | |
| } | |
| in_macro!(1, vec![1, 2], vec![1; 2]); | |
| //~^ useless_vec | |
| //~| useless_vec | |
| macro_rules! from_macro { | |
| () => { | |
| vec![1, 2, 3] | |
| }; | |
| } | |
| macro_rules! from_macro_repeat { | |
| () => { | |
| vec![1; 3] | |
| }; | |
| } | |
| for _ in from_macro!() {} | |
| for _ in from_macro_repeat!() {} | |
| } | |
| #[clippy::msrv = "1.53"] | |
| fn above() { | |
| for a in vec![1, 2, 3] { | |
| //~^ useless_vec | |
| let _: usize = a; | |
| } | |
| for a in vec![String::new(), String::new()] { | |
| //~^ useless_vec | |
| let _: String = a; | |
| } | |
| } | |
| #[clippy::msrv = "1.52"] | |
| fn below() { | |
| for a in vec![1, 2, 3] { | |
| let _: usize = a; | |
| } | |
| for a in vec![String::new(), String::new()] { | |
| let _: String = a; | |
| } | |
| } | |
| fn func_needing_vec(_bar: usize, _baz: Vec<usize>) {} | |
| fn func_not_needing_vec(_bar: usize, _baz: usize) {} | |
| fn issue11861() { | |
| macro_rules! this_macro_needs_vec { | |
| ($x:expr) => {{ | |
| func_needing_vec($x.iter().sum(), $x); | |
| for _ in $x {} | |
| }}; | |
| } | |
| macro_rules! this_macro_doesnt_need_vec { | |
| ($x:expr) => {{ func_not_needing_vec($x.iter().sum(), $x.iter().sum()) }}; | |
| } | |
| // Do not lint the next line | |
| this_macro_needs_vec!(vec![1]); | |
| this_macro_doesnt_need_vec!(vec![1]); | |
| //~^ useless_vec | |
| macro_rules! m { | |
| ($x:expr) => { | |
| fn f2() { | |
| let _x: Vec<i32> = $x; | |
| } | |
| fn f() { | |
| let _x = $x; | |
| $x.starts_with(&[]); | |
| } | |
| }; | |
| } | |
| // should not lint | |
| m!(vec![1]); | |
| } | |
| fn issue_11958() { | |
| fn f(_s: &[String]) {} | |
| // should not lint, `String` is not `Copy` | |
| f(&vec!["test".to_owned(); 2]); | |
| } | |
| fn issue_12101() { | |
| for a in &(vec![1, 2]) {} | |
| //~^ useless_vec | |
| } | |
| fn issue_14531() { | |
| // The lint used to suggest using an array rather than a reference to a slice. | |
| fn requires_ref_slice(v: &[()]) {} | |
| let v = &vec![]; | |
| //~^ useless_vec | |
| requires_ref_slice(v); | |
| } |