Skip to content

Commit 0daafe4

Browse files
authored
Merge pull request #2330 from dtolnay/remote
Fix generated Into conversion involving generic remote derive with getter
2 parents fabbd2b + 3702191 commit 0daafe4

File tree

2 files changed

+26
-3
lines changed

2 files changed

+26
-3
lines changed

serde_derive/src/de.rs

+6-3
Original file line numberDiff line numberDiff line change
@@ -712,8 +712,9 @@ fn deserialize_seq(
712712

713713
if params.has_getter {
714714
let this_type = &params.this_type;
715+
let (_, ty_generics, _) = params.generics.split_for_impl();
715716
result = quote! {
716-
_serde::__private::Into::<#this_type>::into(#result)
717+
_serde::__private::Into::<#this_type #ty_generics>::into(#result)
717718
};
718719
}
719720

@@ -856,8 +857,9 @@ fn deserialize_newtype_struct(
856857
let mut result = quote!(#type_path(__field0));
857858
if params.has_getter {
858859
let this_type = &params.this_type;
860+
let (_, ty_generics, _) = params.generics.split_for_impl();
859861
result = quote! {
860-
_serde::__private::Into::<#this_type>::into(#result)
862+
_serde::__private::Into::<#this_type #ty_generics>::into(#result)
861863
};
862864
}
863865

@@ -2629,8 +2631,9 @@ fn deserialize_map(
26292631
let mut result = quote!(#struct_path { #(#result),* });
26302632
if params.has_getter {
26312633
let this_type = &params.this_type;
2634+
let (_, ty_generics, _) = params.generics.split_for_impl();
26322635
result = quote! {
2633-
_serde::__private::Into::<#this_type>::into(#result)
2636+
_serde::__private::Into::<#this_type #ty_generics>::into(#result)
26342637
};
26352638
}
26362639

test_suite/tests/test_remote.rs

+20
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,13 @@ mod remote {
7979
pub value: T,
8080
}
8181

82+
impl<T> StructGeneric<T> {
83+
#[allow(dead_code)]
84+
pub fn get_value(&self) -> &T {
85+
&self.value
86+
}
87+
}
88+
8289
pub enum EnumGeneric<T> {
8390
Variant(T),
8491
}
@@ -171,6 +178,13 @@ struct StructPubDef {
171178
b: remote::Unit,
172179
}
173180

181+
#[derive(Serialize, Deserialize)]
182+
#[serde(remote = "remote::StructGeneric")]
183+
struct StructGenericWithGetterDef<T> {
184+
#[serde(getter = "remote::StructGeneric::get_value")]
185+
value: T,
186+
}
187+
174188
#[derive(Serialize, Deserialize)]
175189
#[serde(remote = "remote::StructGeneric<u8>")]
176190
struct StructConcrete {
@@ -206,3 +220,9 @@ impl From<StructPrivDef> for remote::StructPriv {
206220
remote::StructPriv::new(def.a, def.b)
207221
}
208222
}
223+
224+
impl<T> From<StructGenericWithGetterDef<T>> for remote::StructGeneric<T> {
225+
fn from(def: StructGenericWithGetterDef<T>) -> Self {
226+
remote::StructGeneric { value: def.value }
227+
}
228+
}

0 commit comments

Comments
 (0)