diff --git a/serde/src/private/de.rs b/serde/src/private/de.rs index 8fb40ff1..51c7035a 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 55455b04..b3bd7a79 100644 --- a/test_suite/tests/test_annotations.rs +++ b/test_suite/tests/test_annotations.rs @@ -2246,3 +2246,26 @@ 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, + ], + ); +}