Skip to content

Commit

Permalink
Add check for unary-operator
Browse files Browse the repository at this point in the history
Fix typo and add test for unary-opeator
  • Loading branch information
cocodery committed Dec 6, 2023
1 parent 2e3c031 commit ee2354b
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 36 deletions.
10 changes: 5 additions & 5 deletions clippy_lints/src/no_effect.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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,
Expand Down
12 changes: 10 additions & 2 deletions tests/ui/no_effect.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
)]

use std::fmt::Display;
use std::ops::Shl;
use std::ops::{Neg, Shl};

struct Cout;

Expand All @@ -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 {
Expand Down Expand Up @@ -196,5 +204,5 @@ fn main() {
}

Cout << 142;
Cout << n();
-Cout;
}
58 changes: 29 additions & 29 deletions tests/ui/no_effect.stderr
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
error: statement with no effect
--> $DIR/no_effect.rs:114:5
--> $DIR/no_effect.rs:122:5
|
LL | 0;
| ^^
Expand All @@ -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;
| ^^^^^^^^^^^^^^^^
Expand All @@ -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];
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
Expand Down

0 comments on commit ee2354b

Please sign in to comment.