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 3dd5c10c939..cab60509a78 100644 --- a/clippy_lints/src/no_effect.rs +++ b/clippy_lints/src/no_effect.rs @@ -101,7 +101,7 @@ fn has_no_effect(cx: &LateContext<'_, '_>, expr: &Expr) -> bool { ExprKind::Assign(ref left, ref right) => { if has_no_effect(cx, left) { let mut left = left; - while let ExprKind::Field(f, _) = &left.node { + while let ExprKind::Field(f, _) | ExprKind::Index(f, _) = &left.node { left = f; } if let ExprKind::Path(qpath) = &left.node { diff --git a/tests/ui/no_effect.rs b/tests/ui/no_effect.rs index 9af51dcf6f4..8431f00e445 100644 --- a/tests/ui/no_effect.rs +++ b/tests/ui/no_effect.rs @@ -74,9 +74,13 @@ struct B { 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(); @@ -113,6 +117,7 @@ fn main() { A_CONST.0 = 2; B.field = 2; C.b.field = 2; + D.arr[0] = 2; // Do not warn get_number(); @@ -128,4 +133,6 @@ fn main() { 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 6ddc891ec28..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:85:5 + --> $DIR/no_effect.rs:89:5 | LL | 0; | ^^ @@ -7,166 +7,172 @@ LL | 0; = note: `-D clippy::no-effect` implied by `-D warnings` error: statement with no effect - --> $DIR/no_effect.rs:86:5 + --> $DIR/no_effect.rs:90:5 | LL | s2; | ^^^ error: statement with no effect - --> $DIR/no_effect.rs:87:5 + --> $DIR/no_effect.rs:91:5 | LL | Unit; | ^^^^^ error: statement with no effect - --> $DIR/no_effect.rs:88:5 + --> $DIR/no_effect.rs:92:5 | LL | Tuple(0); | ^^^^^^^^^ error: statement with no effect - --> $DIR/no_effect.rs:89:5 + --> $DIR/no_effect.rs:93:5 | LL | Struct { field: 0 }; | ^^^^^^^^^^^^^^^^^^^^ error: statement with no effect - --> $DIR/no_effect.rs:90:5 + --> $DIR/no_effect.rs:94:5 | LL | Struct { ..s }; | ^^^^^^^^^^^^^^^ error: statement with no effect - --> $DIR/no_effect.rs:91:5 + --> $DIR/no_effect.rs:95:5 | LL | Union { a: 0 }; | ^^^^^^^^^^^^^^^ error: statement with no effect - --> $DIR/no_effect.rs:92:5 + --> $DIR/no_effect.rs:96:5 | LL | Enum::Tuple(0); | ^^^^^^^^^^^^^^^ error: statement with no effect - --> $DIR/no_effect.rs:93:5 + --> $DIR/no_effect.rs:97:5 | LL | Enum::Struct { field: 0 }; | ^^^^^^^^^^^^^^^^^^^^^^^^^^ error: statement with no effect - --> $DIR/no_effect.rs:94:5 + --> $DIR/no_effect.rs:98:5 | LL | 5 + 6; | ^^^^^^ error: statement with no effect - --> $DIR/no_effect.rs:95:5 + --> $DIR/no_effect.rs:99:5 | LL | *&42; | ^^^^^ error: statement with no effect - --> $DIR/no_effect.rs:96:5 + --> $DIR/no_effect.rs:100:5 | LL | &6; | ^^^ error: statement with no effect - --> $DIR/no_effect.rs:97:5 + --> $DIR/no_effect.rs:101:5 | LL | (5, 6, 7); | ^^^^^^^^^^ error: statement with no effect - --> $DIR/no_effect.rs:98:5 + --> $DIR/no_effect.rs:102:5 | LL | box 42; | ^^^^^^^ error: statement with no effect - --> $DIR/no_effect.rs:99:5 + --> $DIR/no_effect.rs:103:5 | LL | ..; | ^^^ error: statement with no effect - --> $DIR/no_effect.rs:100:5 + --> $DIR/no_effect.rs:104:5 | LL | 5..; | ^^^^ error: statement with no effect - --> $DIR/no_effect.rs:101:5 + --> $DIR/no_effect.rs:105:5 | LL | ..5; | ^^^^ error: statement with no effect - --> $DIR/no_effect.rs:102:5 + --> $DIR/no_effect.rs:106:5 | LL | 5..6; | ^^^^^ error: statement with no effect - --> $DIR/no_effect.rs:104:5 + --> $DIR/no_effect.rs:108:5 | LL | [42, 55]; | ^^^^^^^^^ error: statement with no effect - --> $DIR/no_effect.rs:105:5 + --> $DIR/no_effect.rs:109:5 | LL | [42, 55][1]; | ^^^^^^^^^^^^ error: statement with no effect - --> $DIR/no_effect.rs:106:5 + --> $DIR/no_effect.rs:110:5 | LL | (42, 55).1; | ^^^^^^^^^^^ error: statement with no effect - --> $DIR/no_effect.rs:107:5 + --> $DIR/no_effect.rs:111:5 | LL | [42; 55]; | ^^^^^^^^^ error: statement with no effect - --> $DIR/no_effect.rs:108:5 + --> $DIR/no_effect.rs:112:5 | LL | [42; 55][13]; | ^^^^^^^^^^^^^ error: statement with no effect - --> $DIR/no_effect.rs:110:5 + --> $DIR/no_effect.rs:114:5 | LL | || x += 5; | ^^^^^^^^^^ error: statement with no effect - --> $DIR/no_effect.rs:112:5 + --> $DIR/no_effect.rs:116:5 | LL | FooString { s: s }; | ^^^^^^^^^^^^^^^^^^^ error: statement with no effect - --> $DIR/no_effect.rs:113:5 + --> $DIR/no_effect.rs:117:5 | LL | A_CONST.0 = 2; | ^^^^^^^^^^^^^^ error: statement with no effect - --> $DIR/no_effect.rs:114:5 + --> $DIR/no_effect.rs:118:5 | LL | B.field = 2; | ^^^^^^^^^^^^ error: statement with no effect - --> $DIR/no_effect.rs:115:5 + --> $DIR/no_effect.rs:119:5 | 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