diff --git a/clippy_lints/src/lib.rs b/clippy_lints/src/lib.rs index 8ce5861a9..560b1f618 100644 --- a/clippy_lints/src/lib.rs +++ b/clippy_lints/src/lib.rs @@ -20,6 +20,7 @@ #![warn(rust_2018_idioms, trivial_casts, trivial_numeric_casts)] #![feature(crate_visibility_modifier)] #![feature(try_from)] +#![feature(if_while_or_patterns)] // FIXME: switch to something more ergonomic here, once available. // (currently there is no way to opt into sysroot crates w/o `extern crate`) diff --git a/clippy_lints/src/no_effect.rs b/clippy_lints/src/no_effect.rs index f30da9c90..cab60509a 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, _) | ExprKind::Index(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 6b51c50dc..8431f00e4 100644 --- a/tests/ui/no_effect.rs +++ b/tests/ui/no_effect.rs @@ -67,6 +67,21 @@ unsafe fn unsafe_fn() -> i32 { 0 } +struct A(i32); +struct B { + field: i32, +} +struct C { + b: B, +} +struct D { + arr: [i32; 1], +} +const A_CONST: A = A(1); +const B: B = B { field: 1 }; +const C: C = C { b: B { field: 1 } }; +const D: D = D { arr: [1] }; + fn main() { let s = get_struct(); let s2 = get_struct(); @@ -99,6 +114,10 @@ fn main() { || x += 5; let s: String = "foo".into(); FooString { s: s }; + A_CONST.0 = 2; + B.field = 2; + C.b.field = 2; + D.arr[0] = 2; // Do not warn get_number(); @@ -108,4 +127,12 @@ 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; + let mut d_mut = D { arr: [1] }; + d_mut.arr[0] = 2; } diff --git a/tests/ui/no_effect.stderr b/tests/ui/no_effect.stderr index cc3b069f0..b6aab53e5 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:89:5 | LL | 0; | ^^ @@ -7,148 +7,172 @@ 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:90:5 | LL | s2; | ^^^ error: statement with no effect - --> $DIR/no_effect.rs:76:5 + --> $DIR/no_effect.rs:91:5 | LL | Unit; | ^^^^^ error: statement with no effect - --> $DIR/no_effect.rs:77:5 + --> $DIR/no_effect.rs:92:5 | LL | Tuple(0); | ^^^^^^^^^ error: statement with no effect - --> $DIR/no_effect.rs:78:5 + --> $DIR/no_effect.rs:93:5 | LL | Struct { field: 0 }; | ^^^^^^^^^^^^^^^^^^^^ error: statement with no effect - --> $DIR/no_effect.rs:79:5 + --> $DIR/no_effect.rs:94:5 | LL | Struct { ..s }; | ^^^^^^^^^^^^^^^ error: statement with no effect - --> $DIR/no_effect.rs:80:5 + --> $DIR/no_effect.rs:95:5 | LL | Union { a: 0 }; | ^^^^^^^^^^^^^^^ error: statement with no effect - --> $DIR/no_effect.rs:81:5 + --> $DIR/no_effect.rs:96:5 | LL | Enum::Tuple(0); | ^^^^^^^^^^^^^^^ error: statement with no effect - --> $DIR/no_effect.rs:82:5 + --> $DIR/no_effect.rs:97:5 | LL | Enum::Struct { field: 0 }; | ^^^^^^^^^^^^^^^^^^^^^^^^^^ error: statement with no effect - --> $DIR/no_effect.rs:83:5 + --> $DIR/no_effect.rs:98:5 | LL | 5 + 6; | ^^^^^^ error: statement with no effect - --> $DIR/no_effect.rs:84:5 + --> $DIR/no_effect.rs:99:5 | LL | *&42; | ^^^^^ error: statement with no effect - --> $DIR/no_effect.rs:85:5 + --> $DIR/no_effect.rs:100:5 | LL | &6; | ^^^ error: statement with no effect - --> $DIR/no_effect.rs:86:5 + --> $DIR/no_effect.rs:101:5 | LL | (5, 6, 7); | ^^^^^^^^^^ error: statement with no effect - --> $DIR/no_effect.rs:87:5 + --> $DIR/no_effect.rs:102:5 | LL | box 42; | ^^^^^^^ error: statement with no effect - --> $DIR/no_effect.rs:88:5 + --> $DIR/no_effect.rs:103:5 | LL | ..; | ^^^ error: statement with no effect - --> $DIR/no_effect.rs:89:5 + --> $DIR/no_effect.rs:104:5 | LL | 5..; | ^^^^ error: statement with no effect - --> $DIR/no_effect.rs:90:5 + --> $DIR/no_effect.rs:105:5 | LL | ..5; | ^^^^ error: statement with no effect - --> $DIR/no_effect.rs:91:5 + --> $DIR/no_effect.rs:106:5 | LL | 5..6; | ^^^^^ error: statement with no effect - --> $DIR/no_effect.rs:93:5 + --> $DIR/no_effect.rs:108:5 | LL | [42, 55]; | ^^^^^^^^^ error: statement with no effect - --> $DIR/no_effect.rs:94:5 + --> $DIR/no_effect.rs:109:5 | LL | [42, 55][1]; | ^^^^^^^^^^^^ error: statement with no effect - --> $DIR/no_effect.rs:95:5 + --> $DIR/no_effect.rs:110:5 | LL | (42, 55).1; | ^^^^^^^^^^^ error: statement with no effect - --> $DIR/no_effect.rs:96:5 + --> $DIR/no_effect.rs:111:5 | LL | [42; 55]; | ^^^^^^^^^ error: statement with no effect - --> $DIR/no_effect.rs:97:5 + --> $DIR/no_effect.rs:112:5 | LL | [42; 55][13]; | ^^^^^^^^^^^^^ error: statement with no effect - --> $DIR/no_effect.rs:99:5 + --> $DIR/no_effect.rs:114:5 | LL | || x += 5; | ^^^^^^^^^^ error: statement with no effect - --> $DIR/no_effect.rs:101:5 + --> $DIR/no_effect.rs:116:5 | LL | FooString { s: s }; | ^^^^^^^^^^^^^^^^^^^ -error: aborting due to 25 previous errors +error: statement with no effect + --> $DIR/no_effect.rs:117:5 + | +LL | A_CONST.0 = 2; + | ^^^^^^^^^^^^^^ + +error: statement with no effect + --> $DIR/no_effect.rs:118:5 + | +LL | B.field = 2; + | ^^^^^^^^^^^^ + +error: statement with no effect + --> $DIR/no_effect.rs:119:5 + | +LL | C.b.field = 2; + | ^^^^^^^^^^^^^^ + +error: statement with no effect + --> $DIR/no_effect.rs:120:5 + | +LL | D.arr[0] = 2; + | ^^^^^^^^^^^^^ + +error: aborting due to 29 previous errors