From a712271df6418edcc6790fe714af83cfc6f930fb Mon Sep 17 00:00:00 2001 From: sinkuu Date: Mon, 13 Mar 2017 07:30:18 +0900 Subject: [PATCH] Filter out proc_macro_derive functions (fixes #1615) --- clippy_lints/src/needless_pass_by_value.rs | 15 +++++++++++++-- tests/ui/needless_pass_by_value_proc_macro.rs | 11 +++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 tests/ui/needless_pass_by_value_proc_macro.rs diff --git a/clippy_lints/src/needless_pass_by_value.rs b/clippy_lints/src/needless_pass_by_value.rs index d7e7a0bdb..87b2fe02b 100644 --- a/clippy_lints/src/needless_pass_by_value.rs +++ b/clippy_lints/src/needless_pass_by_value.rs @@ -55,8 +55,19 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for NeedlessPassByValue { return; } - if !matches!(kind, FnKind::ItemFn(..)) { - return; + match kind { + FnKind::ItemFn(.., attrs) => { + for a in attrs { + if_let_chain!{[ + a.meta_item_list().is_some(), + let Some(name) = a.name(), + &*name.as_str() == "proc_macro_derive", + ], { + return; + }} + } + }, + _ => return, } // Allows these to be passed by value. diff --git a/tests/ui/needless_pass_by_value_proc_macro.rs b/tests/ui/needless_pass_by_value_proc_macro.rs new file mode 100644 index 000000000..8322cc40e --- /dev/null +++ b/tests/ui/needless_pass_by_value_proc_macro.rs @@ -0,0 +1,11 @@ +#![feature(plugin)] +#![plugin(clippy)] +#![crate_type = "proc-macro"] +#![deny(needless_pass_by_value)] + +extern crate proc_macro; + +use proc_macro::TokenStream; + +#[proc_macro_derive(Foo)] +pub fn foo(_input: TokenStream) -> TokenStream { unimplemented!() }