Skip to content

Commit 8296c58

Browse files
authored
Merge pull request #38921 from DougGregor/rdar-81700570-workaround
2 parents 084f5b3 + 5ba80ee commit 8296c58

File tree

1 file changed

+24
-1
lines changed

1 file changed

+24
-1
lines changed

lib/AST/ConformanceLookupTable.cpp

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -798,7 +798,30 @@ DeclContext *ConformanceLookupTable::getConformingContext(
798798
// Grab the superclass entry and continue searching for a
799799
// non-inherited conformance.
800800
// FIXME: Ambiguity detection and resolution.
801-
entry = superclassDecl->ConformanceTable->Conformances[protocol].front();
801+
const auto &superclassConformances =
802+
superclassDecl->ConformanceTable->Conformances[protocol];
803+
if (superclassConformances.empty()) {
804+
assert(protocol->isSpecificProtocol(KnownProtocolKind::Sendable));
805+
806+
// Go dig for a superclass that does conform to Sendable.
807+
// FIXME: This is a hack because the inherited conformances aren't
808+
// getting updated properly.
809+
Type classTy = nominal->getDeclaredInterfaceType();
810+
ModuleDecl *module = nominal->getParentModule();
811+
do {
812+
Type superclassTy = classTy->getSuperclassForDecl(superclassDecl);
813+
if (superclassTy->is<ErrorType>())
814+
return nullptr;
815+
auto inheritedConformance = module->lookupConformance(
816+
superclassTy, protocol);
817+
if (inheritedConformance)
818+
return superclassDecl;
819+
} while ((superclassDecl = superclassDecl->getSuperclassDecl()));
820+
821+
return nullptr;
822+
}
823+
824+
entry = superclassConformances.front();
802825
nominal = superclassDecl;
803826
}
804827

0 commit comments

Comments
 (0)