diff options
| author | bors <bors@rust-lang.org> | 2018-10-03 18:12:22 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2018-10-03 18:12:22 +0000 |
| commit | 5597ee8a6483238421750fce4eb7031b12852428 (patch) | |
| tree | d2fcfc72a9247c36e11589d9f34f6b9b41665a2c /src/rustllvm/RustWrapper.cpp | |
| parent | 6ddab3e078bc25bd101d6885427b8a1032f8f60c (diff) | |
| parent | 078fc52cbc437b5adab20953b37715f8b08d83c2 (diff) | |
| download | rust-5597ee8a6483238421750fce4eb7031b12852428.tar.gz rust-5597ee8a6483238421750fce4eb7031b12852428.zip | |
Auto merge of #54605 - petrochenkov:mambig, r=alexcrichton
resolve: Disambiguate a subset of conflicts "macro_rules" vs "macro name in module"
Currently if macro name may refer to both a `macro_rules` macro definition and a macro defined/imported into module we conservatively report an ambiguity error.
Unfortunately, these errors became a source of regressions when macro modularization was enabled - see issue https://github.com/rust-lang/rust/issues/54472.
This PR disambiguates such conflicts in favor of `macro_rules` if both the `macro_rules` item and in-module macro name are defined in the same normal (named) module and `macro_rules` is closer in scope to the point of use (see the tests for examples).
This is a subset of more general approach described in https://github.com/rust-lang/rust/issues/54472#issuecomment-424666659.
The subset is enough to fix all the regressions from https://github.com/rust-lang/rust/issues/54472, but it can be extended to apply to all "macro_rules" vs "macro name in module" conflicts in the future.
To give an analogy, this is equivalent to scoping rules for `let` variables and items defined in blocks (`macro_rules` behaves like "`let` at module level" in general).
```rust
{ // beginning of the block
use xxx::m; // (1)
// Starting from the beginning of the block and until here m!() refers to (1)
macro_rules! m { ... } // (2)
// Starting from here and until the end of the block m!() refers to (2)
} // end of the block
```
More complex examples with `use` and `macro_rules` from different modules still report ambiguity errors, even if equivalent examples with `let` are legal.
Fixes https://github.com/rust-lang/rust/issues/54472 (stable-to-beta regression)
Diffstat (limited to 'src/rustllvm/RustWrapper.cpp')
0 files changed, 0 insertions, 0 deletions
