serde_derive: fix ser/de inconsistency with skipped enum variants #2952
+6
−3
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
When serde_derive generates Serialize/Deserialize implementations for an enum with #[serde(skipped)] variants, it leaves a gap in the assigned
variant_indexes for the variants (i.e., includes skipped variants in the count) in the Serialize impl, but excludes skipped variants in the count in the Deserialize impl. This means that non-self-describing data formats that rely on variant indices instead of variant names cannot correctly serialize+deserialize enums with skipped variants.This changes the generated Serialize impl to match the deserialize impl by excluding skipped variants from the count. This is also consistent with how #[serde(skip)] affects field indices in structs.
Fixes #2614
This is not covered by existing tests because the test suite only covers variant names, not variant indices (serde-deprecated/test#21). As such, I'm not sure the best way to add test coverage for this particular case.