Support array indexing expressions in unused write to a constant

This commit is contained in:
Konrad Borowski
2018-12-29 15:34:15 +01:00
parent 847898f18f
commit 9fe8a3e52e
4 changed files with 44 additions and 30 deletions

View File

@@ -20,6 +20,7 @@
#![warn(rust_2018_idioms, trivial_casts, trivial_numeric_casts)] #![warn(rust_2018_idioms, trivial_casts, trivial_numeric_casts)]
#![feature(crate_visibility_modifier)] #![feature(crate_visibility_modifier)]
#![feature(try_from)] #![feature(try_from)]
#![feature(if_while_or_patterns)]
// FIXME: switch to something more ergonomic here, once available. // FIXME: switch to something more ergonomic here, once available.
// (currently there is no way to opt into sysroot crates w/o `extern crate`) // (currently there is no way to opt into sysroot crates w/o `extern crate`)

View File

@@ -101,7 +101,7 @@ fn has_no_effect(cx: &LateContext<'_, '_>, expr: &Expr) -> bool {
ExprKind::Assign(ref left, ref right) => { ExprKind::Assign(ref left, ref right) => {
if has_no_effect(cx, left) { if has_no_effect(cx, left) {
let mut left = left; let mut left = left;
while let ExprKind::Field(f, _) = &left.node { while let ExprKind::Field(f, _) | ExprKind::Index(f, _) = &left.node {
left = f; left = f;
} }
if let ExprKind::Path(qpath) = &left.node { if let ExprKind::Path(qpath) = &left.node {

View File

@@ -74,9 +74,13 @@ struct B {
struct C { struct C {
b: B, b: B,
} }
struct D {
arr: [i32; 1],
}
const A_CONST: A = A(1); const A_CONST: A = A(1);
const B: B = B { field: 1 }; const B: B = B { field: 1 };
const C: C = C { b: B { field: 1 } }; const C: C = C { b: B { field: 1 } };
const D: D = D { arr: [1] };
fn main() { fn main() {
let s = get_struct(); let s = get_struct();
@@ -113,6 +117,7 @@ fn main() {
A_CONST.0 = 2; A_CONST.0 = 2;
B.field = 2; B.field = 2;
C.b.field = 2; C.b.field = 2;
D.arr[0] = 2;
// Do not warn // Do not warn
get_number(); get_number();
@@ -128,4 +133,6 @@ fn main() {
b_mut.field = 2; b_mut.field = 2;
let mut c_mut = C { b: B { field: 1 } }; let mut c_mut = C { b: B { field: 1 } };
c_mut.b.field = 2; c_mut.b.field = 2;
let mut d_mut = D { arr: [1] };
d_mut.arr[0] = 2;
} }

View File

@@ -1,5 +1,5 @@
error: statement with no effect error: statement with no effect
--> $DIR/no_effect.rs:85:5 --> $DIR/no_effect.rs:89:5
| |
LL | 0; LL | 0;
| ^^ | ^^
@@ -7,166 +7,172 @@ LL | 0;
= note: `-D clippy::no-effect` implied by `-D warnings` = note: `-D clippy::no-effect` implied by `-D warnings`
error: statement with no effect error: statement with no effect
--> $DIR/no_effect.rs:86:5 --> $DIR/no_effect.rs:90:5
| |
LL | s2; LL | s2;
| ^^^ | ^^^
error: statement with no effect error: statement with no effect
--> $DIR/no_effect.rs:87:5 --> $DIR/no_effect.rs:91:5
| |
LL | Unit; LL | Unit;
| ^^^^^ | ^^^^^
error: statement with no effect error: statement with no effect
--> $DIR/no_effect.rs:88:5 --> $DIR/no_effect.rs:92:5
| |
LL | Tuple(0); LL | Tuple(0);
| ^^^^^^^^^ | ^^^^^^^^^
error: statement with no effect error: statement with no effect
--> $DIR/no_effect.rs:89:5 --> $DIR/no_effect.rs:93:5
| |
LL | Struct { field: 0 }; LL | Struct { field: 0 };
| ^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^
error: statement with no effect error: statement with no effect
--> $DIR/no_effect.rs:90:5 --> $DIR/no_effect.rs:94:5
| |
LL | Struct { ..s }; LL | Struct { ..s };
| ^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^
error: statement with no effect error: statement with no effect
--> $DIR/no_effect.rs:91:5 --> $DIR/no_effect.rs:95:5
| |
LL | Union { a: 0 }; LL | Union { a: 0 };
| ^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^
error: statement with no effect error: statement with no effect
--> $DIR/no_effect.rs:92:5 --> $DIR/no_effect.rs:96:5
| |
LL | Enum::Tuple(0); LL | Enum::Tuple(0);
| ^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^
error: statement with no effect error: statement with no effect
--> $DIR/no_effect.rs:93:5 --> $DIR/no_effect.rs:97:5
| |
LL | Enum::Struct { field: 0 }; LL | Enum::Struct { field: 0 };
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^
error: statement with no effect error: statement with no effect
--> $DIR/no_effect.rs:94:5 --> $DIR/no_effect.rs:98:5
| |
LL | 5 + 6; LL | 5 + 6;
| ^^^^^^ | ^^^^^^
error: statement with no effect error: statement with no effect
--> $DIR/no_effect.rs:95:5 --> $DIR/no_effect.rs:99:5
| |
LL | *&42; LL | *&42;
| ^^^^^ | ^^^^^
error: statement with no effect error: statement with no effect
--> $DIR/no_effect.rs:96:5 --> $DIR/no_effect.rs:100:5
| |
LL | &6; LL | &6;
| ^^^ | ^^^
error: statement with no effect error: statement with no effect
--> $DIR/no_effect.rs:97:5 --> $DIR/no_effect.rs:101:5
| |
LL | (5, 6, 7); LL | (5, 6, 7);
| ^^^^^^^^^^ | ^^^^^^^^^^
error: statement with no effect error: statement with no effect
--> $DIR/no_effect.rs:98:5 --> $DIR/no_effect.rs:102:5
| |
LL | box 42; LL | box 42;
| ^^^^^^^ | ^^^^^^^
error: statement with no effect error: statement with no effect
--> $DIR/no_effect.rs:99:5 --> $DIR/no_effect.rs:103:5
| |
LL | ..; LL | ..;
| ^^^ | ^^^
error: statement with no effect error: statement with no effect
--> $DIR/no_effect.rs:100:5 --> $DIR/no_effect.rs:104:5
| |
LL | 5..; LL | 5..;
| ^^^^ | ^^^^
error: statement with no effect error: statement with no effect
--> $DIR/no_effect.rs:101:5 --> $DIR/no_effect.rs:105:5
| |
LL | ..5; LL | ..5;
| ^^^^ | ^^^^
error: statement with no effect error: statement with no effect
--> $DIR/no_effect.rs:102:5 --> $DIR/no_effect.rs:106:5
| |
LL | 5..6; LL | 5..6;
| ^^^^^ | ^^^^^
error: statement with no effect error: statement with no effect
--> $DIR/no_effect.rs:104:5 --> $DIR/no_effect.rs:108:5
| |
LL | [42, 55]; LL | [42, 55];
| ^^^^^^^^^ | ^^^^^^^^^
error: statement with no effect error: statement with no effect
--> $DIR/no_effect.rs:105:5 --> $DIR/no_effect.rs:109:5
| |
LL | [42, 55][1]; LL | [42, 55][1];
| ^^^^^^^^^^^^ | ^^^^^^^^^^^^
error: statement with no effect error: statement with no effect
--> $DIR/no_effect.rs:106:5 --> $DIR/no_effect.rs:110:5
| |
LL | (42, 55).1; LL | (42, 55).1;
| ^^^^^^^^^^^ | ^^^^^^^^^^^
error: statement with no effect error: statement with no effect
--> $DIR/no_effect.rs:107:5 --> $DIR/no_effect.rs:111:5
| |
LL | [42; 55]; LL | [42; 55];
| ^^^^^^^^^ | ^^^^^^^^^
error: statement with no effect error: statement with no effect
--> $DIR/no_effect.rs:108:5 --> $DIR/no_effect.rs:112:5
| |
LL | [42; 55][13]; LL | [42; 55][13];
| ^^^^^^^^^^^^^ | ^^^^^^^^^^^^^
error: statement with no effect error: statement with no effect
--> $DIR/no_effect.rs:110:5 --> $DIR/no_effect.rs:114:5
| |
LL | || x += 5; LL | || x += 5;
| ^^^^^^^^^^ | ^^^^^^^^^^
error: statement with no effect error: statement with no effect
--> $DIR/no_effect.rs:112:5 --> $DIR/no_effect.rs:116:5
| |
LL | FooString { s: s }; LL | FooString { s: s };
| ^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^
error: statement with no effect error: statement with no effect
--> $DIR/no_effect.rs:113:5 --> $DIR/no_effect.rs:117:5
| |
LL | A_CONST.0 = 2; LL | A_CONST.0 = 2;
| ^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^
error: statement with no effect error: statement with no effect
--> $DIR/no_effect.rs:114:5 --> $DIR/no_effect.rs:118:5
| |
LL | B.field = 2; LL | B.field = 2;
| ^^^^^^^^^^^^ | ^^^^^^^^^^^^
error: statement with no effect error: statement with no effect
--> $DIR/no_effect.rs:115:5 --> $DIR/no_effect.rs:119:5
| |
LL | C.b.field = 2; LL | C.b.field = 2;
| ^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^
error: aborting due to 28 previous errors error: statement with no effect
--> $DIR/no_effect.rs:120:5
|
LL | D.arr[0] = 2;
| ^^^^^^^^^^^^^
error: aborting due to 29 previous errors