2019-07-14 10:34:13 +00:00
|
|
|
// check-pass
|
2017-12-07 04:30:40 +00:00
|
|
|
// ignore-pretty pretty-printing is unhygienic
|
|
|
|
|
|
|
|
// aux-build:my_crate.rs
|
|
|
|
// aux-build:unhygienic_example.rs
|
|
|
|
|
2018-04-28 04:32:00 +00:00
|
|
|
#![feature(decl_macro)]
|
2017-12-07 04:30:40 +00:00
|
|
|
|
|
|
|
extern crate unhygienic_example;
|
|
|
|
extern crate my_crate; // (b)
|
|
|
|
|
|
|
|
// Hygienic version of `unhygienic_macro`.
|
|
|
|
pub macro hygienic_macro() {
|
|
|
|
fn g() {} // (c)
|
|
|
|
::unhygienic_example::unhygienic_macro!();
|
|
|
|
// ^ Even though we invoke an unhygienic macro, `hygienic_macro` remains hygienic.
|
|
|
|
// In the above expansion:
|
|
|
|
// (1) `my_crate` always resolves to (b) regardless of invocation site.
|
|
|
|
// (2) The defined function `f` is only usable inside this macro definition.
|
|
|
|
// (3) `g` always resolves to (c) regardless of invocation site.
|
|
|
|
// (4) `$crate::g` remains hygienic and continues to resolve to (a).
|
|
|
|
|
|
|
|
f();
|
|
|
|
}
|
|
|
|
|
|
|
|
#[allow(unused)]
|
|
|
|
fn test_hygienic_macro() {
|
|
|
|
hygienic_macro!();
|
|
|
|
|
|
|
|
fn f() {} // (d) no conflict
|
|
|
|
f(); // resolves to (d)
|
|
|
|
}
|
|
|
|
|
|
|
|
fn main() {}
|