@@ -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
93789380void 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.
0 commit comments