Skip to content

Commit c3a56fd

Browse files
committed
Revert "[cxx-interop] Import decls in extern blocks within namespaces"
This reverts commit 844787f Reverting because of a modularization issue in host libc++. rdar://160536819 rdar://160536878
1 parent d15e139 commit c3a56fd

File tree

7 files changed

+63
-170
lines changed

7 files changed

+63
-170
lines changed

lib/AST/ASTPrinter.cpp

Lines changed: 61 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -2789,87 +2789,72 @@ static void addNamespaceMembers(Decl *decl,
27892789
if (declOwner && declOwner != redeclOwner->getTopLevelModule())
27902790
continue;
27912791
}
2792+
for (auto member : redecl->decls()) {
2793+
if (auto classTemplate = dyn_cast<clang::ClassTemplateDecl>(member)) {
2794+
// Add all specializations to a worklist so we don't accidentally mutate
2795+
// the list of decls we're iterating over.
2796+
llvm::SmallPtrSet<const clang::ClassTemplateSpecializationDecl *, 16> specWorklist;
2797+
for (auto spec : classTemplate->specializations())
2798+
specWorklist.insert(spec);
2799+
for (auto spec : specWorklist) {
2800+
if (auto import =
2801+
ctx.getClangModuleLoader()->importDeclDirectly(spec))
2802+
if (addedMembers.insert(import).second)
2803+
members.push_back(import);
2804+
}
2805+
}
27922806

2793-
std::function<void(clang::DeclContext *)> addDeclsFromContext =
2794-
[&](clang::DeclContext *declContext) {
2795-
for (auto member : declContext->decls()) {
2796-
if (auto classTemplate =
2797-
dyn_cast<clang::ClassTemplateDecl>(member)) {
2798-
// Add all specializations to a worklist so we don't accidentally
2799-
// mutate the list of decls we're iterating over.
2800-
llvm::SmallPtrSet<const clang::ClassTemplateSpecializationDecl *,
2801-
16>
2802-
specWorklist;
2803-
for (auto spec : classTemplate->specializations())
2804-
specWorklist.insert(spec);
2805-
for (auto spec : specWorklist) {
2806-
if (auto import =
2807-
ctx.getClangModuleLoader()->importDeclDirectly(spec))
2808-
if (addedMembers.insert(import).second)
2809-
members.push_back(import);
2810-
}
2807+
auto lookupAndAddMembers = [&](DeclName name) {
2808+
auto allResults = evaluateOrDefault(
2809+
ctx.evaluator, ClangDirectLookupRequest({decl, redecl, name}), {});
2810+
2811+
for (auto found : allResults) {
2812+
auto clangMember = cast<clang::NamedDecl *>(found);
2813+
if (auto importedDecl =
2814+
ctx.getClangModuleLoader()->importDeclDirectly(clangMember)) {
2815+
if (addedMembers.insert(importedDecl).second) {
2816+
members.push_back(importedDecl);
2817+
2818+
// Handle macro-expanded declarations.
2819+
importedDecl->visitAuxiliaryDecls([&](Decl *decl) {
2820+
auto valueDecl = dyn_cast<ValueDecl>(decl);
2821+
if (!valueDecl)
2822+
return;
2823+
2824+
// Bail out if the auxiliary decl was not produced by a macro.
2825+
auto module = decl->getDeclContext()->getParentModule();
2826+
auto *sf = module->getSourceFileContainingLocation(decl->getLoc());
2827+
if (!sf || sf->Kind != SourceFileKind::MacroExpansion)
2828+
return;
2829+
2830+
members.push_back(valueDecl);
2831+
});
28112832
}
2833+
}
2834+
}
2835+
};
28122836

2813-
auto lookupAndAddMembers = [&](clang::NamedDecl *namedDecl) {
2814-
auto name = ctx.getClangModuleLoader()->importName(namedDecl);
2815-
if (!name)
2816-
return;
2817-
2818-
auto allResults = evaluateOrDefault(
2819-
ctx.evaluator, ClangDirectLookupRequest({decl, redecl, name}),
2820-
{});
2821-
2822-
for (auto found : allResults) {
2823-
auto clangMember = cast<clang::NamedDecl *>(found);
2824-
if (auto importedDecl =
2825-
ctx.getClangModuleLoader()->importDeclDirectly(
2826-
clangMember)) {
2827-
if (addedMembers.insert(importedDecl).second) {
2828-
members.push_back(importedDecl);
2829-
2830-
// Handle macro-expanded declarations.
2831-
importedDecl->visitAuxiliaryDecls([&](Decl *decl) {
2832-
auto valueDecl = dyn_cast<ValueDecl>(decl);
2833-
if (!valueDecl)
2834-
return;
2835-
2836-
// Bail out if the auxiliary decl was not produced by a
2837-
// macro.
2838-
auto module = decl->getDeclContext()->getParentModule();
2839-
auto *sf = module->getSourceFileContainingLocation(
2840-
decl->getLoc());
2841-
if (!sf || sf->Kind != SourceFileKind::MacroExpansion)
2842-
return;
2843-
2844-
members.push_back(valueDecl);
2845-
});
2846-
}
2847-
}
2848-
}
2849-
};
2850-
2851-
// Look through `extern` blocks.
2852-
if (auto linkageSpecDecl = dyn_cast<clang::LinkageSpecDecl>(member))
2853-
addDeclsFromContext(linkageSpecDecl);
2854-
2855-
auto namedDecl = dyn_cast<clang::NamedDecl>(member);
2856-
if (!namedDecl)
2837+
auto namedDecl = dyn_cast<clang::NamedDecl>(member);
2838+
if (!namedDecl)
2839+
continue;
2840+
auto name = ctx.getClangModuleLoader()->importName(namedDecl);
2841+
if (!name)
2842+
continue;
2843+
lookupAndAddMembers(name);
2844+
2845+
// Unscoped enums could have their enumerators present
2846+
// in the parent namespace.
2847+
if (auto *ed = dyn_cast<clang::EnumDecl>(member)) {
2848+
if (!ed->isScoped()) {
2849+
for (const auto *ecd : ed->enumerators()) {
2850+
auto name = ctx.getClangModuleLoader()->importName(ecd);
2851+
if (!name)
28572852
continue;
2858-
lookupAndAddMembers(namedDecl);
2859-
2860-
// Unscoped enums could have their enumerators present
2861-
// in the parent namespace.
2862-
if (auto *ed = dyn_cast<clang::EnumDecl>(member)) {
2863-
if (!ed->isScoped()) {
2864-
for (auto *ecd : ed->enumerators()) {
2865-
lookupAndAddMembers(ecd);
2866-
}
2867-
}
2868-
}
2853+
lookupAndAddMembers(name);
28692854
}
2870-
};
2871-
2872-
addDeclsFromContext(redecl);
2855+
}
2856+
}
2857+
}
28732858
}
28742859
}
28752860

lib/ClangImporter/ClangImporter.cpp

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5076,11 +5076,6 @@ static bool isDirectLookupMemberContext(const clang::Decl *foundClangDecl,
50765076
return firstDecl->getCanonicalDecl() == parent->getCanonicalDecl();
50775077
}
50785078
}
5079-
// Look through `extern` blocks.
5080-
if (auto linkageSpecDecl = dyn_cast<clang::LinkageSpecDecl>(memberContext)) {
5081-
if (auto parentDecl = dyn_cast<clang::Decl>(linkageSpecDecl->getParent()))
5082-
return isDirectLookupMemberContext(foundClangDecl, parentDecl, parent);
5083-
}
50845079
return false;
50855080
}
50865081

lib/ClangImporter/ImportDecl.cpp

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1171,14 +1171,11 @@ namespace {
11711171
return nullptr;
11721172
// If this is a top-level namespace, don't put it in the module we're
11731173
// importing, put it in the "__ObjC" module that is implicitly imported.
1174-
auto clangDC = decl->getDeclContext();
1175-
while (isa<clang::LinkageSpecDecl>(clangDC))
1176-
clangDC = clangDC->getParent();
1177-
if (!clangDC->isNamespace())
1174+
if (!decl->getParent()->isNamespace())
11781175
dc = Impl.ImportedHeaderUnit;
11791176
else {
11801177
// This is a nested namespace, so just lookup it's parent normally.
1181-
auto parentNS = cast<clang::NamespaceDecl>(clangDC);
1178+
auto parentNS = cast<clang::NamespaceDecl>(decl->getParent());
11821179
auto parent =
11831180
Impl.importDecl(parentNS, getVersion(), /*UseCanonicalDecl*/ false);
11841181
// The parent namespace might not be imported if it's `swift_private`.

lib/ClangImporter/SwiftLookupTable.cpp

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2034,20 +2034,6 @@ void importer::addEntryToLookupTable(SwiftLookupTable &table,
20342034
namedMember = def;
20352035
addEntryToLookupTable(table, namedMember, nameImporter);
20362036
}
2037-
if (auto linkageSpecDecl =
2038-
dyn_cast<clang::LinkageSpecDecl>(canonicalMember)) {
2039-
std::function<void(clang::DeclContext *)> addDeclsFromContext =
2040-
[&](clang::DeclContext *declContext) {
2041-
for (auto nestedDecl : declContext->decls()) {
2042-
if (auto namedMember = dyn_cast<clang::NamedDecl>(nestedDecl))
2043-
addEntryToLookupTable(table, namedMember, nameImporter);
2044-
else if (auto nestedLinkageSpecDecl =
2045-
dyn_cast<clang::LinkageSpecDecl>(nestedDecl))
2046-
addDeclsFromContext(nestedLinkageSpecDecl);
2047-
}
2048-
};
2049-
addDeclsFromContext(linkageSpecDecl);
2050-
}
20512037
}
20522038
}
20532039
if (auto usingDecl = dyn_cast<clang::UsingDecl>(named)) {

test/Interop/Cxx/namespace/Inputs/extern-within-namespace.h

Lines changed: 0 additions & 28 deletions
This file was deleted.

test/Interop/Cxx/namespace/extern-within-namespace-module-interface.swift

Lines changed: 0 additions & 17 deletions
This file was deleted.

test/Interop/Cxx/namespace/extern-within-namespace.swift

Lines changed: 0 additions & 25 deletions
This file was deleted.

0 commit comments

Comments
 (0)