| // gate-test-custom_inner_attributes |
| //@ compile-flags: -Z span-debug --error-format human |
| //@ error-pattern:expected non-macro inner attribute |
| //@ aux-build:test-macros.rs |
| //@ edition:2018 |
| |
| #![feature(custom_inner_attributes)] |
| #![feature(proc_macro_hygiene)] |
| #![feature(stmt_expr_attributes)] |
| #![feature(rustc_attrs)] |
| |
| #![no_std] // Don't load unnecessary hygiene information from std |
| extern crate std; |
| |
| #[macro_use] |
| extern crate test_macros; |
| |
| #[print_target_and_args(first)] |
| #[print_target_and_args(second)] |
| fn foo() { |
| #![print_target_and_args(third)] |
| #![print_target_and_args(fourth)] |
| } |
| |
| #[print_target_and_args(mod_first)] |
| #[print_target_and_args(mod_second)] |
| mod inline_mod { |
| #![print_target_and_args(mod_third)] |
| #![print_target_and_args(mod_fourth)] |
| } |
| |
| struct MyStruct { |
| field: bool |
| } |
| |
| #[derive(Print)] |
| struct MyDerivePrint { |
| field: [u8; { |
| match true { |
| _ => { |
| #![cfg_attr(not(FALSE), rustc_dummy(third))] |
| true |
| } |
| }; |
| 0 |
| }] |
| } |
| |
| fn bar() { |
| #[print_target_and_args(tuple_attrs)] ( |
| 3, 4, { |
| #![cfg_attr(not(FALSE), rustc_dummy(innermost))] |
| 5 |
| } |
| ); |
| |
| #[print_target_and_args(tuple_attrs)] ( |
| 3, 4, { |
| #![cfg_attr(not(FALSE), rustc_dummy(innermost))] |
| 5 |
| } |
| ); |
| |
| for _ in &[true] { |
| #![print_attr] |
| } |
| |
| let _ = { |
| #![print_attr] |
| }; |
| |
| let _ = async { |
| #![print_attr] |
| }; |
| |
| { |
| #![print_attr] |
| }; |
| } |
| |
| |
| extern { |
| fn weird_extern() { |
| #![print_target_and_args_consume(tenth)] |
| } |
| } |
| |
| fn main() {} |