@@ -5524,10 +5524,11 @@ const clang::CXXMethodDecl *getCalledBaseCxxMethod(FuncDecl *baseMember) {
5524
5524
5525
5525
// Construct a Swift method that represents the synthesized C++ method
5526
5526
// 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) {
5531
5532
auto *cxxMethod = getCalledBaseCxxMethod (baseMember);
5532
5533
if (!cxxMethod)
5533
5534
return nullptr ;
@@ -6317,7 +6318,7 @@ TinyPtrVector<ValueDecl *> ClangRecordMemberLookup::evaluate(
6317
6318
auto namedMember = dyn_cast<ValueDecl>(member);
6318
6319
if (!namedMember || !namedMember->hasName () ||
6319
6320
namedMember->getName ().getBaseName () != name ||
6320
- clangModuleLoader->isClonedMemberDecl (namedMember))
6321
+ clangModuleLoader->getOriginalForClonedMember (namedMember))
6321
6322
continue ;
6322
6323
6323
6324
auto *imported = clangModuleLoader->importBaseMemberDecl (
@@ -7670,22 +7671,24 @@ ValueDecl *ClangImporter::Implementation::importBaseMemberDecl(
7670
7671
if (known == clonedBaseMembers.end ()) {
7671
7672
ValueDecl *cloned = cloneBaseMemberDecl (decl, newContext, inheritance);
7672
7673
known = clonedBaseMembers.insert ({key, cloned}).first ;
7673
- clonedMembers.insert (cloned);
7674
+ clonedMembers.insert (std::make_pair ( cloned, decl) );
7674
7675
}
7675
7676
7676
7677
return known->second ;
7677
7678
}
7678
7679
7679
- bool ClangImporter::Implementation::isClonedMemberDecl (ValueDecl *decl) {
7680
+ ValueDecl *ClangImporter::Implementation::getOriginalForClonedMember (
7681
+ const ValueDecl *decl) {
7680
7682
// If this is a cloned decl, we don't want to reclone it
7681
7683
// Otherwise, we may end up with multiple copies of the same method
7682
7684
if (!decl->hasClangNode ()) {
7683
7685
// Skip decls with a clang node as those will never be a clone
7684
7686
auto result = clonedMembers.find (decl);
7685
- return result != clonedMembers.end ();
7687
+ if (result != clonedMembers.end ())
7688
+ return result->getSecond ();
7686
7689
}
7687
7690
7688
- return false ;
7691
+ return nullptr ;
7689
7692
}
7690
7693
7691
7694
size_t ClangImporter::Implementation::getImportedBaseMemberDeclArity (
@@ -7704,8 +7707,8 @@ ClangImporter::importBaseMemberDecl(ValueDecl *decl, DeclContext *newContext,
7704
7707
return Impl.importBaseMemberDecl (decl, newContext, inheritance);
7705
7708
}
7706
7709
7707
- bool ClangImporter::isClonedMemberDecl ( ValueDecl *decl) {
7708
- return Impl.isClonedMemberDecl (decl);
7710
+ ValueDecl * ClangImporter::getOriginalForClonedMember ( const ValueDecl *decl) {
7711
+ return Impl.getOriginalForClonedMember (decl);
7709
7712
}
7710
7713
7711
7714
void ClangImporter::diagnoseTopLevelValue (const DeclName &name) {
0 commit comments