From f44402e22462797de528d5cb43e25c4e3aee7121 Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Fri, 8 May 2020 15:38:44 -0700 Subject: [PATCH 1/2] Add regression test for issue 1804 --- test_suite/tests/test_gen.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/test_suite/tests/test_gen.rs b/test_suite/tests/test_gen.rs index 92bb0ae1..c429500c 100644 --- a/test_suite/tests/test_gen.rs +++ b/test_suite/tests/test_gen.rs @@ -691,6 +691,16 @@ fn test_gen() { #[serde(flatten, skip_deserializing)] flat: T, } + + // https://github.com/serde-rs/serde/issues/1804 + #[derive(Serialize, Deserialize)] + enum Message { + #[serde(skip)] + #[allow(dead_code)] + String(String), + #[serde(other)] + Unknown, + } } ////////////////////////////////////////////////////////////////////////// From 63809e69c782f920bd6f53127a8a6ce7281f38de Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Fri, 8 May 2020 15:39:07 -0700 Subject: [PATCH 2/2] Fix indexing bug when `skip` and `other` are combined --- serde_derive/src/de.rs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/serde_derive/src/de.rs b/serde_derive/src/de.rs index 5ccd38a8..74df11df 100644 --- a/serde_derive/src/de.rs +++ b/serde_derive/src/de.rs @@ -1153,10 +1153,13 @@ fn prepare_enum_variant_enum( variants: &[Variant], cattrs: &attr::Container, ) -> (TokenStream, Stmts) { - let variant_names_idents: Vec<_> = variants + let mut deserialized_variants = variants .iter() .enumerate() - .filter(|&(_, variant)| !variant.attrs.skip_deserializing()) + .filter(|&(_, variant)| !variant.attrs.skip_deserializing()); + + let variant_names_idents: Vec<_> = deserialized_variants + .clone() .map(|(i, variant)| { ( variant.attrs.name().deserialize_name(), @@ -1166,7 +1169,7 @@ fn prepare_enum_variant_enum( }) .collect(); - let other_idx = variants.iter().position(|variant| variant.attrs.other()); + let other_idx = deserialized_variants.position(|(_, variant)| variant.attrs.other()); let variants_stmt = { let variant_names = variant_names_idents.iter().map(|(name, _, _)| name);