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/libproc_macro | |
| 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/libproc_macro')
| -rw-r--r-- | src/libproc_macro/lib.rs | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/src/libproc_macro/lib.rs b/src/libproc_macro/lib.rs index 50e70e3bce7..b9e816baac0 100644 --- a/src/libproc_macro/lib.rs +++ b/src/libproc_macro/lib.rs @@ -95,7 +95,7 @@ impl FromStr for TokenStream { // notify the expansion info that it is unhygienic let mark = Mark::fresh(mark); mark.set_expn_info(expn_info); - let span = call_site.with_ctxt(call_site.ctxt().apply_mark(mark)); + let span = call_site.with_ctxt(SyntaxContext::empty().apply_mark(mark)); let stream = parse::parse_stream_from_source_str(name, src, sess, Some(span)); Ok(__internal::token_stream_wrap(stream)) }) |
