//@ run-pass //@ check-run-results #![feature(macro_attr)] #![warn(unused)] #[macro_export] macro_rules! exported_attr { attr($($args:tt)*) { $($body:tt)* } => { println!( "exported_attr: args={:?}, body={:?}", stringify!($($args)*), stringify!($($body)*), ); }; { $($args:tt)* } => { println!("exported_attr!({:?})", stringify!($($args)*)); }; attr() {} => { unused_rule(); }; attr() {} => { compile_error!(); }; {} => { unused_rule(); }; {} => { compile_error!(); }; } macro_rules! local_attr { attr($($args:tt)*) { $($body:tt)* } => { println!( "local_attr: args={:?}, body={:?}", stringify!($($args)*), stringify!($($body)*), ); }; { $($args:tt)* } => { println!("local_attr!({:?})", stringify!($($args)*)); }; attr() {} => { //~ WARN: never used unused_rule(); }; attr() {} => { compile_error!(); }; {} => { //~ WARN: never used unused_rule(); }; {} => { compile_error!(); }; } fn main() { #[crate::exported_attr] struct S; #[::exported_attr(arguments, key = "value")] fn func(_arg: u32) {} #[self::exported_attr(1)] #[self::exported_attr(2)] struct Twice; crate::exported_attr!(); crate::exported_attr!(invoked, arguments); #[exported_attr] struct S; #[exported_attr(arguments, key = "value")] fn func(_arg: u32) {} #[exported_attr(1)] #[exported_attr(2)] struct Twice; exported_attr!(); exported_attr!(invoked, arguments); #[local_attr] struct S; #[local_attr(arguments, key = "value")] fn func(_arg: u32) {} #[local_attr(1)] #[local_attr(2)] struct Twice; local_attr!(); local_attr!(invoked, arguments); }