From b4ea47d23e88b6bd9859b10daf3f482290379a90 Mon Sep 17 00:00:00 2001 From: sinkuu Date: Wed, 18 Oct 2017 07:29:47 +0900 Subject: [PATCH 1/2] Detect proc-macro in needless_pass_by_value Fixes #1876 --- clippy_lints/src/needless_pass_by_value.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/clippy_lints/src/needless_pass_by_value.rs b/clippy_lints/src/needless_pass_by_value.rs index 3c1f6ef2c4bc..bc54d4ebe5fb 100644 --- a/clippy_lints/src/needless_pass_by_value.rs +++ b/clippy_lints/src/needless_pass_by_value.rs @@ -121,6 +121,11 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for NeedlessPassByValue { .zip(&body.arguments) .enumerate() { + // All spans generated from a proc-macro invocation are the same... + if span == input.span { + return; + } + // * Exclude a type that is specifically bounded by `Borrow`. // * Exclude a type whose reference also fulfills its bound. // (e.g. `std::convert::AsRef`, `serde::Serialize`) From 9221bd9c97047d9eac21867f5a11651080e2b88f Mon Sep 17 00:00:00 2001 From: sinkuu Date: Wed, 18 Oct 2017 14:06:38 +0900 Subject: [PATCH 2/2] Add test --- mini-macro/src/lib.rs | 28 +++++++++++++++++++++++----- tests/run-pass/procedural_macro.rs | 1 + 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/mini-macro/src/lib.rs b/mini-macro/src/lib.rs index fda167b69c70..67337afd3e70 100644 --- a/mini-macro/src/lib.rs +++ b/mini-macro/src/lib.rs @@ -1,13 +1,15 @@ -#![feature(plugin_registrar, rustc_private)] +#![feature(plugin_registrar, rustc_private, quote)] extern crate rustc_plugin; extern crate syntax; -use syntax::codemap::Span; -use syntax::tokenstream::TokenTree; -use syntax::ext::base::{ExtCtxt, MacEager, MacResult}; -use syntax::ext::build::AstBuilder; // trait for expr_usize use rustc_plugin::Registry; +use syntax::ast::MetaItem; +use syntax::codemap::Span; +use syntax::ext::base::{Annotatable, ExtCtxt, MacEager, MacResult, SyntaxExtension}; +use syntax::ext::build::AstBuilder; // trait for expr_usize +use syntax::symbol::Symbol; +use syntax::tokenstream::TokenTree; fn expand_macro(cx: &mut ExtCtxt, sp: Span, _: &[TokenTree]) -> Box { let e = cx.expr_usize(sp, 42); @@ -15,7 +17,23 @@ fn expand_macro(cx: &mut ExtCtxt, sp: Span, _: &[TokenTree]) -> Box Vec { + vec![ + Annotatable::Item( + quote_item!( + cx, + #[allow(unused)] fn needless_take_by_value(s: String) { println!("{}", s.len()); } + ).unwrap() + ), + annotated, + ] +} + #[plugin_registrar] pub fn plugin_registrar(reg: &mut Registry) { reg.register_macro("mini_macro", expand_macro); + reg.register_syntax_extension( + Symbol::intern("mini_macro_attr"), + SyntaxExtension::MultiModifier(Box::new(expand_attr_macro)), + ); } diff --git a/tests/run-pass/procedural_macro.rs b/tests/run-pass/procedural_macro.rs index b185f6dc4277..f52c778a49dc 100644 --- a/tests/run-pass/procedural_macro.rs +++ b/tests/run-pass/procedural_macro.rs @@ -2,6 +2,7 @@ #![plugin(clippy_mini_macro_test)] #[deny(warnings)] +#[mini_macro_attr] fn main() { let _ = mini_macro!(); }