From 847898f18f67e3009db0715d1bb3f083974c7b27 Mon Sep 17 00:00:00 2001 From: Konrad Borowski Date: Sat, 29 Dec 2018 15:14:04 +0100 Subject: [PATCH] Mark writes to constants as side-effect-less --- clippy_lints/src/no_effect.rs | 14 +++++++ tests/ui/no_effect.rs | 20 ++++++++++ tests/ui/no_effect.stderr | 70 ++++++++++++++++++++++------------- 3 files changed, 78 insertions(+), 26 deletions(-) diff --git a/clippy_lints/src/no_effect.rs b/clippy_lints/src/no_effect.rs index f30da9c909d..3dd5c10c939 100644 --- a/clippy_lints/src/no_effect.rs +++ b/clippy_lints/src/no_effect.rs @@ -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, } } diff --git a/tests/ui/no_effect.rs b/tests/ui/no_effect.rs index 6b51c50dcde..9af51dcf6f4 100644 --- a/tests/ui/no_effect.rs +++ b/tests/ui/no_effect.rs @@ -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(); @@ -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(); @@ -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; } diff --git a/tests/ui/no_effect.stderr b/tests/ui/no_effect.stderr index cc3b069f0b5..6ddc891ec28 100644 --- a/tests/ui/no_effect.stderr +++ b/tests/ui/no_effect.stderr @@ -1,5 +1,5 @@ error: statement with no effect - --> $DIR/no_effect.rs:74:5 + --> $DIR/no_effect.rs:85:5 | LL | 0; | ^^ @@ -7,148 +7,166 @@ 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