Skip to content

Commit fedd376

Browse files
authored
Merge pull request swiftlang#40406 from DougGregor/import-all-members-without-lookup-direct
2 parents e89f52f + 8b198d9 commit fedd376

File tree

3 files changed

+28
-37
lines changed

3 files changed

+28
-37
lines changed

lib/ClangImporter/ImportDecl.cpp

Lines changed: 21 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -9751,39 +9751,33 @@ static void loadAllMembersOfSuperclassIfNeeded(ClassDecl *CD) {
97519751
E->loadAllMembers();
97529752
}
97539753

9754-
static void loadAllMembersOfRecordDecl(StructDecl *recordDecl) {
9755-
auto &ctx = recordDecl->getASTContext();
9754+
void ClangImporter::Implementation::loadAllMembersOfRecordDecl(
9755+
StructDecl *recordDecl) {
97569756
auto clangRecord = cast<clang::RecordDecl>(recordDecl->getClangDecl());
97579757

9758-
// This is only to keep track of the members we've already seen.
9759-
llvm::SmallPtrSet<Decl *, 16> addedMembers;
9760-
for (auto member : recordDecl->getCurrentMembersWithoutLoading())
9761-
addedMembers.insert(member);
9762-
9763-
for (auto member : clangRecord->decls()) {
9764-
auto namedDecl = dyn_cast<clang::NamedDecl>(member);
9765-
if (!namedDecl)
9766-
continue;
9767-
9768-
// Don't try to load ourselves (this will create an infinite loop).
9769-
if (auto possibleSelf = dyn_cast<clang::RecordDecl>(member))
9770-
if (possibleSelf->getDefinition() == clangRecord)
9771-
continue;
9772-
9758+
// Import all of the members.
9759+
llvm::SmallVector<Decl *, 16> members;
9760+
for (const clang::Decl *m : clangRecord->decls()) {
9761+
auto nd = dyn_cast<clang::NamedDecl>(m);
97739762
// Currently, we don't import unnamed bitfields.
9774-
if (isa<clang::FieldDecl>(member) &&
9775-
cast<clang::FieldDecl>(member)->isUnnamedBitfield())
9763+
if (isa<clang::FieldDecl>(m) &&
9764+
cast<clang::FieldDecl>(m)->isUnnamedBitfield())
97769765
continue;
97779766

9778-
auto name = ctx.getClangModuleLoader()->importName(namedDecl);
9779-
if (!name)
9780-
continue;
9767+
if (nd && nd == nd->getCanonicalDecl() &&
9768+
nd->getDeclContext() == clangRecord &&
9769+
isVisibleClangEntry(nd))
9770+
insertMembersAndAlternates(nd, members);
9771+
}
97819772

9782-
for (auto found : recordDecl->lookupDirect(name)) {
9783-
if (addedMembers.insert(found).second &&
9784-
found->getDeclContext() == recordDecl)
9785-
recordDecl->addMember(found);
9786-
}
9773+
// Add the members here.
9774+
for (auto member: members) {
9775+
// FIXME: constructors are added eagerly, but shouldn't be
9776+
// FIXME: subscripts are added eagerly, but shouldn't be
9777+
if (!isa<AccessorDecl>(member) &&
9778+
!isa<SubscriptDecl>(member) &&
9779+
!isa<ConstructorDecl>(member))
9780+
recordDecl->addMember(member);
97879781
}
97889782
}
97899783

@@ -9819,13 +9813,7 @@ ClangImporter::Implementation::loadAllMembers(Decl *D, uint64_t extra) {
98199813
}
98209814

98219815
if (isa_and_nonnull<clang::RecordDecl>(D->getClangDecl())) {
9822-
// We haven't loaded any members yet, so tell our context that it still has
9823-
// lazy members. Otherwise, we won't be able to look up any individual
9824-
// members (lazily) in "loadAllMembersOfRecordDecl".
9825-
cast<StructDecl>(D)->setHasLazyMembers(true);
98269816
loadAllMembersOfRecordDecl(cast<StructDecl>(D));
9827-
// Now that all members are loaded, mark the context as lazily complete.
9828-
cast<StructDecl>(D)->setHasLazyMembers(false);
98299817
return;
98309818
}
98319819

lib/ClangImporter/ImporterImpl.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1390,6 +1390,8 @@ class LLVM_LIBRARY_VISIBILITY ClangImporter::Implementation
13901390
void
13911391
loadAllMembersOfObjcContainer(Decl *D,
13921392
const clang::ObjCContainerDecl *objcContainer);
1393+
void loadAllMembersOfRecordDecl(StructDecl *recordDecl);
1394+
13931395
void collectMembersToAdd(const clang::ObjCContainerDecl *objcContainer,
13941396
Decl *D, DeclContext *DC,
13951397
SmallVectorImpl<Decl *> &members);

test/Interop/Cxx/operators/member-inline-module-interface.swift

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -60,16 +60,17 @@
6060
// CHECK: func __operatorSubscriptConst(_ x: Int32) -> UnsafePointer<Int32>
6161

6262
// CHECK: @available(*, unavailable, message: "use subscript")
63-
// CHECK: func __operatorSubscriptConst(_ x: Bool) -> UnsafePointer<Bool>
63+
// CHECK: mutating func __operatorSubscript(_ x: Int32) -> UnsafeMutablePointer<Int32>
6464

6565
// CHECK: @available(*, unavailable, message: "use subscript")
66-
// CHECK: func __operatorSubscriptConst(_ x: Double) -> UnsafePointer<Double>
66+
// CHECK: mutating func __operatorSubscript(_ x: Bool) -> UnsafeMutablePointer<Bool>
6767

6868
// CHECK: @available(*, unavailable, message: "use subscript")
69-
// CHECK: mutating func __operatorSubscript(_ x: Int32) -> UnsafeMutablePointer<Int32>
69+
// CHECK: func __operatorSubscriptConst(_ x: Bool) -> UnsafePointer<Bool>
7070

7171
// CHECK: @available(*, unavailable, message: "use subscript")
72-
// CHECK: mutating func __operatorSubscript(_ x: Bool) -> UnsafeMutablePointer<Bool>
72+
// CHECK: func __operatorSubscriptConst(_ x: Double) -> UnsafePointer<Double>
73+
7374
// CHECK: }
7475

7576

0 commit comments

Comments
 (0)