Skip to content

Commit 0ec6ea7

Browse files
committed
resolve: Fix access to extern and stdlib prelude from opaque macros
Ok, it's hard to explain what happens, but identifier's hygienic contexts need to be "adjusted" to modules/scopes before they are resolved in them. To be resolved in all kinds on preludes the identifier needs to be adjusted to the root expansion (aka "no expansion"). Previously this was done for the `macro m() { ::my_crate::foo }` case, but forgotten for all other cases.
1 parent f923942 commit 0ec6ea7

File tree

5 files changed

+42
-0
lines changed

5 files changed

+42
-0
lines changed

src/librustc_resolve/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -2247,6 +2247,7 @@ impl<'a> Resolver<'a> {
22472247
}
22482248

22492249
if !module.no_implicit_prelude {
2250+
ident.span.adjust(Mark::root());
22502251
if ns == TypeNS {
22512252
if let Some(binding) = self.extern_prelude_get(ident, !record_used) {
22522253
return Some(LexicalScopeBinding::Item(binding));

src/librustc_resolve/macros.rs

+1
Original file line numberDiff line numberDiff line change
@@ -856,6 +856,7 @@ impl<'a> Resolver<'a> {
856856
match self.hygienic_lexical_parent(module, &mut ident.span) {
857857
Some(parent_module) => WhereToResolve::Module(parent_module),
858858
None => {
859+
ident.span.adjust(Mark::root());
859860
use_prelude = !module.no_implicit_prelude;
860861
match ns {
861862
TypeNS => WhereToResolve::ExternPrelude,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
#![feature(decl_macro)]
2+
3+
pub macro stdlib_macro() {}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// check-pass
2+
// aux-build:stdlib-prelude.rs
3+
4+
#![feature(decl_macro)]
5+
#![feature(prelude_import)]
6+
7+
extern crate stdlib_prelude;
8+
9+
#[prelude_import]
10+
use stdlib_prelude::*;
11+
12+
macro mac() {
13+
mod m {
14+
use std::mem; // OK (extern prelude)
15+
stdlib_macro!(); // OK (stdlib prelude)
16+
}
17+
}
18+
19+
mac!();
20+
21+
fn main() {}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// check-pass
2+
3+
#![feature(decl_macro)]
4+
5+
macro mac() {
6+
mod m {
7+
fn f() {
8+
std::mem::drop(0); // OK (extern prelude)
9+
drop(0); // OK (stdlib prelude)
10+
}
11+
}
12+
}
13+
14+
mac!();
15+
16+
fn main() {}

0 commit comments

Comments
 (0)