diff --git a/serde_codegen/src/de.rs b/serde_codegen/src/de.rs index 09475ace..0084271e 100644 --- a/serde_codegen/src/de.rs +++ b/serde_codegen/src/de.rs @@ -499,25 +499,27 @@ fn deserialize_item_enum( }; // Match arms to extract a variant from a string - let mut variant_arms = vec![]; - for (i, variant) in variants.iter().filter(|variant| !variant.attrs.skip_deserializing()).enumerate() { - let variant_name = field_i(i); + let variant_arms = variants.iter() + .enumerate() + .filter(|&(_, variant)| !variant.attrs.skip_deserializing()) + .map(|(i, variant)| { + let variant_name = field_i(i); - let block = deserialize_variant( - type_ident, - impl_generics, - ty.clone(), - variant, - item_attrs, - ); + let block = deserialize_variant( + type_ident, + impl_generics, + ty.clone(), + variant, + item_attrs, + ); - let arm = quote! { - __Field::#variant_name => #block - }; - variant_arms.push(arm); - } + quote! { + __Field::#variant_name => #block + } + }); - let match_variant = if variant_arms.is_empty() { + let all_skipped = variants.iter().all(|variant| variant.attrs.skip_deserializing()); + let match_variant = if all_skipped { // This is an empty enum like `enum Impossible {}` or an enum in which // all variants have `#[serde(skip_deserializing)]`. quote! { diff --git a/testing/tests/test_de.rs b/testing/tests/test_de.rs index 7d9006d9..4f455236 100644 --- a/testing/tests/test_de.rs +++ b/testing/tests/test_de.rs @@ -42,13 +42,13 @@ struct StructDenyUnknown { #[derive(PartialEq, Debug, Deserialize)] enum Enum { + #[allow(dead_code)] + #[serde(skip_deserializing)] + Skipped, Unit, Simple(i32), Seq(i32, i32, i32), Map { a: i32, b: i32, c: i32 }, - #[allow(dead_code)] - #[serde(skip_deserializing)] - Skipped, } //////////////////////////////////////////////////////////////////////////