diff --git a/clippy_lints/src/needless_pass_by_value.rs b/clippy_lints/src/needless_pass_by_value.rs index 60509c1aabb0..e67dca5d00d2 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`) 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!(); }