blob: 092cc7c348909fda09f0953913aef4941090c6e6 [file] [edit]
#![warn(clippy::unnecessary_operation)]
#![allow(clippy::deref_addrof, clippy::no_effect)]
use std::fmt::Display;
use std::ops::Shl;
struct Tuple(i32);
struct Struct {
field: i32,
}
enum Enum {
Tuple(i32),
Struct { field: i32 },
}
struct DropStruct {
field: i32,
}
impl Drop for DropStruct {
fn drop(&mut self) {}
}
struct DropTuple(i32);
impl Drop for DropTuple {
fn drop(&mut self) {}
}
enum DropEnum {
Tuple(i32),
Struct { field: i32 },
}
impl Drop for DropEnum {
fn drop(&mut self) {}
}
struct FooString {
s: String,
}
fn get_number() -> i32 {
0
}
const fn get_usize() -> usize {
0
}
fn get_struct() -> Struct {
Struct { field: 0 }
}
fn get_drop_struct() -> DropStruct {
DropStruct { field: 0 }
}
struct Cout;
impl<T> Shl<T> for Cout
where
T: Display,
{
type Output = Self;
fn shl(self, rhs: T) -> Self::Output {
println!("{}", rhs);
self
}
}
fn main() {
get_number();
//~^ unnecessary_operation
get_number();
//~^ unnecessary_operation
get_struct();
//~^ unnecessary_operation
get_number();
//~^ unnecessary_operation
get_number();
//~^ unnecessary_operation
5; get_number();
//~^ unnecessary_operation
get_number();
//~^ unnecessary_operation
get_number();
//~^ unnecessary_operation
5; 6; get_number();
//~^ unnecessary_operation
get_number();
//~^ unnecessary_operation
get_number();
//~^ unnecessary_operation
5; get_number();
//~^ unnecessary_operation
42; get_number();
//~^ unnecessary_operation
assert!([42, 55].len() > get_usize());
//~^ unnecessary_operation
42; get_number();
//~^ unnecessary_operation
get_number();
//~^ unnecessary_operation
assert!([42; 55].len() > get_usize());
//~^ unnecessary_operation
get_number();
String::from("blah");
// Do not warn
DropTuple(get_number());
DropStruct { field: get_number() };
DropStruct { field: get_number() };
DropStruct { ..get_drop_struct() };
DropEnum::Tuple(get_number());
DropEnum::Struct { field: get_number() };
// Issue #9954
fn one() -> i8 {
1
}
macro_rules! use_expr {
($($e:expr),*) => {{ $($e;)* }}
}
use_expr!(isize::MIN / -(one() as isize), i8::MIN / -one());
// Issue #11885
Cout << 16;
// Issue #11575
// Bad formatting is required to trigger the bug
#[rustfmt::skip]
'label: {
break 'label
};
let () = const {
[42, 55][get_usize()];
};
}
const _: () = {
[42, 55][get_usize()];
};
const fn foo() {
assert!([42, 55].len() > get_usize());
//~^ unnecessary_operation
}
fn issue15173() {
// No lint as `Box::new(None)` alone would be ambiguous
Box::new(None) as Box<Option<i32>>;
}
#[expect(clippy::redundant_closure_call)]
fn issue15173_original<MsU>(handler: impl FnOnce() -> MsU + Clone + 'static) {
Box::new(move |value| {
(|_| handler.clone()())(value);
None
}) as Box<dyn Fn(i32) -> Option<i32>>;
}
mod issue12898 {
use futures::future;
async fn forever() -> ! {
// pretend there is an infinite loop here...
future::pending().await
}
pub async fn definitely_forever() -> ! {
future::join(forever(), forever()).await.0;
}
pub async fn no_false_negative() -> ! {
fn never() -> ! {
unimplemented!()
}
never();
//~^^^ unnecessary_operation
}
}