@@ -5777,12 +5777,16 @@ TypeChecker::containsProtocol(Type T, ProtocolDecl *Proto, ModuleDecl *M,
57775777
57785778 // First, if we have a superclass constraint, the class may conform
57795779 // concretely.
5780+ //
5781+ // Note that `allowMissing` is not propagated here because it
5782+ // would result in a missing conformance if type is `& Sendable`
5783+ // protocol composition. It's handled for type as a whole below.
57805784 if (auto superclass = layout.getSuperclass ()) {
57815785 auto result =
57825786 (skipConditionalRequirements
5783- ? M->lookupConformance (superclass, Proto, allowMissing)
5784- : TypeChecker::conformsToProtocol (
5785- superclass, Proto, M, allowMissing));
5787+ ? M->lookupConformance (superclass, Proto, /* allowMissing= */ false )
5788+ : TypeChecker::conformsToProtocol (superclass, Proto, M,
5789+ /* allowMissing= */ false ));
57865790 if (result) {
57875791 return result;
57885792 }
@@ -5800,15 +5804,8 @@ TypeChecker::containsProtocol(Type T, ProtocolDecl *Proto, ModuleDecl *M,
58005804 return ProtocolConformanceRef (Proto);
58015805 }
58025806
5803- // FIXME: Unify with shouldCreateMissingConformances
5804- if (allowMissing &&
5805- Proto->isSpecificProtocol (KnownProtocolKind::Sendable)) {
5806- return ProtocolConformanceRef (
5807- M->getASTContext ().getBuiltinConformance (
5808- T, Proto, BuiltinConformanceKind::Missing));
5809- }
5810-
5811- return ProtocolConformanceRef::forInvalid ();
5807+ return allowMissing ? ProtocolConformanceRef::forMissingOrInvalid (T, Proto)
5808+ : ProtocolConformanceRef::forInvalid ();
58125809 }
58135810
58145811 // For non-existential types, this is equivalent to checking conformance.
0 commit comments