@@ -9751,39 +9751,33 @@ static void loadAllMembersOfSuperclassIfNeeded(ClassDecl *CD) {
9751
9751
E->loadAllMembers ();
9752
9752
}
9753
9753
9754
- static void loadAllMembersOfRecordDecl (StructDecl *recordDecl) {
9755
- auto &ctx = recordDecl-> getASTContext ();
9754
+ void ClangImporter::Implementation:: loadAllMembersOfRecordDecl (
9755
+ StructDecl * recordDecl) {
9756
9756
auto clangRecord = cast<clang::RecordDecl>(recordDecl->getClangDecl ());
9757
9757
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);
9773
9762
// 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 ())
9776
9765
continue ;
9777
9766
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
+ }
9781
9772
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);
9787
9781
}
9788
9782
}
9789
9783
@@ -9819,13 +9813,7 @@ ClangImporter::Implementation::loadAllMembers(Decl *D, uint64_t extra) {
9819
9813
}
9820
9814
9821
9815
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 );
9826
9816
loadAllMembersOfRecordDecl (cast<StructDecl>(D));
9827
- // Now that all members are loaded, mark the context as lazily complete.
9828
- cast<StructDecl>(D)->setHasLazyMembers (false );
9829
9817
return ;
9830
9818
}
9831
9819
0 commit comments