diff options
| author | bors <bors@rust-lang.org> | 2018-01-12 10:00:09 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2018-01-12 10:00:09 +0000 |
| commit | 0b90e4e8cd068910f604f3e1fb5d03cc01f1658f (patch) | |
| tree | 272837310543b7e12169bc8d74974400634dfd57 /src/libsyntax | |
| parent | 73ac5d6a80f26c692f1e084b72d69637d7de2c8c (diff) | |
| parent | b766fa887dc0e4b923a38751fe4d570e35a75710 (diff) | |
| download | rust-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/libsyntax')
0 files changed, 0 insertions, 0 deletions
