| #![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 | |
| } | |
| } |