@@ -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 (
@@ -7671,22 +7672,24 @@ ValueDecl *ClangImporter::Implementation::importBaseMemberDecl(
7671
7672
if (known == clonedBaseMembers.end ()) {
7672
7673
ValueDecl *cloned = cloneBaseMemberDecl (decl, newContext, inheritance);
7673
7674
known = clonedBaseMembers.insert ({key, cloned}).first ;
7674
- clonedMembers.insert (cloned);
7675
+ clonedMembers.insert (std::make_pair ( cloned, decl) );
7675
7676
}
7676
7677
7677
7678
return known->second ;
7678
7679
}
7679
7680
7680
- bool ClangImporter::Implementation::isClonedMemberDecl (ValueDecl *decl) {
7681
+ ValueDecl *ClangImporter::Implementation::getOriginalForClonedMember (
7682
+ const ValueDecl *decl) {
7681
7683
// If this is a cloned decl, we don't want to reclone it
7682
7684
// Otherwise, we may end up with multiple copies of the same method
7683
7685
if (!decl->hasClangNode ()) {
7684
7686
// Skip decls with a clang node as those will never be a clone
7685
7687
auto result = clonedMembers.find (decl);
7686
- return result != clonedMembers.end ();
7688
+ if (result != clonedMembers.end ())
7689
+ return result->getSecond ();
7687
7690
}
7688
7691
7689
- return false ;
7692
+ return nullptr ;
7690
7693
}
7691
7694
7692
7695
size_t ClangImporter::Implementation::getImportedBaseMemberDeclArity (
@@ -7705,8 +7708,8 @@ ClangImporter::importBaseMemberDecl(ValueDecl *decl, DeclContext *newContext,
7705
7708
return Impl.importBaseMemberDecl (decl, newContext, inheritance);
7706
7709
}
7707
7710
7708
- bool ClangImporter::isClonedMemberDecl ( ValueDecl *decl) {
7709
- return Impl.isClonedMemberDecl (decl);
7711
+ ValueDecl * ClangImporter::getOriginalForClonedMember ( const ValueDecl *decl) {
7712
+ return Impl.getOriginalForClonedMember (decl);
7710
7713
}
7711
7714
7712
7715
void ClangImporter::diagnoseTopLevelValue (const DeclName &name) {
0 commit comments