RequirementMachine: Don't filter out unavailable Sendable conformance if allowMissing=true

Fixes rdar://problem/94456989.
This commit is contained in:
Slava Pestov
2022-06-22 00:38:55 -04:00
parent 02e5e550b0
commit cd118ea19b
3 changed files with 35 additions and 2 deletions

View File

@@ -399,7 +399,8 @@ ConcreteContraction::substRequirement(const Requirement &req) const {
auto conformance = module->lookupConformance(substFirstType, proto,
allowMissing);
if (proto->isSpecificProtocol(KnownProtocolKind::Sendable) &&
if (!allowMissing &&
proto->isSpecificProtocol(KnownProtocolKind::Sendable) &&
conformance.hasUnavailableConformance()) {
conformance = ProtocolConformanceRef::forInvalid();
}

View File

@@ -156,7 +156,8 @@ void PropertyMap::concretizeNestedTypesFromConcreteParent(
auto conformance = module->lookupConformance(concreteType,
const_cast<ProtocolDecl *>(proto),
allowMissing);
if (proto->isSpecificProtocol(KnownProtocolKind::Sendable) &&
if (!allowMissing &&
proto->isSpecificProtocol(KnownProtocolKind::Sendable) &&
conformance.hasUnavailableConformance()) {
conformance = ProtocolConformanceRef::forInvalid();
}

View File

@@ -0,0 +1,31 @@
// RUN: %target-typecheck-verify-swift
// Conditional conformance edge case. If a type conforms to Sendable
// conditionally, allow some of those conditional requirements to
// reference unavailable Sendable conformances when allowMissing=true.
class ConditionalC {}
@available(*, unavailable)
extension ConditionalC : Sendable {}
struct ConditionalG<T> {}
extension ConditionalG : Sendable where T : Sendable {}
// Strict concurrency checking should reject this since the inherited
// conformance to Sendable has an unsatisfied conditional requirement.
protocol ConditionalDerived : Sendable {}
extension ConditionalG : ConditionalDerived {}
protocol ConditionalP {
associatedtype Value: ConditionalDerived
}
// Value is concretized via a conditional conformance of
// ConditionalG<ConditionalC> to Sendable.
//
// The conditional requirement ConditionalC: Sendable is satisfied
// by an unavailable conformance. But we still allow it in this case.
extension ConditionalP where Value == ConditionalG<ConditionalC> {}