mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
RequirementMachine: Don't filter out unavailable Sendable conformance if allowMissing=true
Fixes rdar://problem/94456989.
This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
31
test/Generics/conditional_conformance_sendable.swift
Normal file
31
test/Generics/conditional_conformance_sendable.swift
Normal 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> {}
|
||||
Reference in New Issue
Block a user