diff --git a/serde/src/private/de.rs b/serde/src/private/de.rs index 8fb40ff18..51c7035a3 100644 --- a/serde/src/private/de.rs +++ b/serde/src/private/de.rs @@ -231,8 +231,8 @@ mod content { use super::size_hint; use de::{ - self, Deserialize, DeserializeSeed, Deserializer, EnumAccess, Expected, MapAccess, - SeqAccess, Unexpected, Visitor, + self, Deserialize, DeserializeSeed, Deserializer, EnumAccess, Expected, IgnoredAny, + MapAccess, SeqAccess, Unexpected, Visitor, }; /// Used from generated code to buffer the contents of the Deserializer when @@ -2470,10 +2470,11 @@ mod content { Ok(()) } - fn visit_map(self, _: M) -> Result<(), M::Error> + fn visit_map(self, mut access: M) -> Result<(), M::Error> where M: MapAccess<'de>, { + while let Some(_) = try!(access.next_entry::()) {} Ok(()) } } diff --git a/test_suite/tests/test_annotations.rs b/test_suite/tests/test_annotations.rs index 55455b043..87eda5015 100644 --- a/test_suite/tests/test_annotations.rs +++ b/test_suite/tests/test_annotations.rs @@ -2246,3 +2246,68 @@ fn test_transparent_tuple_struct() { assert_tokens(&Transparent(false, 1, false, PhantomData), &[Token::U32(1)]); } + +#[test] +fn test_internally_tagged_unit_enum_with_unknown_fields() { + #[derive(Deserialize, PartialEq, Debug)] + #[serde(tag = "t")] + enum Data { + A, + } + + let data = Data::A; + + assert_de_tokens( + &data, + &[ + Token::Map { len: None }, + Token::Str("t"), + Token::Str("A"), + Token::Str("b"), + Token::I32(0), + Token::MapEnd, + ], + ); +} + +#[test] +fn test_flattened_internally_tagged_unit_enum_with_unknown_fields() { + #[derive(Deserialize, PartialEq, Debug)] + struct S { + #[serde(flatten)] + x: X, + #[serde(flatten)] + y: Y, + } + + #[derive(Deserialize, PartialEq, Debug)] + #[serde(tag = "typeX")] + enum X { + A, + } + + #[derive(Deserialize, PartialEq, Debug)] + #[serde(tag = "typeY")] + enum Y { + B { c: u32 }, + } + + let s = S { + x: X::A, + y: Y::B { c: 0 }, + }; + + assert_de_tokens( + &s, + &[ + Token::Map { len: None }, + Token::Str("typeX"), + Token::Str("A"), + Token::Str("typeY"), + Token::Str("B"), + Token::Str("c"), + Token::I32(0), + Token::MapEnd, + ], + ); +}