diff --git a/serde_derive/src/de.rs b/serde_derive/src/de.rs index 20ccb696..5d403613 100644 --- a/serde_derive/src/de.rs +++ b/serde_derive/src/de.rs @@ -1386,26 +1386,21 @@ fn deserialize_identifier( "field identifier" }; - let visit_index = if is_variant { - let variant_indices = 0u32..; - let fallthrough_msg = format!("variant index 0 <= i < {}", fields.len()); - let visit_index = quote! { - fn visit_u32<__E>(self, __value: u32) -> _serde::export::Result - where __E: _serde::de::Error - { - match __value { - #( - #variant_indices => _serde::export::Ok(#constructors), - )* - _ => _serde::export::Err(_serde::de::Error::invalid_value( - _serde::de::Unexpected::Unsigned(__value as u64), - &#fallthrough_msg)) - } + let variant_indices = 0u32..; + let fallthrough_msg = format!("variant index 0 <= i < {}", fields.len()); + let visit_index = quote! { + fn visit_u32<__E>(self, __value: u32) -> _serde::export::Result + where __E: _serde::de::Error + { + match __value { + #( + #variant_indices => _serde::export::Ok(#constructors), + )* + _ => _serde::export::Err(_serde::de::Error::invalid_value( + _serde::de::Unexpected::Unsigned(__value as u64), + &#fallthrough_msg)) } - }; - Some(visit_index) - } else { - None + } }; let bytes_to_str = if fallthrough.is_some() { diff --git a/test_suite/tests/test_de.rs b/test_suite/tests/test_de.rs index d1bddfaf..c0a889af 100644 --- a/test_suite/tests/test_de.rs +++ b/test_suite/tests/test_de.rs @@ -605,6 +605,17 @@ declare_tests! { Token::StructEnd, ], } + test_struct_integer_keys { + Struct { a: 1, b: 2, c: 0 } => &[ + Token::Struct { name: "Struct", len: 2 }, + Token::U32(0), + Token::I32(1), + + Token::U32(1), + Token::I32(2), + Token::StructEnd, + ], + } test_enum_unit { Enum::Unit => &[ Token::UnitVariant { name: "Enum", variant: "Unit" },