From 6699b0bc404663064189c3a34d7934475741b3e5 Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Mon, 25 Jan 2021 13:25:53 -0800 Subject: [PATCH 1/2] Add regression test for issue 1969 --- test_suite/tests/test_gen.rs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/test_suite/tests/test_gen.rs b/test_suite/tests/test_gen.rs index 73f7fa50f..002885ead 100644 --- a/test_suite/tests/test_gen.rs +++ b/test_suite/tests/test_gen.rs @@ -7,6 +7,7 @@ #![allow( unknown_lints, mixed_script_confusables, + clippy::ptr_arg, clippy::trivially_copy_pass_by_ref )] @@ -735,6 +736,12 @@ fn test_gen() { #[serde(borrow = "'a")] f: mac!(Cow<'a, str>), } + + #[derive(Serialize)] + struct Struct { + #[serde(serialize_with = "vec_first_element")] + vec: Vec, + } } ////////////////////////////////////////////////////////////////////////// @@ -808,3 +815,11 @@ where pub fn is_zero(n: &u8) -> bool { *n == 0 } + +fn vec_first_element(vec: &Vec, serializer: S) -> StdResult +where + T: Serialize, + S: Serializer, +{ + vec.first().serialize(serializer) +} From 2ba97394fb5e5c32b52ab8d82aed45b85fef0db7 Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Mon, 25 Jan 2021 13:27:15 -0800 Subject: [PATCH 2/2] Substitute Self in output of Serialize derive --- serde_derive/src/lib.rs | 4 ++-- serde_derive/src/ser.rs | 8 ++++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/serde_derive/src/lib.rs b/serde_derive/src/lib.rs index f10baac01..8d1464ec8 100644 --- a/serde_derive/src/lib.rs +++ b/serde_derive/src/lib.rs @@ -79,8 +79,8 @@ mod try; #[proc_macro_derive(Serialize, attributes(serde))] pub fn derive_serialize(input: TokenStream) -> TokenStream { - let input = parse_macro_input!(input as DeriveInput); - ser::expand_derive_serialize(&input) + let mut input = parse_macro_input!(input as DeriveInput); + ser::expand_derive_serialize(&mut input) .unwrap_or_else(to_compile_errors) .into() } diff --git a/serde_derive/src/ser.rs b/serde_derive/src/ser.rs index 91154dc6a..c663c3b02 100644 --- a/serde_derive/src/ser.rs +++ b/serde_derive/src/ser.rs @@ -6,10 +6,14 @@ use bound; use dummy; use fragment::{Fragment, Match, Stmts}; use internals::ast::{Container, Data, Field, Style, Variant}; -use internals::{attr, Ctxt, Derive}; +use internals::{attr, replace_receiver, Ctxt, Derive}; use pretend; -pub fn expand_derive_serialize(input: &syn::DeriveInput) -> Result> { +pub fn expand_derive_serialize( + input: &mut syn::DeriveInput, +) -> Result> { + replace_receiver(input); + let ctxt = Ctxt::new(); let cont = match Container::from_ast(&ctxt, input, Derive::Serialize) { Some(cont) => cont,