Support array indexing expressions in unused write to a constant
This commit is contained in:
@@ -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`)
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user