about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2018-12-29 15:53:43 +0000
committerbors <bors@rust-lang.org>2018-12-29 15:53:43 +0000
commita7fe5afc2e7be5e36b66eb88cf3e118af13d9584 (patch)
tree445520fc71bdcbfd99ee001bd53490b0c7e2e440
parentc93702495e148f61c1a6ce19fab76eca00f41f76 (diff)
parent9fe8a3e52ef42ecf488f86c5fabc6af54708d216 (diff)
downloadrust-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.rs1
-rw-r--r--clippy_lints/src/no_effect.rs14
-rw-r--r--tests/ui/no_effect.rs27
-rw-r--r--tests/ui/no_effect.stderr76
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