| #![feature(macro_attr)] | |
| macro_rules! local_attr { | |
| attr() { $($body:tt)* } => { | |
| compile_error!(concat!("local_attr: ", stringify!($($body)*))); | |
| }; | |
| //~^^ ERROR: local_attr | |
| } | |
| //~v NOTE: `fn_only` exists, but has no `attr` rules | |
| macro_rules! fn_only { | |
| {} => {} | |
| } | |
| //~v NOTE: `attr_only` exists, but has no rules for function-like invocation | |
| macro_rules! attr_only { | |
| attr() {} => {} | |
| } | |
| fn main() { | |
| //~v NOTE: in this expansion of #[local_attr] | |
| #[local_attr] | |
| struct S; | |
| //~vv ERROR: cannot find macro `local_attr` in this scope | |
| //~| NOTE: `local_attr` is in scope, but it is an attribute | |
| local_attr!(arg); | |
| //~v ERROR: cannot find attribute `fn_only` in this scope | |
| #[fn_only] | |
| struct S; | |
| attr_only!(); //~ ERROR: cannot find macro `attr_only` in this scope | |
| } | |
| //~vv ERROR: cannot find attribute `forward_referenced_attr` in this scope | |
| //~| NOTE: consider moving the definition of `forward_referenced_attr` before this call | |
| #[forward_referenced_attr] | |
| struct S; | |
| //~v NOTE: a macro with the same name exists, but it appears later | |
| macro_rules! forward_referenced_attr { | |
| attr() {} => {} | |
| } | |
| //~vv ERROR: cannot find attribute `cyclic_attr` in this scope | |
| //~| NOTE: consider moving the definition of `cyclic_attr` before this call | |
| #[cyclic_attr] | |
| //~v NOTE: a macro with the same name exists, but it appears later | |
| macro_rules! cyclic_attr { | |
| attr() {} => {} | |
| } | |
| macro_rules! attr_with_safety { | |
| unsafe attr() { struct RequiresUnsafe; } => {}; | |
| attr() { struct SafeInvocation; } => {}; | |
| } | |
| #[attr_with_safety] | |
| struct SafeInvocation; | |
| //~v ERROR: unnecessary `unsafe` on safe attribute invocation | |
| #[unsafe(attr_with_safety)] | |
| struct SafeInvocation; | |
| //~v ERROR: unsafe attribute invocation requires `unsafe` | |
| #[attr_with_safety] | |
| struct RequiresUnsafe; | |
| #[unsafe(attr_with_safety)] | |
| struct RequiresUnsafe; |