Skip to content

Commit

Permalink
Merge pull request #1805 from dtolnay/skip
Browse files Browse the repository at this point in the history
Fix indexing bug when `skip` and `other` are combined
  • Loading branch information
dtolnay committed May 8, 2020
2 parents 099fa25 + 63809e6 commit 36a6687
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 3 deletions.
9 changes: 6 additions & 3 deletions serde_derive/src/de.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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(),
Expand All @@ -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);
Expand Down
10 changes: 10 additions & 0 deletions test_suite/tests/test_gen.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
}
}

//////////////////////////////////////////////////////////////////////////
Expand Down

0 comments on commit 36a6687

Please sign in to comment.