From 63809e69c782f920bd6f53127a8a6ce7281f38de Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Fri, 8 May 2020 15:39:07 -0700 Subject: [PATCH] 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);