@@ -1903,24 +1903,37 @@ populateLookupTableEntryFromMacroExpansions(ASTContext &ctx,
19031903 // Collect all macro introduced names, along with its corresponding macro
19041904 // reference. We need the macro reference to prevent adding auxiliary decls
19051905 // that weren't introduced by the macro.
1906- MacroIntroducedNameTracker nameTracker;
1907- if (auto *med = dyn_cast<MacroExpansionDecl>(member)) {
1908- forEachPotentialResolvedMacro (
1909- dc->getModuleScopeContext (), med->getMacroName (),
1910- MacroRole::Declaration, nameTracker);
1911- } else if (auto *vd = dyn_cast<ValueDecl>(member)) {
1912- nameTracker.attachedTo = dyn_cast<ValueDecl>(member);
1913- forEachPotentialAttachedMacro (member, MacroRole::Peer, nameTracker);
1914- }
19151906
1916- // Expand macros on this member.
1917- if (nameTracker.shouldExpandForName (name)) {
1918- member->visitAuxiliaryDecls ([&](Decl *decl) {
1919- auto *sf = module ->getSourceFileContainingLocation (decl->getLoc ());
1920- // Bail out if the auxiliary decl was not produced by a macro.
1921- if (!sf || sf->Kind != SourceFileKind::MacroExpansion) return ;
1922- table.addMember (decl);
1923- });
1907+ std::deque<Decl *> mightIntroduceNames;
1908+ mightIntroduceNames.push_back (member);
1909+
1910+ while (!mightIntroduceNames.empty ()) {
1911+ auto *member = mightIntroduceNames.front ();
1912+
1913+ MacroIntroducedNameTracker nameTracker;
1914+ if (auto *med = dyn_cast<MacroExpansionDecl>(member)) {
1915+ forEachPotentialResolvedMacro (
1916+ dc->getModuleScopeContext (), med->getMacroName (),
1917+ MacroRole::Declaration, nameTracker);
1918+ } else if (auto *vd = dyn_cast<ValueDecl>(member)) {
1919+ nameTracker.attachedTo = dyn_cast<ValueDecl>(member);
1920+ forEachPotentialAttachedMacro (member, MacroRole::Peer, nameTracker);
1921+ }
1922+
1923+ // Expand macros on this member.
1924+ if (nameTracker.shouldExpandForName (name)) {
1925+ member->visitAuxiliaryDecls ([&](Decl *decl) {
1926+ auto *sf = module ->getSourceFileContainingLocation (decl->getLoc ());
1927+ // Bail out if the auxiliary decl was not produced by a macro.
1928+ if (!sf || sf->Kind != SourceFileKind::MacroExpansion)
1929+ return ;
1930+
1931+ mightIntroduceNames.push_back (decl);
1932+ table.addMember (decl);
1933+ });
1934+ }
1935+
1936+ mightIntroduceNames.pop_front ();
19241937 }
19251938 }
19261939}
0 commit comments