From 09993a904a7d2346955899feaa8b43668a3fb667 Mon Sep 17 00:00:00 2001 From: "Adam H. Leventhal" Date: Wed, 6 Sep 2023 15:25:05 -0700 Subject: [PATCH] Fix for "cannot infer type" from Deserialize derive macro with simple variants and untagged variants --- serde_derive/src/de.rs | 10 +++++++++- test_suite/tests/test_annotations.rs | 5 +++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/serde_derive/src/de.rs b/serde_derive/src/de.rs index ee8a2376..4c39b7ca 100644 --- a/serde_derive/src/de.rs +++ b/serde_derive/src/de.rs @@ -1737,7 +1737,6 @@ fn deserialize_untagged_enum_after( quote!(__deserializer), )) }); - let attempts = first_attempt.into_iter().chain(attempts); // TODO this message could be better by saving the errors from the failed // attempts. The heuristic used by TOML was to count the number of fields // processed before an error, and use the error that happened after the @@ -1750,10 +1749,19 @@ fn deserialize_untagged_enum_after( ); let fallthrough_msg = cattrs.expecting().unwrap_or(&fallthrough_msg); + // This may be infallible so we need to provide the error type. + let first_attempt = first_attempt.map(|expr| { + quote! { + if let _serde::__private::Result::<_, __D::Error>::Ok(__ok) = #expr { + return _serde::__private::Ok(__ok); + } + } + }); quote_block! { let __content = <_serde::__private::de::Content as _serde::Deserialize>::deserialize(__deserializer)?; let __deserializer = _serde::__private::de::ContentRefDeserializer::<__D::Error>::new(&__content); + #first_attempt #( if let _serde::__private::Ok(__ok) = #attempts { return _serde::__private::Ok(__ok); diff --git a/test_suite/tests/test_annotations.rs b/test_suite/tests/test_annotations.rs index f4801002..eeb3ec0d 100644 --- a/test_suite/tests/test_annotations.rs +++ b/test_suite/tests/test_annotations.rs @@ -2383,7 +2383,7 @@ fn test_partially_untagged_enum_desugared() { #[test] fn test_partially_untagged_simple_enum() { #[derive(Serialize, Deserialize, PartialEq, Debug)] - #[serde(tag = "tag")] + #[serde(tag = "t")] enum Data { A, #[serde(untagged)] @@ -2391,7 +2391,8 @@ fn test_partially_untagged_simple_enum() { } let data = Data::A; - assert_tokens( + + assert_de_tokens( &data, &[ Token::Map { len: None },