Skip to content

Commit ba9916f

Browse files
committed
record seen macro def during late resolve
1 parent 170b64f commit ba9916f

File tree

3 files changed

+30
-12
lines changed

3 files changed

+30
-12
lines changed

compiler/rustc_resolve/src/ident.rs

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,8 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
287287
ribs: &[Rib<'ra>],
288288
ignore_binding: Option<NameBinding<'ra>>,
289289
) -> ResolveIdentInBlockRes<'ra> {
290+
let mut original_ident = *ident;
291+
290292
fn resolve_ident_in_forward_macro_of_block<'ra>(
291293
r: &mut Resolver<'ra, '_>,
292294
expansion: &mut Option<NodeId>, // macro_def_id
@@ -410,20 +412,28 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
410412
return ResolveIdentInBlockRes::DefinedLater { def_site };
411413
}
412414

413-
if let Some(module) = block_module
414-
&& let Ok(binding) = self.cm().resolve_ident_in_module_unadjusted(
415+
if let Some(module) = block_module {
416+
if let Some(seen_macro_def_list) = self.seen_macro_def_in_block.get(&resolving_block) {
417+
for m in seen_macro_def_list.iter().rev() {
418+
if self.macro_def(original_ident.span.ctxt()) == *m {
419+
original_ident.span.remove_mark();
420+
}
421+
}
422+
}
423+
424+
if let Ok(binding) = self.cm().resolve_ident_in_module_unadjusted(
415425
ModuleOrUniformRoot::Module(module),
416-
*ident,
426+
original_ident,
417427
ns,
418428
parent_scope,
419429
Shadowing::Unrestricted,
420430
finalize.map(|finalize| Finalize { used: Used::Scope, ..finalize }),
421431
ignore_binding,
422432
None,
423-
)
424-
{
425-
// The ident resolves to an item in a block.
426-
return ResolveIdentInBlockRes::Item(binding);
433+
) {
434+
// The ident resolves to an item in a block.
435+
return ResolveIdentInBlockRes::Item(binding);
436+
}
427437
}
428438

429439
ResolveIdentInBlockRes::NotFound

compiler/rustc_resolve/src/late.rs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2484,12 +2484,10 @@ impl<'a, 'ast, 'ra, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {
24842484
let rib = &self.label_ribs[i];
24852485

24862486
if let RibKind::Block { id, .. } = rib.kind
2487-
&& let Some(items) = self.r.lookahead_items_in_block.get(&id)
2487+
&& let Some(seen_macro_def_list) = self.r.seen_macro_def_in_block.get(&id)
24882488
{
2489-
for (_, item) in items.iter().rev() {
2490-
if let LookaheadItemInBlock::MacroDef { def_id, .. } = item
2491-
&& *def_id == self.r.macro_def(label.span.ctxt())
2492-
{
2489+
for def in seen_macro_def_list.iter().rev() {
2490+
if *def == self.r.macro_def(label.span.ctxt()) {
24932491
// If an invocation of this macro created `ident`, give up on `ident`
24942492
// and switch to `ident`'s source from the macro definition.
24952493
label.span.remove_mark();
@@ -4778,6 +4776,14 @@ impl<'a, 'ast, 'ra, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {
47784776

47794777
// Descend into the block.
47804778
for stmt in &block.stmts {
4779+
if let StmtKind::Item(ref item) = stmt.kind
4780+
&& let ItemKind::MacroDef(..) = item.kind
4781+
{
4782+
let res = self.r.local_def_id(item.id).to_def_id();
4783+
let seen = self.r.seen_macro_def_in_block.entry(block.id).or_default();
4784+
seen.insert(res);
4785+
}
4786+
47814787
self.visit_stmt(stmt);
47824788
}
47834789

compiler/rustc_resolve/src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1150,6 +1150,7 @@ pub struct Resolver<'ra, 'tcx> {
11501150
block_map: NodeMap<Module<'ra>>,
11511151
lookahead_items_in_block: NodeMap<FxIndexMap<NodeId, LookaheadItemInBlock>>,
11521152
bindings_of_macro_def: DefIdMap<FxHashMap<Ident, (Module<'ra>, Res, Span)>>,
1153+
seen_macro_def_in_block: NodeMap<FxIndexSet<DefId>>,
11531154
/// A fake module that contains no definition and no prelude. Used so that
11541155
/// some AST passes can generate identifiers that only resolve to local or
11551156
/// lang items.
@@ -1679,6 +1680,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
16791680
impl_trait_names: Default::default(),
16801681
lookahead_items_in_block: Default::default(),
16811682
bindings_of_macro_def: Default::default(),
1683+
seen_macro_def_in_block: Default::default(),
16821684
..
16831685
};
16841686

0 commit comments

Comments
 (0)