@@ -5538,7 +5538,8 @@ void ConformanceChecker::emitDelayedDiags() {
55385538
55395539ProtocolConformanceRef
55405540TypeChecker::containsProtocol (Type T, ProtocolDecl *Proto, ModuleDecl *M,
5541- bool skipConditionalRequirements) {
5541+ bool skipConditionalRequirements,
5542+ bool allowMissing) {
55425543 // Existential types don't need to conform, i.e., they only need to
55435544 // contain the protocol.
55445545 if (T->isExistentialType ()) {
@@ -5560,8 +5561,9 @@ TypeChecker::containsProtocol(Type T, ProtocolDecl *Proto, ModuleDecl *M,
55605561 if (auto superclass = layout.getSuperclass ()) {
55615562 auto result =
55625563 (skipConditionalRequirements
5563- ? M->lookupConformance (superclass, Proto)
5564- : TypeChecker::conformsToProtocol (superclass, Proto, M));
5564+ ? M->lookupConformance (superclass, Proto, allowMissing)
5565+ : TypeChecker::conformsToProtocol (
5566+ superclass, Proto, M, allowMissing));
55655567 if (result) {
55665568 return result;
55675569 }
@@ -5579,13 +5581,22 @@ TypeChecker::containsProtocol(Type T, ProtocolDecl *Proto, ModuleDecl *M,
55795581 return ProtocolConformanceRef (Proto);
55805582 }
55815583
5584+ // FIXME: Unify with shouldCreateMissingConformances
5585+ if (allowMissing &&
5586+ Proto->isSpecificProtocol (KnownProtocolKind::Sendable)) {
5587+ return ProtocolConformanceRef (
5588+ M->getASTContext ().getBuiltinConformance (
5589+ T, Proto, GenericSignature (), { },
5590+ BuiltinConformanceKind::Missing));
5591+ }
5592+
55825593 return ProtocolConformanceRef::forInvalid ();
55835594 }
55845595
55855596 // For non-existential types, this is equivalent to checking conformance.
55865597 return (skipConditionalRequirements
5587- ? M->lookupConformance (T, Proto)
5588- : TypeChecker::conformsToProtocol (T, Proto, M));
5598+ ? M->lookupConformance (T, Proto, allowMissing )
5599+ : TypeChecker::conformsToProtocol (T, Proto, M, allowMissing ));
55895600}
55905601
55915602ProtocolConformanceRef
0 commit comments