Add check for unary-operator
Fix typo and add test for unary-opeator
This commit is contained in:
parent
2e3c031528
commit
ee2354badf
@ -93,7 +93,7 @@ fn check_no_effect(cx: &LateContext<'_>, stmt: &Stmt<'_>) -> bool {
|
||||
}
|
||||
let expr = peel_blocks(expr);
|
||||
// assume nontrivial oprand of `Binary` Expr can skip `check_unnecessary_operation`
|
||||
if is_operator_overrided(cx, expr) {
|
||||
if is_operator_overriden(cx, expr) {
|
||||
return true;
|
||||
}
|
||||
if has_no_effect(cx, expr) {
|
||||
@ -162,18 +162,18 @@ fn check_no_effect(cx: &LateContext<'_>, stmt: &Stmt<'_>) -> bool {
|
||||
false
|
||||
}
|
||||
|
||||
fn is_operator_overrided(cx: &LateContext<'_>, expr: &Expr<'_>) -> bool {
|
||||
fn is_operator_overriden(cx: &LateContext<'_>, expr: &Expr<'_>) -> bool {
|
||||
// It's very hard or impossable to check whether overrided operator have side-effect this lint.
|
||||
// So, this function assume user-defined binary operator is overrided with an side-effect.
|
||||
// So, this function assume user-defined operator is overrided with an side-effect.
|
||||
// The definition of user-defined structure here is ADT-type,
|
||||
// Althrough this will weaken the ability of this lint, less error lint-fix happen.
|
||||
match expr.kind {
|
||||
ExprKind::Binary(..) => {
|
||||
ExprKind::Binary(..) | ExprKind::Unary(..) => {
|
||||
// No need to check type of `lhs` and `rhs`
|
||||
// because if the operator is overrided, at least one operand is ADT type
|
||||
|
||||
// reference: rust/compiler/rustc_middle/src/ty/typeck_results.rs: `is_method_call`.
|
||||
// use this function to check whether operator is overrided in `ExprKind::Binary`.
|
||||
// use this function to check whether operator is overrided in `ExprKind::{Binary, Unary}`.
|
||||
cx.typeck_results().is_method_call(expr)
|
||||
},
|
||||
_ => false,
|
||||
|
@ -10,7 +10,7 @@
|
||||
)]
|
||||
|
||||
use std::fmt::Display;
|
||||
use std::ops::Shl;
|
||||
use std::ops::{Neg, Shl};
|
||||
|
||||
struct Cout;
|
||||
|
||||
@ -25,6 +25,14 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
impl Neg for Cout {
|
||||
type Output = Self;
|
||||
fn neg(self) -> Self::Output {
|
||||
println!("hello world");
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
struct Unit;
|
||||
struct Tuple(i32);
|
||||
struct Struct {
|
||||
@ -196,5 +204,5 @@ fn main() {
|
||||
}
|
||||
|
||||
Cout << 142;
|
||||
Cout << n();
|
||||
-Cout;
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
error: statement with no effect
|
||||
--> $DIR/no_effect.rs:114:5
|
||||
--> $DIR/no_effect.rs:122:5
|
||||
|
|
||||
LL | 0;
|
||||
| ^^
|
||||
@ -8,151 +8,151 @@ LL | 0;
|
||||
= help: to override `-D warnings` add `#[allow(clippy::no_effect)]`
|
||||
|
||||
error: statement with no effect
|
||||
--> $DIR/no_effect.rs:117:5
|
||||
--> $DIR/no_effect.rs:125:5
|
||||
|
|
||||
LL | s2;
|
||||
| ^^^
|
||||
|
||||
error: statement with no effect
|
||||
--> $DIR/no_effect.rs:119:5
|
||||
--> $DIR/no_effect.rs:127:5
|
||||
|
|
||||
LL | Unit;
|
||||
| ^^^^^
|
||||
|
||||
error: statement with no effect
|
||||
--> $DIR/no_effect.rs:121:5
|
||||
--> $DIR/no_effect.rs:129:5
|
||||
|
|
||||
LL | Tuple(0);
|
||||
| ^^^^^^^^^
|
||||
|
||||
error: statement with no effect
|
||||
--> $DIR/no_effect.rs:123:5
|
||||
--> $DIR/no_effect.rs:131:5
|
||||
|
|
||||
LL | Struct { field: 0 };
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: statement with no effect
|
||||
--> $DIR/no_effect.rs:125:5
|
||||
--> $DIR/no_effect.rs:133:5
|
||||
|
|
||||
LL | Struct { ..s };
|
||||
| ^^^^^^^^^^^^^^^
|
||||
|
||||
error: statement with no effect
|
||||
--> $DIR/no_effect.rs:127:5
|
||||
--> $DIR/no_effect.rs:135:5
|
||||
|
|
||||
LL | Union { a: 0 };
|
||||
| ^^^^^^^^^^^^^^^
|
||||
|
||||
error: statement with no effect
|
||||
--> $DIR/no_effect.rs:129:5
|
||||
--> $DIR/no_effect.rs:137:5
|
||||
|
|
||||
LL | Enum::Tuple(0);
|
||||
| ^^^^^^^^^^^^^^^
|
||||
|
||||
error: statement with no effect
|
||||
--> $DIR/no_effect.rs:131:5
|
||||
--> $DIR/no_effect.rs:139:5
|
||||
|
|
||||
LL | Enum::Struct { field: 0 };
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: statement with no effect
|
||||
--> $DIR/no_effect.rs:133:5
|
||||
--> $DIR/no_effect.rs:141:5
|
||||
|
|
||||
LL | 5 + 6;
|
||||
| ^^^^^^
|
||||
|
||||
error: statement with no effect
|
||||
--> $DIR/no_effect.rs:135:5
|
||||
--> $DIR/no_effect.rs:143:5
|
||||
|
|
||||
LL | *&42;
|
||||
| ^^^^^
|
||||
|
||||
error: statement with no effect
|
||||
--> $DIR/no_effect.rs:137:5
|
||||
--> $DIR/no_effect.rs:145:5
|
||||
|
|
||||
LL | &6;
|
||||
| ^^^
|
||||
|
||||
error: statement with no effect
|
||||
--> $DIR/no_effect.rs:139:5
|
||||
--> $DIR/no_effect.rs:147:5
|
||||
|
|
||||
LL | (5, 6, 7);
|
||||
| ^^^^^^^^^^
|
||||
|
||||
error: statement with no effect
|
||||
--> $DIR/no_effect.rs:141:5
|
||||
--> $DIR/no_effect.rs:149:5
|
||||
|
|
||||
LL | ..;
|
||||
| ^^^
|
||||
|
||||
error: statement with no effect
|
||||
--> $DIR/no_effect.rs:143:5
|
||||
--> $DIR/no_effect.rs:151:5
|
||||
|
|
||||
LL | 5..;
|
||||
| ^^^^
|
||||
|
||||
error: statement with no effect
|
||||
--> $DIR/no_effect.rs:145:5
|
||||
--> $DIR/no_effect.rs:153:5
|
||||
|
|
||||
LL | ..5;
|
||||
| ^^^^
|
||||
|
||||
error: statement with no effect
|
||||
--> $DIR/no_effect.rs:147:5
|
||||
--> $DIR/no_effect.rs:155:5
|
||||
|
|
||||
LL | 5..6;
|
||||
| ^^^^^
|
||||
|
||||
error: statement with no effect
|
||||
--> $DIR/no_effect.rs:149:5
|
||||
--> $DIR/no_effect.rs:157:5
|
||||
|
|
||||
LL | 5..=6;
|
||||
| ^^^^^^
|
||||
|
||||
error: statement with no effect
|
||||
--> $DIR/no_effect.rs:151:5
|
||||
--> $DIR/no_effect.rs:159:5
|
||||
|
|
||||
LL | [42, 55];
|
||||
| ^^^^^^^^^
|
||||
|
||||
error: statement with no effect
|
||||
--> $DIR/no_effect.rs:153:5
|
||||
--> $DIR/no_effect.rs:161:5
|
||||
|
|
||||
LL | [42, 55][1];
|
||||
| ^^^^^^^^^^^^
|
||||
|
||||
error: statement with no effect
|
||||
--> $DIR/no_effect.rs:155:5
|
||||
--> $DIR/no_effect.rs:163:5
|
||||
|
|
||||
LL | (42, 55).1;
|
||||
| ^^^^^^^^^^^
|
||||
|
||||
error: statement with no effect
|
||||
--> $DIR/no_effect.rs:157:5
|
||||
--> $DIR/no_effect.rs:165:5
|
||||
|
|
||||
LL | [42; 55];
|
||||
| ^^^^^^^^^
|
||||
|
||||
error: statement with no effect
|
||||
--> $DIR/no_effect.rs:159:5
|
||||
--> $DIR/no_effect.rs:167:5
|
||||
|
|
||||
LL | [42; 55][13];
|
||||
| ^^^^^^^^^^^^^
|
||||
|
||||
error: statement with no effect
|
||||
--> $DIR/no_effect.rs:162:5
|
||||
--> $DIR/no_effect.rs:170:5
|
||||
|
|
||||
LL | || x += 5;
|
||||
| ^^^^^^^^^^
|
||||
|
||||
error: statement with no effect
|
||||
--> $DIR/no_effect.rs:165:5
|
||||
--> $DIR/no_effect.rs:173:5
|
||||
|
|
||||
LL | FooString { s: s };
|
||||
| ^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: binding to `_` prefixed variable with no side-effect
|
||||
--> $DIR/no_effect.rs:167:5
|
||||
--> $DIR/no_effect.rs:175:5
|
||||
|
|
||||
LL | let _unused = 1;
|
||||
| ^^^^^^^^^^^^^^^^
|
||||
@ -161,19 +161,19 @@ LL | let _unused = 1;
|
||||
= help: to override `-D warnings` add `#[allow(clippy::no_effect_underscore_binding)]`
|
||||
|
||||
error: binding to `_` prefixed variable with no side-effect
|
||||
--> $DIR/no_effect.rs:170:5
|
||||
--> $DIR/no_effect.rs:178:5
|
||||
|
|
||||
LL | let _penguin = || println!("Some helpful closure");
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: binding to `_` prefixed variable with no side-effect
|
||||
--> $DIR/no_effect.rs:172:5
|
||||
--> $DIR/no_effect.rs:180:5
|
||||
|
|
||||
LL | let _duck = Struct { field: 0 };
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: binding to `_` prefixed variable with no side-effect
|
||||
--> $DIR/no_effect.rs:174:5
|
||||
--> $DIR/no_effect.rs:182:5
|
||||
|
|
||||
LL | let _cat = [2, 4, 6, 8][2];
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
Loading…
x
Reference in New Issue
Block a user