Skip to content

Commit 6e44517

Browse files
committed
[NFC] Make insertMembersAndAlternates more specific
This will help when ClangImporter::Impl::loadNamedMembers() starts having to handle a lot more import-as-members names, but it’s NFC in this commit.
1 parent a8b3ef4 commit 6e44517

File tree

3 files changed

+17
-7
lines changed

3 files changed

+17
-7
lines changed

lib/ClangImporter/ClangImporter.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6281,7 +6281,7 @@ ClangImporter::Implementation::loadNamedMembers(
62816281
if (member->getDeclContext() != CDC) continue;
62826282

62836283
SmallVector<Decl*, 4> tmp;
6284-
insertMembersAndAlternates(member, tmp);
6284+
insertMembersAndAlternates(member, tmp, DC);
62856285
for (auto *TD : tmp) {
62866286
if (auto *V = dyn_cast<ValueDecl>(TD)) {
62876287
// Skip ValueDecls if they import under different names.
@@ -6313,7 +6313,7 @@ ClangImporter::Implementation::loadNamedMembers(
63136313
if (member->getDeclContext() != CDC) continue;
63146314

63156315
SmallVector<Decl*, 4> tmp;
6316-
insertMembersAndAlternates(member, tmp);
6316+
insertMembersAndAlternates(member, tmp, DC);
63176317
for (auto *TD : tmp) {
63186318
if (auto *V = dyn_cast<ValueDecl>(TD)) {
63196319
// Skip ValueDecls if they import under different names.

lib/ClangImporter/ImportDecl.cpp

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9136,6 +9136,8 @@ void ClangImporter::Implementation::loadAllMembersOfRecordDecl(
91369136
(isa<clang::FieldDecl>(nd) || nd == nd->getCanonicalDecl());
91379137
if (isCanonicalInContext && nd->getDeclContext() == clangRecord &&
91389138
isVisibleClangEntry(nd))
9139+
// We don't pass `swiftDecl` as `expectedDC` because we might be in a
9140+
// recursive call that adds base class members to a derived class.
91399141
insertMembersAndAlternates(nd, members);
91409142
}
91419143

@@ -9376,7 +9378,9 @@ void ClangImporter::Implementation::loadAllMembersOfObjcContainer(
93769378
}
93779379

93789380
void ClangImporter::Implementation::insertMembersAndAlternates(
9379-
const clang::NamedDecl *nd, SmallVectorImpl<Decl *> &members) {
9381+
const clang::NamedDecl *nd,
9382+
SmallVectorImpl<Decl *> &members,
9383+
DeclContext *expectedDC) {
93809384

93819385
size_t start = members.size();
93829386
llvm::SmallPtrSet<Decl *, 4> knownAlternateMembers;
@@ -9391,9 +9395,13 @@ void ClangImporter::Implementation::insertMembersAndAlternates(
93919395
return false;
93929396
}
93939397

9398+
// If no DC was provided, use wherever the primary decl was imported into.
9399+
if (!expectedDC)
9400+
expectedDC = member->getDeclContext();
9401+
93949402
// If there are alternate declarations for this member, add them.
93959403
for (auto alternate : getAlternateDecls(member)) {
9396-
if (alternate->getDeclContext() == member->getDeclContext() &&
9404+
if (alternate->getDeclContext() == expectedDC &&
93979405
knownAlternateMembers.insert(alternate).second) {
93989406
members.push_back(alternate);
93999407
}
@@ -9404,7 +9412,8 @@ void ClangImporter::Implementation::insertMembersAndAlternates(
94049412
if (shouldSuppressDeclImport(nd))
94059413
return true;
94069414

9407-
members.push_back(member);
9415+
if (member->getDeclContext() == expectedDC)
9416+
members.push_back(member);
94089417
if (nameVersion.supportsConcurrency()) {
94099418
assert(!asyncImport &&
94109419
"Should only have a single version with concurrency enabled");
@@ -9436,7 +9445,7 @@ void ClangImporter::Implementation::collectMembersToAdd(
94369445
if (nd && nd == nd->getCanonicalDecl() &&
94379446
nd->getDeclContext() == objcContainer &&
94389447
isVisibleClangEntry(nd))
9439-
insertMembersAndAlternates(nd, members);
9448+
insertMembersAndAlternates(nd, members, DC);
94409449
}
94419450

94429451
// Objective-C protocols don't require any special handling.

lib/ClangImporter/ImporterImpl.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1621,7 +1621,8 @@ class LLVM_LIBRARY_VISIBILITY ClangImporter::Implementation
16211621
Decl *D, DeclContext *DC,
16221622
SmallVectorImpl<Decl *> &members);
16231623
void insertMembersAndAlternates(const clang::NamedDecl *nd,
1624-
SmallVectorImpl<Decl *> &members);
1624+
SmallVectorImpl<Decl *> &members,
1625+
DeclContext *expectedDC = nullptr);
16251626
void loadAllMembersIntoExtension(Decl *D, uint64_t extra);
16261627

16271628
/// Imports \p decl under \p nameVersion with the name \p newName, and adds

0 commit comments

Comments
 (0)