@@ -5672,7 +5672,8 @@ void ConformanceChecker::emitDelayedDiags() {
56725672
56735673ProtocolConformanceRef
56745674TypeChecker::containsProtocol (Type T, ProtocolDecl *Proto, ModuleDecl *M,
5675- bool skipConditionalRequirements) {
5675+ bool skipConditionalRequirements,
5676+ bool allowMissing) {
56765677 // Existential types don't need to conform, i.e., they only need to
56775678 // contain the protocol.
56785679 if (T->isExistentialType ()) {
@@ -5694,8 +5695,9 @@ TypeChecker::containsProtocol(Type T, ProtocolDecl *Proto, ModuleDecl *M,
56945695 if (auto superclass = layout.getSuperclass ()) {
56955696 auto result =
56965697 (skipConditionalRequirements
5697- ? M->lookupConformance (superclass, Proto)
5698- : TypeChecker::conformsToProtocol (superclass, Proto, M));
5698+ ? M->lookupConformance (superclass, Proto, allowMissing)
5699+ : TypeChecker::conformsToProtocol (
5700+ superclass, Proto, M, allowMissing));
56995701 if (result) {
57005702 return result;
57015703 }
@@ -5713,13 +5715,22 @@ TypeChecker::containsProtocol(Type T, ProtocolDecl *Proto, ModuleDecl *M,
57135715 return ProtocolConformanceRef (Proto);
57145716 }
57155717
5718+ // FIXME: Unify with shouldCreateMissingConformances
5719+ if (allowMissing &&
5720+ Proto->isSpecificProtocol (KnownProtocolKind::Sendable)) {
5721+ return ProtocolConformanceRef (
5722+ M->getASTContext ().getBuiltinConformance (
5723+ T, Proto, GenericSignature (), { },
5724+ BuiltinConformanceKind::Missing));
5725+ }
5726+
57165727 return ProtocolConformanceRef::forInvalid ();
57175728 }
57185729
57195730 // For non-existential types, this is equivalent to checking conformance.
57205731 return (skipConditionalRequirements
5721- ? M->lookupConformance (T, Proto)
5722- : TypeChecker::conformsToProtocol (T, Proto, M));
5732+ ? M->lookupConformance (T, Proto, allowMissing )
5733+ : TypeChecker::conformsToProtocol (T, Proto, M, allowMissing ));
57235734}
57245735
57255736ProtocolConformanceRef
0 commit comments