diff options
| author | bors <bors@rust-lang.org> | 2018-12-29 15:53:43 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2018-12-29 15:53:43 +0000 |
| commit | a7fe5afc2e7be5e36b66eb88cf3e118af13d9584 (patch) | |
| tree | 445520fc71bdcbfd99ee001bd53490b0c7e2e440 | |
| parent | c93702495e148f61c1a6ce19fab76eca00f41f76 (diff) | |
| parent | 9fe8a3e52ef42ecf488f86c5fabc6af54708d216 (diff) | |
| download | rust-a7fe5afc2e7be5e36b66eb88cf3e118af13d9584.tar.gz rust-a7fe5afc2e7be5e36b66eb88cf3e118af13d9584.zip | |
Auto merge of #3595 - xfix:mark-writes-to-constant-as-sideeffectless, r=oli-obk
Mark writes to constants as side-effect-less This is my first real contribution, so I probably did it wrong.
| -rw-r--r-- | clippy_lints/src/lib.rs | 1 | ||||
| -rw-r--r-- | clippy_lints/src/no_effect.rs | 14 | ||||
| -rw-r--r-- | tests/ui/no_effect.rs | 27 | ||||
| -rw-r--r-- | tests/ui/no_effect.stderr | 76 |
4 files changed, 92 insertions, 26 deletions
diff --git a/clippy_lints/src/lib.rs b/clippy_lints/src/lib.rs index 8ce5861a939..560b1f61850 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 f30da9c909d..cab60509a78 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 6b51c50dcde..8431f00e445 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 cc3b069f0b5..b6aab53e50f 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 |
