#![crate_type = "lib"] extern crate my_crate; pub fn g() {} // (a) #[macro_export] macro_rules! unhygienic_macro { () => { // (1) unhygienic: depends on `my_crate` in the crate root at the invocation site. ::my_crate::f(); // (2) unhygienic: defines `f` at the invocation site (in addition to the above point). use my_crate::f; f(); g(); // (3) unhygienic: `g` needs to be in scope at use site. $crate::g(); // (4) hygienic: this always resolves to (a) } } #[allow(unused)] fn test_unhygienic() { unhygienic_macro!(); f(); // `f` was defined at the use site }