//@ edition:2018 //@ aux-build:test-macros.rs //@ aux-build:derive-helper-shadowing.rs #[macro_use] extern crate test_macros; #[macro_use] extern crate derive_helper_shadowing; use test_macros::empty_attr as empty_helper; macro_rules! gen_helper_use { () => { #[empty_helper] //~ ERROR cannot find attribute `empty_helper` in this scope struct W; } } #[empty_helper] //~ ERROR `empty_helper` is ambiguous //~| WARN derive helper attribute is used before it is introduced //~| WARN this was previously accepted #[derive(Empty)] struct S { #[empty_helper] // OK, no ambiguity, derive helpers have highest priority field: [u8; { use empty_helper; // OK, no ambiguity, derive helpers have highest priority #[empty_helper] // OK, no ambiguity, derive helpers have highest priority struct U; mod inner { // OK, no ambiguity, the non-helper attribute is not in scope here, only the helper. #[empty_helper] struct V; gen_helper_use!(); #[derive(GenHelperUse)] //~ ERROR cannot find attribute `empty_helper` in this scope struct Owo; use empty_helper as renamed; #[renamed] //~ ERROR cannot use a derive helper attribute through an import struct Wow; } 0 }] } // OK, no ambiguity, only the non-helper attribute is in scope. #[empty_helper] struct Z; fn main() { let s = S { field: [] }; }