about summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2018-01-12 10:00:09 +0000
committerbors <bors@rust-lang.org>2018-01-12 10:00:09 +0000
commit0b90e4e8cd068910f604f3e1fb5d03cc01f1658f (patch)
tree272837310543b7e12169bc8d74974400634dfd57 /src/libstd
parent73ac5d6a80f26c692f1e084b72d69637d7de2c8c (diff)
parentb766fa887dc0e4b923a38751fe4d570e35a75710 (diff)
downloadrust-0b90e4e8cd068910f604f3e1fb5d03cc01f1658f.tar.gz
rust-0b90e4e8cd068910f604f3e1fb5d03cc01f1658f.zip
Auto merge of #46551 - jseyfried:improve_legacy_modern_macro_interaction, r=nrc
macros: improve 1.0/2.0 interaction

This PR supports using unhygienic macros from hygienic macros without breaking the latter's hygiene.
```rust
// crate A:
#[macro_export]
macro_rules! m1 { () => {
    f(); // unhygienic: this macro needs `f` in its environment
    fn g() {} // (1) unhygienic: `g` is usable outside the macro definition
} }

// crate B:
#![feature(decl_macro)]
extern crate A;
use A::m1;

macro m2() {
    fn f() {} // (2)
    m1!(); // After this PR, `f()` in the expansion resolves to (2), not (3)
    g(); // After this PR, this resolves to `fn g() {}` from the above expansion.
         // Today, it is a resolution error.
}

fn test() {
    fn f() {} // (3)
    m2!(); // Today, `m2!()` can see (3) even though it should be hygienic.
    fn g() {} // Today, this conflicts with `fn g() {}` from the expansion, even though it should be hygienic.
}
```

Once this PR lands, you can make an existing unhygienic macro hygienic by wrapping it in a hygienic macro. There is an [example](https://github.com/rust-lang/rust/pull/46551/commits/b766fa887dc0e4b923a38751fe4d570e35a75710) of this in the tests.

r? @nrc
Diffstat (limited to 'src/libstd')
0 files changed, 0 insertions, 0 deletions