2018-07-28 10:34:52 -05:00
|
|
|
#![warn(clippy::useless_vec)]
|
2023-09-02 07:12:05 -05:00
|
|
|
#![allow(
|
|
|
|
clippy::nonstandard_macro_braces,
|
|
|
|
clippy::never_loop,
|
|
|
|
clippy::uninlined_format_args,
|
|
|
|
unused
|
|
|
|
)]
|
2016-01-28 18:54:10 -06:00
|
|
|
|
2023-06-06 15:56:57 -05:00
|
|
|
use std::rc::Rc;
|
|
|
|
|
|
|
|
struct StructWithVec {
|
|
|
|
_x: Vec<i32>,
|
|
|
|
}
|
|
|
|
|
2016-01-28 18:54:10 -06:00
|
|
|
fn on_slice(_: &[u8]) {}
|
2021-04-05 06:27:39 -05:00
|
|
|
|
|
|
|
fn on_mut_slice(_: &mut [u8]) {}
|
|
|
|
|
2018-07-28 10:34:52 -05:00
|
|
|
#[allow(clippy::ptr_arg)]
|
2016-01-28 18:54:10 -06:00
|
|
|
fn on_vec(_: &Vec<u8>) {}
|
|
|
|
|
2021-04-05 06:27:39 -05:00
|
|
|
fn on_mut_vec(_: &mut Vec<u8>) {}
|
|
|
|
|
2016-07-03 14:12:43 -05:00
|
|
|
struct Line {
|
|
|
|
length: usize,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Line {
|
|
|
|
fn length(&self) -> usize {
|
|
|
|
self.length
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-01-28 18:54:10 -06:00
|
|
|
fn main() {
|
|
|
|
on_slice(&vec![]);
|
|
|
|
on_slice(&[]);
|
2021-04-05 06:27:39 -05:00
|
|
|
on_mut_slice(&mut vec![]);
|
2016-01-28 18:54:10 -06:00
|
|
|
|
|
|
|
on_slice(&vec![1, 2]);
|
|
|
|
on_slice(&[1, 2]);
|
2021-04-05 06:27:39 -05:00
|
|
|
on_mut_slice(&mut vec![1, 2]);
|
2016-01-28 18:54:10 -06:00
|
|
|
|
2018-12-09 16:26:16 -06:00
|
|
|
on_slice(&vec![1, 2]);
|
2016-01-28 18:54:10 -06:00
|
|
|
on_slice(&[1, 2]);
|
2021-04-05 06:27:39 -05:00
|
|
|
on_mut_slice(&mut vec![1, 2]);
|
2018-12-10 17:59:59 -06:00
|
|
|
#[rustfmt::skip]
|
|
|
|
on_slice(&vec!(1, 2));
|
2016-01-28 18:54:10 -06:00
|
|
|
on_slice(&[1, 2]);
|
2021-04-05 06:27:39 -05:00
|
|
|
on_mut_slice(&mut vec![1, 2]);
|
2016-01-28 18:54:10 -06:00
|
|
|
|
|
|
|
on_slice(&vec![1; 2]);
|
|
|
|
on_slice(&[1; 2]);
|
2021-04-05 06:27:39 -05:00
|
|
|
on_mut_slice(&mut vec![1; 2]);
|
2016-01-28 18:54:10 -06:00
|
|
|
|
|
|
|
on_vec(&vec![]);
|
|
|
|
on_vec(&vec![1, 2]);
|
|
|
|
on_vec(&vec![1; 2]);
|
2021-04-05 06:27:39 -05:00
|
|
|
on_mut_vec(&mut vec![]);
|
|
|
|
on_mut_vec(&mut vec![1, 2]);
|
|
|
|
on_mut_vec(&mut vec![1; 2]);
|
2016-03-28 16:32:55 -05:00
|
|
|
|
2016-07-03 14:12:43 -05:00
|
|
|
// Now with non-constant expressions
|
|
|
|
let line = Line { length: 2 };
|
|
|
|
|
|
|
|
on_slice(&vec![2; line.length]);
|
|
|
|
on_slice(&vec![2; line.length()]);
|
2021-04-05 06:27:39 -05:00
|
|
|
on_mut_slice(&mut vec![2; line.length]);
|
|
|
|
on_mut_slice(&mut vec![2; line.length()]);
|
2016-07-03 14:12:43 -05:00
|
|
|
|
2020-08-14 07:13:35 -05:00
|
|
|
on_vec(&vec![1; 201]); // Ok, size of `vec` higher than `too_large_for_stack`
|
2021-04-05 06:27:39 -05:00
|
|
|
on_mut_vec(&mut vec![1; 201]); // Ok, size of `vec` higher than `too_large_for_stack`
|
2020-08-14 07:13:35 -05:00
|
|
|
|
|
|
|
// Ok
|
|
|
|
for a in vec![1; 201] {
|
|
|
|
println!("{:?}", a);
|
|
|
|
}
|
2023-06-06 15:56:57 -05:00
|
|
|
|
2023-06-12 09:04:34 -05:00
|
|
|
// https://github.com/rust-lang/rust-clippy/issues/2262#issuecomment-783979246
|
|
|
|
let _x: i32 = vec![1, 2, 3].iter().sum();
|
|
|
|
|
2023-06-06 15:56:57 -05:00
|
|
|
// Do lint
|
|
|
|
let mut x = vec![1, 2, 3];
|
|
|
|
x.fill(123);
|
|
|
|
dbg!(x[0]);
|
|
|
|
dbg!(x.len());
|
|
|
|
dbg!(x.iter().sum::<i32>());
|
|
|
|
|
|
|
|
let _x: &[i32] = &vec![1, 2, 3];
|
|
|
|
|
|
|
|
for _ in vec![1, 2, 3] {}
|
|
|
|
|
|
|
|
// 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];
|
2016-01-28 18:54:10 -06:00
|
|
|
}
|
2023-06-08 12:05:08 -05:00
|
|
|
|
2023-07-03 06:40:33 -05:00
|
|
|
fn issue11075() {
|
|
|
|
macro_rules! repro {
|
|
|
|
($e:expr) => {
|
|
|
|
stringify!($e)
|
|
|
|
};
|
|
|
|
}
|
|
|
|
for _string in vec![repro!(true), repro!(null)] {
|
|
|
|
unimplemented!();
|
|
|
|
}
|
2023-07-03 11:13:01 -05:00
|
|
|
|
|
|
|
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]);
|
|
|
|
|
|
|
|
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!() {}
|
2023-07-03 06:40:33 -05:00
|
|
|
}
|
|
|
|
|
2023-06-08 12:05:08 -05:00
|
|
|
#[clippy::msrv = "1.53"]
|
|
|
|
fn above() {
|
|
|
|
for a in vec![1, 2, 3] {
|
|
|
|
let _: usize = a;
|
|
|
|
}
|
|
|
|
|
|
|
|
for a in vec![String::new(), String::new()] {
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
}
|