Skip to content

Commit

Permalink
Mark writes to constants as side-effect-less
Browse files Browse the repository at this point in the history
  • Loading branch information
KamilaBorowska committed Dec 29, 2018
1 parent c937024 commit 7a0e132
Show file tree
Hide file tree
Showing 4 changed files with 81 additions and 26 deletions.
14 changes: 14 additions & 0 deletions clippy_lints/src/no_effect.rs
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,20 @@ fn has_no_effect(cx: &LateContext<'_, '_>, expr: &Expr) -> bool {
false
}
},
ExprKind::Assign(ref left, ref right) => {
if has_no_effect(cx, left) {
let mut left = left;
while let ExprKind::Field(f, _) = &left.node {
left = f;
}
if let ExprKind::Path(qpath) = &left.node {
if let Def::Const(..) = cx.tables.qpath_def(qpath, left.hir_id) {
return has_no_effect(cx, right);
}
}
}
false
},
_ => false,
}
}
Expand Down
20 changes: 20 additions & 0 deletions tests/ui/no_effect.rs
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,17 @@ unsafe fn unsafe_fn() -> i32 {
0
}

struct A(i32);
struct B {
field: i32,
}
struct C {
b: B,
}
const A_CONST: A = A(1);
const B: B = B { field: 1 };
const C: C = C { b: B { field: 1 } };

fn main() {
let s = get_struct();
let s2 = get_struct();
Expand Down Expand Up @@ -99,6 +110,9 @@ fn main() {
|| x += 5;
let s: String = "foo".into();
FooString { s: s };
A_CONST.0 = 2;
B.field = 2;
C.b.field = 2;

// Do not warn
get_number();
Expand All @@ -108,4 +122,10 @@ fn main() {
DropTuple(0);
DropEnum::Tuple(0);
DropEnum::Struct { field: 0 };
let mut a_mut = A(1);
a_mut.0 = 2;
let mut b_mut = B { field: 1 };
b_mut.field = 2;
let mut c_mut = C { b: B { field: 1 } };
c_mut.b.field = 2;
}
70 changes: 44 additions & 26 deletions tests/ui/no_effect.stderr
Original file line number Diff line number Diff line change
@@ -1,154 +1,172 @@
error: statement with no effect
--> $DIR/no_effect.rs:74:5
--> $DIR/no_effect.rs:85:5
|
LL | 0;
| ^^
|
= note: `-D clippy::no-effect` implied by `-D warnings`

error: statement with no effect
--> $DIR/no_effect.rs:75:5
--> $DIR/no_effect.rs:86:5
|
LL | s2;
| ^^^

error: statement with no effect
--> $DIR/no_effect.rs:76:5
--> $DIR/no_effect.rs:87:5
|
LL | Unit;
| ^^^^^

error: statement with no effect
--> $DIR/no_effect.rs:77:5
--> $DIR/no_effect.rs:88:5
|
LL | Tuple(0);
| ^^^^^^^^^

error: statement with no effect
--> $DIR/no_effect.rs:78:5
--> $DIR/no_effect.rs:89:5
|
LL | Struct { field: 0 };
| ^^^^^^^^^^^^^^^^^^^^

error: statement with no effect
--> $DIR/no_effect.rs:79:5
--> $DIR/no_effect.rs:90:5
|
LL | Struct { ..s };
| ^^^^^^^^^^^^^^^

error: statement with no effect
--> $DIR/no_effect.rs:80:5
--> $DIR/no_effect.rs:91:5
|
LL | Union { a: 0 };
| ^^^^^^^^^^^^^^^

error: statement with no effect
--> $DIR/no_effect.rs:81:5
--> $DIR/no_effect.rs:92:5
|
LL | Enum::Tuple(0);
| ^^^^^^^^^^^^^^^

error: statement with no effect
--> $DIR/no_effect.rs:82:5
--> $DIR/no_effect.rs:93:5
|
LL | Enum::Struct { field: 0 };
| ^^^^^^^^^^^^^^^^^^^^^^^^^^

error: statement with no effect
--> $DIR/no_effect.rs:83:5
--> $DIR/no_effect.rs:94:5
|
LL | 5 + 6;
| ^^^^^^

error: statement with no effect
--> $DIR/no_effect.rs:84:5
--> $DIR/no_effect.rs:95:5
|
LL | *&42;
| ^^^^^

error: statement with no effect
--> $DIR/no_effect.rs:85:5
--> $DIR/no_effect.rs:96:5
|
LL | &6;
| ^^^

error: statement with no effect
--> $DIR/no_effect.rs:86:5
--> $DIR/no_effect.rs:97:5
|
LL | (5, 6, 7);
| ^^^^^^^^^^

error: statement with no effect
--> $DIR/no_effect.rs:87:5
--> $DIR/no_effect.rs:98:5
|
LL | box 42;
| ^^^^^^^

error: statement with no effect
--> $DIR/no_effect.rs:88:5
--> $DIR/no_effect.rs:99:5
|
LL | ..;
| ^^^

error: statement with no effect
--> $DIR/no_effect.rs:89:5
--> $DIR/no_effect.rs:100:5
|
LL | 5..;
| ^^^^

error: statement with no effect
--> $DIR/no_effect.rs:90:5
--> $DIR/no_effect.rs:101:5
|
LL | ..5;
| ^^^^

error: statement with no effect
--> $DIR/no_effect.rs:91:5
--> $DIR/no_effect.rs:102:5
|
LL | 5..6;
| ^^^^^

error: statement with no effect
--> $DIR/no_effect.rs:93:5
--> $DIR/no_effect.rs:104:5
|
LL | [42, 55];
| ^^^^^^^^^

error: statement with no effect
--> $DIR/no_effect.rs:94:5
--> $DIR/no_effect.rs:105:5
|
LL | [42, 55][1];
| ^^^^^^^^^^^^

error: statement with no effect
--> $DIR/no_effect.rs:95:5
--> $DIR/no_effect.rs:106:5
|
LL | (42, 55).1;
| ^^^^^^^^^^^

error: statement with no effect
--> $DIR/no_effect.rs:96:5
--> $DIR/no_effect.rs:107:5
|
LL | [42; 55];
| ^^^^^^^^^

error: statement with no effect
--> $DIR/no_effect.rs:97:5
--> $DIR/no_effect.rs:108:5
|
LL | [42; 55][13];
| ^^^^^^^^^^^^^

error: statement with no effect
--> $DIR/no_effect.rs:99:5
--> $DIR/no_effect.rs:110:5
|
LL | || x += 5;
| ^^^^^^^^^^

error: statement with no effect
--> $DIR/no_effect.rs:101:5
--> $DIR/no_effect.rs:112:5
|
LL | FooString { s: s };
| ^^^^^^^^^^^^^^^^^^^

error: aborting due to 25 previous errors
error: statement with no effect
--> $DIR/no_effect.rs:113:5
|
LL | A_CONST.0 = 2;
| ^^^^^^^^^^^^^^

error: statement with no effect
--> $DIR/no_effect.rs:114:5
|
LL | B.field = 2;
| ^^^^^^^^^^^^

error: statement with no effect
--> $DIR/no_effect.rs:115:5
|
LL | C.b.field = 2;
| ^^^^^^^^^^^^^^

error: aborting due to 28 previous errors

3 changes: 3 additions & 0 deletions tests/ui/no_effect.stdout
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Resolved(None, path(A_CONST))
Resolved(None, path(B))
Resolved(None, path(C))

0 comments on commit 7a0e132

Please sign in to comment.