#![feature(fn_traits, unboxed_closures)] #![warn(clippy::no_effect_underscore_binding)] #![allow( clippy::deref_addrof, clippy::redundant_field_names, clippy::uninlined_format_args, clippy::unnecessary_struct_initialization, clippy::useless_vec )] use std::fmt::Display; use std::ops::{Neg, Shl}; struct Cout; impl Shl for Cout where T: Display, { type Output = Self; fn shl(self, rhs: T) -> Self::Output { println!("{}", rhs); self } } impl Neg for Cout { type Output = Self; fn neg(self) -> Self::Output { println!("hello world"); self } } 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, } union Union { a: u8, b: f64, } fn get_number() -> i32 { 0 } fn get_struct() -> Struct { Struct { field: 0 } } fn get_drop_struct() -> DropStruct { DropStruct { field: 0 } } unsafe fn unsafe_fn() -> i32 { 0 } struct GreetStruct1; impl FnOnce<(&str,)> for GreetStruct1 { type Output = (); extern "rust-call" fn call_once(self, (who,): (&str,)) -> Self::Output { println!("hello {}", who); } } struct GreetStruct2(); impl FnOnce<(&str,)> for GreetStruct2 { type Output = (); extern "rust-call" fn call_once(self, (who,): (&str,)) -> Self::Output { println!("hello {}", who); } } struct GreetStruct3; impl FnOnce<(&str,)> for GreetStruct3 { type Output = (); extern "rust-call" fn call_once(self, (who,): (&str,)) -> Self::Output { println!("hello {}", who); } } fn main() { let s = get_struct(); 0; //~^ no_effect Tuple(0); //~^ no_effect Struct { field: 0 }; //~^ no_effect Struct { ..s }; //~^ no_effect Union { a: 0 }; //~^ no_effect Enum::Tuple(0); //~^ no_effect Enum::Struct { field: 0 }; //~^ no_effect 5 + 6; //~^ no_effect *&42; //~^ no_effect &6; //~^ no_effect (5, 6, 7); //~^ no_effect ..; //~^ no_effect 5..; //~^ no_effect ..5; //~^ no_effect 5..6; //~^ no_effect 5..=6; //~^ no_effect [42, 55]; //~^ no_effect [42, 55][1]; //~^ no_effect (42, 55).1; //~^ no_effect [42; 55]; //~^ no_effect [42; 55][13]; //~^ no_effect let mut x = 0; || x += 5; //~^ no_effect let s: String = "foo".into(); FooString { s: s }; //~^ no_effect let _unused = 1; //~^ no_effect_underscore_binding let _penguin = || println!("Some helpful closure"); //~^ no_effect_underscore_binding let _duck = Struct { field: 0 }; //~^ no_effect_underscore_binding let _cat = [2, 4, 6, 8][2]; //~^ no_effect_underscore_binding let _issue_12166 = 42; let underscore_variable_above_can_be_used_dont_lint = _issue_12166; #[allow(clippy::no_effect)] 0; // Do not warn get_number(); unsafe { unsafe_fn() }; let _used = get_struct(); let _x = vec![1]; DropStruct { field: 0 }; DropTuple(0); DropEnum::Tuple(0); DropEnum::Struct { field: 0 }; GreetStruct1("world"); GreetStruct2()("world"); GreetStruct3 {}("world"); fn n() -> i32 { 42 } Cout << 142; -Cout; } fn issue14592() { struct MyStruct { _inner: MyInner, } struct MyInner {} impl Drop for MyInner { fn drop(&mut self) { println!("dropping"); } } let x = MyStruct { _inner: MyInner {} }; let closure = || { // Do not lint: dropping the assignment or assigning to `_` would // change the output. let _x = x; }; println!("1"); closure(); println!("2"); struct Innocuous { a: i32, } // Do not lint: one of the fields has a side effect. let x = MyInner {}; let closure = || { let _x = Innocuous { a: { x; 10 }, }; }; // Do not lint: the base has a side effect. let x = MyInner {}; let closure = || { let _x = Innocuous { ..Innocuous { a: { x; 10 }, } }; }; }