diff --git a/serde_derive/src/de.rs b/serde_derive/src/de.rs index 40a5d105..3cce5f07 100644 --- a/serde_derive/src/de.rs +++ b/serde_derive/src/de.rs @@ -1802,10 +1802,8 @@ fn deserialize_untagged_newtype_variant( } Some(path) => { quote_block! { - let __value: #field_ty = _serde::export::Result::map( - #path(#deserializer), - #this::#variant_ident); - __value + let __value: _serde::export::Result<#field_ty, _> = #path(#deserializer); + _serde::export::Result::map(__value, #this::#variant_ident) } } } diff --git a/test_suite/tests/test_gen.rs b/test_suite/tests/test_gen.rs index 7888f2d8..ffb73210 100644 --- a/test_suite/tests/test_gen.rs +++ b/test_suite/tests/test_gen.rs @@ -643,6 +643,16 @@ fn test_gen() { struct ImpliciltyBorrowedOption<'a> { option: std::option::Option<&'a str>, } + + #[derive(Serialize, Deserialize)] + #[serde(untagged)] + enum UntaggedNewtypeVariantWith { + Newtype( + #[serde(serialize_with = "ser_x")] + #[serde(deserialize_with = "de_x")] + X, + ), + } } //////////////////////////////////////////////////////////////////////////