@@ -5524,10 +5524,11 @@ const clang::CXXMethodDecl *getCalledBaseCxxMethod(FuncDecl *baseMember) {
55245524
55255525// Construct a Swift method that represents the synthesized C++ method
55265526// that invokes the base C++ method.
5527- FuncDecl *synthesizeBaseFunctionDeclCall (ClangImporter &impl, ASTContext &ctx,
5528- NominalTypeDecl *derivedStruct,
5529- NominalTypeDecl *baseStruct,
5530- FuncDecl *baseMember) {
5527+ static FuncDecl *synthesizeBaseFunctionDeclCall (ClangImporter &impl,
5528+ ASTContext &ctx,
5529+ NominalTypeDecl *derivedStruct,
5530+ NominalTypeDecl *baseStruct,
5531+ FuncDecl *baseMember) {
55315532 auto *cxxMethod = getCalledBaseCxxMethod (baseMember);
55325533 if (!cxxMethod)
55335534 return nullptr ;
@@ -6317,7 +6318,7 @@ TinyPtrVector<ValueDecl *> ClangRecordMemberLookup::evaluate(
63176318 auto namedMember = dyn_cast<ValueDecl>(member);
63186319 if (!namedMember || !namedMember->hasName () ||
63196320 namedMember->getName ().getBaseName () != name ||
6320- clangModuleLoader->isClonedMemberDecl (namedMember))
6321+ clangModuleLoader->getOriginalForClonedMember (namedMember))
63216322 continue ;
63226323
63236324 auto *imported = clangModuleLoader->importBaseMemberDecl (
@@ -7670,22 +7671,24 @@ ValueDecl *ClangImporter::Implementation::importBaseMemberDecl(
76707671 if (known == clonedBaseMembers.end ()) {
76717672 ValueDecl *cloned = cloneBaseMemberDecl (decl, newContext, inheritance);
76727673 known = clonedBaseMembers.insert ({key, cloned}).first ;
7673- clonedMembers.insert (cloned);
7674+ clonedMembers.insert (std::make_pair ( cloned, decl) );
76747675 }
76757676
76767677 return known->second ;
76777678}
76787679
7679- bool ClangImporter::Implementation::isClonedMemberDecl (ValueDecl *decl) {
7680+ ValueDecl *ClangImporter::Implementation::getOriginalForClonedMember (
7681+ const ValueDecl *decl) {
76807682 // If this is a cloned decl, we don't want to reclone it
76817683 // Otherwise, we may end up with multiple copies of the same method
76827684 if (!decl->hasClangNode ()) {
76837685 // Skip decls with a clang node as those will never be a clone
76847686 auto result = clonedMembers.find (decl);
7685- return result != clonedMembers.end ();
7687+ if (result != clonedMembers.end ())
7688+ return result->getSecond ();
76867689 }
76877690
7688- return false ;
7691+ return nullptr ;
76897692}
76907693
76917694size_t ClangImporter::Implementation::getImportedBaseMemberDeclArity (
@@ -7704,8 +7707,8 @@ ClangImporter::importBaseMemberDecl(ValueDecl *decl, DeclContext *newContext,
77047707 return Impl.importBaseMemberDecl (decl, newContext, inheritance);
77057708}
77067709
7707- bool ClangImporter::isClonedMemberDecl ( ValueDecl *decl) {
7708- return Impl.isClonedMemberDecl (decl);
7710+ ValueDecl * ClangImporter::getOriginalForClonedMember ( const ValueDecl *decl) {
7711+ return Impl.getOriginalForClonedMember (decl);
77097712}
77107713
77117714void ClangImporter::diagnoseTopLevelValue (const DeclName &name) {
0 commit comments