From b6c282a2b7666ab2cdf3f0ee3ae96f593283f8f3 Mon Sep 17 00:00:00 2001 From: Alexander Jackson Date: Thu, 5 Jan 2023 13:50:02 +0300 Subject: [PATCH] Fix warnings for cloning references in generated code (#1676) --- axum-macros/src/from_ref.rs | 8 ++++++-- axum-macros/tests/from_ref/pass/reference-types.rs | 10 ++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 axum-macros/tests/from_ref/pass/reference-types.rs diff --git a/axum-macros/src/from_ref.rs b/axum-macros/src/from_ref.rs index 72b9d44042..89d3bac0be 100644 --- a/axum-macros/src/from_ref.rs +++ b/axum-macros/src/from_ref.rs @@ -3,7 +3,7 @@ use quote::quote_spanned; use syn::{ parse::{Parse, ParseStream}, spanned::Spanned, - Field, ItemStruct, Token, + Field, ItemStruct, Token, Type, }; use crate::attr_parsing::{combine_unary_attribute, parse_attrs, Combine}; @@ -30,7 +30,11 @@ fn expand_field(state: &Ident, idx: usize, field: &Field) -> TokenStream { let span = field.ty.span(); let body = if let Some(field_ident) = &field.ident { - quote_spanned! {span=> state.#field_ident.clone() } + if matches!(field_ty, Type::Reference(_)) { + quote_spanned! {span=> state.#field_ident } + } else { + quote_spanned! {span=> state.#field_ident.clone() } + } } else { let idx = syn::Index { index: idx as _, diff --git a/axum-macros/tests/from_ref/pass/reference-types.rs b/axum-macros/tests/from_ref/pass/reference-types.rs new file mode 100644 index 0000000000..d5d1d8377d --- /dev/null +++ b/axum-macros/tests/from_ref/pass/reference-types.rs @@ -0,0 +1,10 @@ +#![deny(noop_method_call)] + +use axum_macros::FromRef; + +#[derive(FromRef)] +struct State { + inner: &'static str, +} + +fn main() {}