From 7328b3481083167d3394111327ffd5fad405f7b2 Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Sun, 27 Nov 2022 17:10:16 -0800 Subject: [PATCH 1/2] Add test of generic remote derive with getter Currently fails to compile. error[E0107]: missing generics for struct `StructGeneric` --> test_suite/tests/test_remote.rs:181:18 | 181 | #[serde(remote = "remote::StructGeneric")] | ^^^^^^^^^^^^^^^^^^^^^^^ expected 1 generic argument | note: struct defined here, with 1 generic parameter: `T` --> test_suite/tests/test_remote.rs:78:16 | 78 | pub struct StructGeneric { | ^^^^^^^^^^^^^ - help: add missing generic argument | 181 | #[serde(remote = StructGeneric)] | ~~~~~~~~~~~~~~~~ --- test_suite/tests/test_remote.rs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/test_suite/tests/test_remote.rs b/test_suite/tests/test_remote.rs index c6d276e10..a334f7ac2 100644 --- a/test_suite/tests/test_remote.rs +++ b/test_suite/tests/test_remote.rs @@ -79,6 +79,12 @@ mod remote { pub value: T, } + impl StructGeneric { + pub fn get_value(&self) -> &T { + &self.value + } + } + pub enum EnumGeneric { Variant(T), } @@ -171,6 +177,13 @@ struct StructPubDef { b: remote::Unit, } +#[derive(Serialize, Deserialize)] +#[serde(remote = "remote::StructGeneric")] +struct StructGenericWithGetterDef { + #[serde(getter = "remote::StructGeneric::get_value")] + value: T, +} + #[derive(Serialize, Deserialize)] #[serde(remote = "remote::StructGeneric")] struct StructConcrete { @@ -206,3 +219,9 @@ impl From for remote::StructPriv { remote::StructPriv::new(def.a, def.b) } } + +impl From> for remote::StructGeneric { + fn from(def: StructGenericWithGetterDef) -> Self { + remote::StructGeneric { value: def.value } + } +} From 37021910c9425eb5b117f5df4b5aadcd135cee77 Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Sun, 27 Nov 2022 17:16:00 -0800 Subject: [PATCH 2/2] Fix Into conversion involving generic remote derive with getter --- serde_derive/src/de.rs | 9 ++++++--- test_suite/tests/test_remote.rs | 1 + 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/serde_derive/src/de.rs b/serde_derive/src/de.rs index ef7a2dee2..a703adaf7 100644 --- a/serde_derive/src/de.rs +++ b/serde_derive/src/de.rs @@ -712,8 +712,9 @@ fn deserialize_seq( if params.has_getter { let this_type = ¶ms.this_type; + let (_, ty_generics, _) = params.generics.split_for_impl(); result = quote! { - _serde::__private::Into::<#this_type>::into(#result) + _serde::__private::Into::<#this_type #ty_generics>::into(#result) }; } @@ -856,8 +857,9 @@ fn deserialize_newtype_struct( let mut result = quote!(#type_path(__field0)); if params.has_getter { let this_type = ¶ms.this_type; + let (_, ty_generics, _) = params.generics.split_for_impl(); result = quote! { - _serde::__private::Into::<#this_type>::into(#result) + _serde::__private::Into::<#this_type #ty_generics>::into(#result) }; } @@ -2629,8 +2631,9 @@ fn deserialize_map( let mut result = quote!(#struct_path { #(#result),* }); if params.has_getter { let this_type = ¶ms.this_type; + let (_, ty_generics, _) = params.generics.split_for_impl(); result = quote! { - _serde::__private::Into::<#this_type>::into(#result) + _serde::__private::Into::<#this_type #ty_generics>::into(#result) }; } diff --git a/test_suite/tests/test_remote.rs b/test_suite/tests/test_remote.rs index a334f7ac2..d997f0f01 100644 --- a/test_suite/tests/test_remote.rs +++ b/test_suite/tests/test_remote.rs @@ -80,6 +80,7 @@ mod remote { } impl StructGeneric { + #[allow(dead_code)] pub fn get_value(&self) -> &T { &self.value }