diff options
| author | bors <bors@rust-lang.org> | 2022-04-12 16:14:13 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2022-04-12 16:14:13 +0000 |
| commit | 849668ad718ad90ed8a61147968fde2eef772479 (patch) | |
| tree | b3219319b49e853d0eca3b6f61296c4ca5615af3 | |
| parent | f08a9c03690d751893edd4d37e83d65d2ce92305 (diff) | |
| parent | 739f273739a1e4da98d1222f3316d831ae187bc2 (diff) | |
| download | rust-849668ad718ad90ed8a61147968fde2eef772479.tar.gz rust-849668ad718ad90ed8a61147968fde2eef772479.zip | |
Auto merge of #8690 - mucinoab:DoNot-rest_pat_in_fully_bound_structs-OnNonExhaustive, r=Manishearth
Do not trigger ``[`rest_pat_in_fully_bound_structs`]`` on `#[non_exhaustive]` structs fixes #8029 Just adds an additional check to ensure that the`ty::VariantDef` is not marked as `#[non_exhaustive]`. changelog: Do not apply ``[`rest_pat_in_fully_bound_structs`]`` on structs marked as non exhaustive.
| -rw-r--r-- | clippy_lints/src/matches/rest_pat_in_fully_bound_struct.rs | 1 | ||||
| -rw-r--r-- | tests/ui/rest_pat_in_fully_bound_structs.rs | 15 |
2 files changed, 16 insertions, 0 deletions
diff --git a/clippy_lints/src/matches/rest_pat_in_fully_bound_struct.rs b/clippy_lints/src/matches/rest_pat_in_fully_bound_struct.rs index 5076239a57c..0aadb482acd 100644 --- a/clippy_lints/src/matches/rest_pat_in_fully_bound_struct.rs +++ b/clippy_lints/src/matches/rest_pat_in_fully_bound_struct.rs @@ -14,6 +14,7 @@ pub(crate) fn check(cx: &LateContext<'_>, pat: &Pat<'_>) { if let ty::Adt(def, _) = ty.kind(); if def.is_struct() || def.is_union(); if fields.len() == def.non_enum_variant().fields.len(); + if !def.non_enum_variant().is_field_list_non_exhaustive(); then { span_lint_and_help( diff --git a/tests/ui/rest_pat_in_fully_bound_structs.rs b/tests/ui/rest_pat_in_fully_bound_structs.rs index 38fc9969804..086331af6b5 100644 --- a/tests/ui/rest_pat_in_fully_bound_structs.rs +++ b/tests/ui/rest_pat_in_fully_bound_structs.rs @@ -39,4 +39,19 @@ fn main() { // No lint foo!(a_struct); + + #[non_exhaustive] + struct B { + a: u32, + b: u32, + c: u64, + } + + let b_struct = B { a: 5, b: 42, c: 342 }; + + match b_struct { + B { a: 5, b: 42, .. } => {}, + B { a: 0, b: 0, c: 128, .. } => {}, // No Lint + _ => {}, + } } |
