Skip to content

Commit

Permalink
Auto merge of rust-lang#6464 - ahouts:make-needless_update-ignore-non…
Browse files Browse the repository at this point in the history
…_exhaustive-structs, r=phansch

make needless_update ignore non_exhaustive structs

changelog: make `needless_update` lint ignore `non_exhaustive` structs

fixes rust-lang#6323
  • Loading branch information
bors committed Dec 19, 2020
2 parents a898df4 + a24c6f1 commit 0718eeb
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 2 deletions.
7 changes: 6 additions & 1 deletion clippy_lints/src/needless_update.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@ declare_clippy_lint! {
/// **What it does:** Checks for needlessly including a base struct on update
/// when all fields are changed anyway.
///
/// This lint is not applied to structs marked with
/// [non_exhaustive](https://doc.rust-lang.org/reference/attributes/type_system.html).
///
/// **Why is this bad?** This will cost resources (because the base has to be
/// somewhere), and make the code less readable.
///
Expand Down Expand Up @@ -49,7 +52,9 @@ impl<'tcx> LateLintPass<'tcx> for NeedlessUpdate {
if let ExprKind::Struct(_, ref fields, Some(ref base)) = expr.kind {
let ty = cx.typeck_results().expr_ty(expr);
if let ty::Adt(def, _) = ty.kind() {
if fields.len() == def.non_enum_variant().fields.len() {
if fields.len() == def.non_enum_variant().fields.len()
&& !def.variants[0_usize.into()].is_field_list_non_exhaustive()
{
span_lint(
cx,
NEEDLESS_UPDATE,
Expand Down
11 changes: 11 additions & 0 deletions tests/ui/needless_update.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,20 @@ struct S {
pub b: i32,
}

#[non_exhaustive]
struct T {
pub x: i32,
pub y: i32,
}

fn main() {
let base = S { a: 0, b: 0 };
S { ..base }; // no error
S { a: 1, ..base }; // no error
S { a: 1, b: 1, ..base };

let base = T { x: 0, y: 0 };
T { ..base }; // no error
T { x: 1, ..base }; // no error
T { x: 1, y: 1, ..base }; // no error
}
2 changes: 1 addition & 1 deletion tests/ui/needless_update.stderr
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
error: struct update has no effect, all the fields in the struct have already been specified
--> $DIR/needless_update.rs:13:23
--> $DIR/needless_update.rs:19:23
|
LL | S { a: 1, b: 1, ..base };
| ^^^^
Expand Down

0 comments on commit 0718eeb

Please sign in to comment.