diff --git a/serde_derive/src/de.rs b/serde_derive/src/de.rs index b0953450..e88d1dd8 100644 --- a/serde_derive/src/de.rs +++ b/serde_derive/src/de.rs @@ -1393,6 +1393,21 @@ fn deserialize_adjacently_tagged_enum( } }; + let finish_content_then_tag = if variant_arms.is_empty() { + quote! { + match try!(_serde::de::MapAccess::next_value::<__Field>(&mut __map)) {} + } + } else { + quote! { + let __ret = try!(match try!(_serde::de::MapAccess::next_value(&mut __map)) { + // Deserialize the buffered content now that we know the variant. + #(#variant_arms)* + }); + // Visit remaining keys, looking for duplicates. + #visit_remaining_keys + } + }; + quote_block! { #variant_visitor @@ -1469,13 +1484,7 @@ fn deserialize_adjacently_tagged_enum( // Second key is the tag. _serde::export::Some(_serde::private::de::TagOrContentField::Tag) => { let __deserializer = _serde::private::de::ContentDeserializer::<__A::Error>::new(__content); - // Parse the tag. - let __ret = try!(match try!(_serde::de::MapAccess::next_value(&mut __map)) { - // Deserialize the buffered content now that we know the variant. - #(#variant_arms)* - }); - // Visit remaining keys, looking for duplicates. - #visit_remaining_keys + #finish_content_then_tag } // Second key is a duplicate of the content. _serde::export::Some(_serde::private::de::TagOrContentField::Content) => { diff --git a/test_suite/tests/test_gen.rs b/test_suite/tests/test_gen.rs index 3de8b8eb..371cc231 100644 --- a/test_suite/tests/test_gen.rs +++ b/test_suite/tests/test_gen.rs @@ -588,6 +588,10 @@ fn test_gen() { } } } + + #[derive(Deserialize)] + #[serde(tag = "t", content = "c")] + enum AdjacentlyTaggedVoid {} } //////////////////////////////////////////////////////////////////////////