This repository was archived by the owner on May 28, 2025. It is now read-only.
File tree Expand file tree Collapse file tree 3 files changed +18
-2
lines changed Expand file tree Collapse file tree 3 files changed +18
-2
lines changed Original file line number Diff line number Diff line change @@ -8,6 +8,9 @@ declare_clippy_lint! {
8
8
/// **What it does:** Checks for needlessly including a base struct on update
9
9
/// when all fields are changed anyway.
10
10
///
11
+ /// This lint is not applied to structs marked with
12
+ /// [non_exhaustive](https://doc.rust-lang.org/reference/attributes/type_system.html).
13
+ ///
11
14
/// **Why is this bad?** This will cost resources (because the base has to be
12
15
/// somewhere), and make the code less readable.
13
16
///
@@ -49,7 +52,9 @@ impl<'tcx> LateLintPass<'tcx> for NeedlessUpdate {
49
52
if let ExprKind :: Struct ( _, ref fields, Some ( ref base) ) = expr. kind {
50
53
let ty = cx. typeck_results ( ) . expr_ty ( expr) ;
51
54
if let ty:: Adt ( def, _) = ty. kind ( ) {
52
- if fields. len ( ) == def. non_enum_variant ( ) . fields . len ( ) {
55
+ if fields. len ( ) == def. non_enum_variant ( ) . fields . len ( )
56
+ && !def. variants [ 0_usize . into ( ) ] . is_field_list_non_exhaustive ( )
57
+ {
53
58
span_lint (
54
59
cx,
55
60
NEEDLESS_UPDATE ,
Original file line number Diff line number Diff line change @@ -6,9 +6,20 @@ struct S {
6
6
pub b : i32 ,
7
7
}
8
8
9
+ #[ non_exhaustive]
10
+ struct T {
11
+ pub x : i32 ,
12
+ pub y : i32 ,
13
+ }
14
+
9
15
fn main ( ) {
10
16
let base = S { a : 0 , b : 0 } ;
11
17
S { ..base } ; // no error
12
18
S { a : 1 , ..base } ; // no error
13
19
S { a : 1 , b : 1 , ..base } ;
20
+
21
+ let base = T { x : 0 , y : 0 } ;
22
+ T { ..base } ; // no error
23
+ T { x : 1 , ..base } ; // no error
24
+ T { x : 1 , y : 1 , ..base } ; // no error
14
25
}
Original file line number Diff line number Diff line change 1
1
error: struct update has no effect, all the fields in the struct have already been specified
2
- --> $DIR/needless_update.rs:13 :23
2
+ --> $DIR/needless_update.rs:19 :23
3
3
|
4
4
LL | S { a: 1, b: 1, ..base };
5
5
| ^^^^
You can’t perform that action at this time.
0 commit comments