@@ -9136,6 +9136,8 @@ void ClangImporter::Implementation::loadAllMembersOfRecordDecl(
9136
9136
(isa<clang::FieldDecl>(nd) || nd == nd->getCanonicalDecl ());
9137
9137
if (isCanonicalInContext && nd->getDeclContext () == clangRecord &&
9138
9138
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.
9139
9141
insertMembersAndAlternates (nd, members);
9140
9142
}
9141
9143
@@ -9376,7 +9378,9 @@ void ClangImporter::Implementation::loadAllMembersOfObjcContainer(
9376
9378
}
9377
9379
9378
9380
void ClangImporter::Implementation::insertMembersAndAlternates (
9379
- const clang::NamedDecl *nd, SmallVectorImpl<Decl *> &members) {
9381
+ const clang::NamedDecl *nd,
9382
+ SmallVectorImpl<Decl *> &members,
9383
+ DeclContext *expectedDC) {
9380
9384
9381
9385
size_t start = members.size ();
9382
9386
llvm::SmallPtrSet<Decl *, 4 > knownAlternateMembers;
@@ -9391,9 +9395,13 @@ void ClangImporter::Implementation::insertMembersAndAlternates(
9391
9395
return false ;
9392
9396
}
9393
9397
9398
+ // If no DC was provided, use wherever the primary decl was imported into.
9399
+ if (!expectedDC)
9400
+ expectedDC = member->getDeclContext ();
9401
+
9394
9402
// If there are alternate declarations for this member, add them.
9395
9403
for (auto alternate : getAlternateDecls (member)) {
9396
- if (alternate->getDeclContext () == member-> getDeclContext () &&
9404
+ if (alternate->getDeclContext () == expectedDC &&
9397
9405
knownAlternateMembers.insert (alternate).second ) {
9398
9406
members.push_back (alternate);
9399
9407
}
@@ -9404,7 +9412,8 @@ void ClangImporter::Implementation::insertMembersAndAlternates(
9404
9412
if (shouldSuppressDeclImport (nd))
9405
9413
return true ;
9406
9414
9407
- members.push_back (member);
9415
+ if (member->getDeclContext () == expectedDC)
9416
+ members.push_back (member);
9408
9417
if (nameVersion.supportsConcurrency ()) {
9409
9418
assert (!asyncImport &&
9410
9419
" Should only have a single version with concurrency enabled" );
@@ -9436,7 +9445,7 @@ void ClangImporter::Implementation::collectMembersToAdd(
9436
9445
if (nd && nd == nd->getCanonicalDecl () &&
9437
9446
nd->getDeclContext () == objcContainer &&
9438
9447
isVisibleClangEntry (nd))
9439
- insertMembersAndAlternates (nd, members);
9448
+ insertMembersAndAlternates (nd, members, DC );
9440
9449
}
9441
9450
9442
9451
// Objective-C protocols don't require any special handling.
0 commit comments