diff --git a/serde_derive/src/de.rs b/serde_derive/src/de.rs index 778b19346..be4232657 100644 --- a/serde_derive/src/de.rs +++ b/serde_derive/src/de.rs @@ -1344,13 +1344,18 @@ fn deserialize_internally_tagged_enum( ) -> Fragment { let (variants_stmt, variant_visitor) = prepare_enum_variant_enum(variants, cattrs); - let mut default_variant = quote! { None }; - for (i, variant) in variants.iter().enumerate() { - if variant.attrs.default() { - let variant_name = field_i(i); - default_variant = quote!{ Some(__Field::#variant_name) }; + let default_variant = { + for (i, variant) in variants.iter().enumerate() { + if variant.attrs.default() { + return quote_block! { + std::option::Option::Some(__Field::#{field_i(i)}) + }; + } } - } + quote_block! { + std::option::Option::None + } + }; // Match arms to extract a variant from a string let variant_arms = variants diff --git a/serde_derive/src/internals/ast.rs b/serde_derive/src/internals/ast.rs index 739fc8992..cab72c4ff 100644 --- a/serde_derive/src/internals/ast.rs +++ b/serde_derive/src/internals/ast.rs @@ -156,10 +156,12 @@ fn enum_from_ast<'a>( }) .collect(); - // Check only one enum arm is marked #[serde(default)] let mut has_default = false; for variant in &variants { - if variant.attrs.default() && has_default { + if !variant.attrs.default() { + continue; + } + if has_default { cx.error_spanned_by(&variant.ident, "only one variant can be marked as default"); break; }