2023-08-24 14:32:12 -05:00
|
|
|
//@aux-build:proc_macros.rs
|
2022-08-20 13:40:08 -05:00
|
|
|
#![feature(let_chains)]
|
2022-10-06 02:44:38 -05:00
|
|
|
#![allow(unused)]
|
2022-06-04 06:34:07 -05:00
|
|
|
#![allow(
|
|
|
|
clippy::assign_op_pattern,
|
2023-11-30 01:41:54 -06:00
|
|
|
clippy::blocks_in_conditions,
|
2022-06-04 06:34:07 -05:00
|
|
|
clippy::let_and_return,
|
|
|
|
clippy::let_unit_value,
|
2022-10-06 02:44:38 -05:00
|
|
|
clippy::nonminimal_bool,
|
2023-07-02 07:35:19 -05:00
|
|
|
clippy::uninlined_format_args,
|
|
|
|
clippy::useless_vec
|
2022-06-04 06:34:07 -05:00
|
|
|
)]
|
|
|
|
|
2023-03-24 08:04:35 -05:00
|
|
|
extern crate proc_macros;
|
|
|
|
|
2022-06-04 06:34:07 -05:00
|
|
|
use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet};
|
|
|
|
use std::rc::Rc;
|
|
|
|
|
|
|
|
struct SignificantDrop;
|
|
|
|
impl std::ops::Drop for SignificantDrop {
|
|
|
|
fn drop(&mut self) {
|
|
|
|
println!("dropped");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn simple() {
|
|
|
|
|
|
|
|
let a = "zero";
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let b = 1;
|
|
|
|
let c = 2;
|
|
|
|
|
|
|
|
|
|
|
|
let d: usize = 1;
|
|
|
|
|
|
|
|
|
|
|
|
let e = format!("{}", d);
|
|
|
|
}
|
|
|
|
|
|
|
|
fn main() {
|
|
|
|
|
|
|
|
let n = 1;
|
|
|
|
let a = match n {
|
|
|
|
1 => "one",
|
|
|
|
_ => {
|
|
|
|
"two"
|
|
|
|
},
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
let b = if n == 3 {
|
|
|
|
"four"
|
|
|
|
} else {
|
|
|
|
"five"
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
let d = if true {
|
|
|
|
let temp = 5;
|
|
|
|
temp
|
|
|
|
} else {
|
|
|
|
15
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
let e = if true {
|
|
|
|
format!("{} {}", a, b)
|
|
|
|
} else {
|
|
|
|
format!("{}", n)
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
let f = match 1 {
|
|
|
|
1 => "three",
|
|
|
|
_ => return,
|
|
|
|
}; // has semi
|
|
|
|
|
|
|
|
|
|
|
|
let g: usize = if true {
|
|
|
|
5
|
|
|
|
} else {
|
|
|
|
panic!();
|
|
|
|
};
|
|
|
|
|
|
|
|
// Drop order only matters if both are significant
|
|
|
|
|
|
|
|
let y = SignificantDrop;
|
|
|
|
let x = 1;
|
|
|
|
|
|
|
|
|
|
|
|
let y = 1;
|
|
|
|
let x = SignificantDrop;
|
|
|
|
|
|
|
|
|
|
|
|
// types that should be considered insignificant
|
|
|
|
let y = 1;
|
|
|
|
let y = "2";
|
|
|
|
let y = String::new();
|
|
|
|
let y = vec![3.0];
|
|
|
|
let y = HashMap::<usize, usize>::new();
|
|
|
|
let y = BTreeMap::<usize, usize>::new();
|
|
|
|
let y = HashSet::<usize>::new();
|
|
|
|
let y = BTreeSet::<usize>::new();
|
|
|
|
let y = Box::new(4);
|
|
|
|
let x = SignificantDrop;
|
|
|
|
}
|
|
|
|
|
|
|
|
async fn in_async() -> &'static str {
|
|
|
|
async fn f() -> &'static str {
|
|
|
|
"one"
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
let n = 1;
|
|
|
|
let a = match n {
|
|
|
|
1 => f().await,
|
|
|
|
_ => {
|
|
|
|
"two"
|
|
|
|
},
|
|
|
|
};
|
|
|
|
|
|
|
|
a
|
|
|
|
}
|
|
|
|
|
|
|
|
const fn in_const() -> &'static str {
|
|
|
|
const fn f() -> &'static str {
|
|
|
|
"one"
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
let n = 1;
|
|
|
|
let a = match n {
|
|
|
|
1 => f(),
|
|
|
|
_ => {
|
|
|
|
"two"
|
|
|
|
},
|
|
|
|
};
|
|
|
|
|
|
|
|
a
|
|
|
|
}
|
|
|
|
|
2023-03-24 08:04:35 -05:00
|
|
|
#[proc_macros::inline_macros]
|
2022-06-04 06:34:07 -05:00
|
|
|
fn does_not_lint() {
|
|
|
|
let z;
|
|
|
|
if false {
|
|
|
|
z = 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
let x;
|
|
|
|
let y;
|
|
|
|
if true {
|
|
|
|
x = 1;
|
|
|
|
} else {
|
|
|
|
y = 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
let mut x;
|
|
|
|
if true {
|
|
|
|
x = 5;
|
|
|
|
x = 10 / x;
|
|
|
|
} else {
|
|
|
|
x = 2;
|
|
|
|
}
|
|
|
|
|
|
|
|
let x;
|
|
|
|
let _ = match 1 {
|
|
|
|
1 => x = 10,
|
|
|
|
_ => x = 20,
|
|
|
|
};
|
|
|
|
|
|
|
|
// using tuples would be possible, but not always preferable
|
|
|
|
let x;
|
|
|
|
let y;
|
|
|
|
if true {
|
|
|
|
x = 1;
|
|
|
|
y = 2;
|
|
|
|
} else {
|
|
|
|
x = 3;
|
|
|
|
y = 4;
|
|
|
|
}
|
|
|
|
|
|
|
|
// could match with a smarter heuristic to avoid multiple assignments
|
|
|
|
let x;
|
|
|
|
if true {
|
|
|
|
let mut y = 5;
|
|
|
|
y = 6;
|
|
|
|
x = y;
|
|
|
|
} else {
|
|
|
|
x = 2;
|
|
|
|
}
|
|
|
|
|
|
|
|
let (x, y);
|
|
|
|
if true {
|
|
|
|
x = 1;
|
|
|
|
} else {
|
|
|
|
x = 2;
|
|
|
|
}
|
|
|
|
y = 3;
|
|
|
|
|
|
|
|
let x;
|
2023-03-24 08:04:35 -05:00
|
|
|
inline!($x = 1;);
|
2022-06-04 06:34:07 -05:00
|
|
|
|
|
|
|
let x;
|
|
|
|
if true {
|
2023-03-24 08:04:35 -05:00
|
|
|
inline!($x = 1;);
|
2022-06-04 06:34:07 -05:00
|
|
|
} else {
|
|
|
|
x = 2;
|
|
|
|
}
|
|
|
|
|
2023-03-24 08:04:35 -05:00
|
|
|
inline!({
|
|
|
|
let x;
|
|
|
|
x = 1;
|
2022-06-04 06:34:07 -05:00
|
|
|
|
2023-03-24 08:04:35 -05:00
|
|
|
let x;
|
|
|
|
if true {
|
|
|
|
x = 1;
|
|
|
|
} else {
|
|
|
|
x = 2;
|
|
|
|
}
|
|
|
|
});
|
2022-06-04 06:34:07 -05:00
|
|
|
|
|
|
|
// ignore if-lets - https://github.com/rust-lang/rust-clippy/issues/8613
|
|
|
|
let x;
|
|
|
|
if let Some(n) = Some("v") {
|
|
|
|
x = 1;
|
|
|
|
} else {
|
|
|
|
x = 2;
|
|
|
|
}
|
|
|
|
|
|
|
|
let x;
|
2023-11-02 11:12:25 -05:00
|
|
|
if true
|
|
|
|
&& let Some(n) = Some("let chains too")
|
|
|
|
{
|
2022-06-04 06:34:07 -05:00
|
|
|
x = 1;
|
|
|
|
} else {
|
|
|
|
x = 2;
|
|
|
|
}
|
|
|
|
|
|
|
|
// ignore mut bindings
|
|
|
|
// https://github.com/shepmaster/twox-hash/blob/b169c16d86eb8ea4a296b0acb9d00ca7e3c3005f/src/sixty_four.rs#L88-L93
|
|
|
|
// https://github.com/dtolnay/thiserror/blob/21c26903e29cb92ba1a7ff11e82ae2001646b60d/tests/test_generics.rs#L91-L100
|
|
|
|
let mut x: usize;
|
|
|
|
x = 1;
|
|
|
|
x = 2;
|
|
|
|
x = 3;
|
|
|
|
|
|
|
|
// should not move the declaration if `x` has a significant drop, and there
|
|
|
|
// is another binding with a significant drop between it and the first usage
|
|
|
|
let x;
|
|
|
|
let y = SignificantDrop;
|
|
|
|
x = SignificantDrop;
|
|
|
|
}
|
|
|
|
|
|
|
|
#[rustfmt::skip]
|
|
|
|
fn issue8911() -> u32 {
|
|
|
|
let x;
|
|
|
|
match 1 {
|
|
|
|
_ if { x = 1; false } => return 1,
|
|
|
|
_ => return 2,
|
|
|
|
}
|
|
|
|
|
|
|
|
let x;
|
|
|
|
if { x = 1; true } {
|
|
|
|
return 1;
|
|
|
|
} else {
|
|
|
|
return 2;
|
|
|
|
}
|
|
|
|
|
|
|
|
3
|
|
|
|
}
|