Skip to content

Commit 519839c

Browse files
authored
Merge pull request #59632 from slavapestov/rqm-allow-missing-unavailable
RequirementMachine: Don't filter out unavailable Sendable conformance if allowMissing=true
2 parents 05dcba1 + b7b4f41 commit 519839c

File tree

4 files changed

+37
-3
lines changed

4 files changed

+37
-3
lines changed

lib/AST/ProtocolConformance.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -873,7 +873,8 @@ void NormalProtocolConformance::finishSignatureConformances() {
873873
if (substTy->hasTypeParameter())
874874
substTy = getDeclContext()->mapTypeIntoContext(substTy);
875875

876-
reqConformances.push_back(module->lookupConformance(substTy, reqProto)
876+
reqConformances.push_back(module->lookupConformance(substTy, reqProto,
877+
/*allowMissing=*/true)
877878
.mapConformanceOutOfContext());
878879
}
879880
setSignatureConformances(reqConformances);

lib/AST/RequirementMachine/ConcreteContraction.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -399,7 +399,8 @@ ConcreteContraction::substRequirement(const Requirement &req) const {
399399
auto conformance = module->lookupConformance(substFirstType, proto,
400400
allowMissing);
401401

402-
if (proto->isSpecificProtocol(KnownProtocolKind::Sendable) &&
402+
if (!allowMissing &&
403+
proto->isSpecificProtocol(KnownProtocolKind::Sendable) &&
403404
conformance.hasUnavailableConformance()) {
404405
conformance = ProtocolConformanceRef::forInvalid();
405406
}

lib/AST/RequirementMachine/ConcreteTypeWitness.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,8 @@ void PropertyMap::concretizeNestedTypesFromConcreteParent(
156156
auto conformance = module->lookupConformance(concreteType,
157157
const_cast<ProtocolDecl *>(proto),
158158
allowMissing);
159-
if (proto->isSpecificProtocol(KnownProtocolKind::Sendable) &&
159+
if (!allowMissing &&
160+
proto->isSpecificProtocol(KnownProtocolKind::Sendable) &&
160161
conformance.hasUnavailableConformance()) {
161162
conformance = ProtocolConformanceRef::forInvalid();
162163
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
// RUN: %target-typecheck-verify-swift
2+
3+
// Conditional conformance edge case. If a type conforms to Sendable
4+
// conditionally, allow some of those conditional requirements to
5+
// reference unavailable Sendable conformances when allowMissing=true.
6+
7+
class ConditionalC {}
8+
9+
@available(*, unavailable)
10+
extension ConditionalC : Sendable {}
11+
12+
struct ConditionalG<T> {}
13+
14+
extension ConditionalG : Sendable where T : Sendable {}
15+
16+
// Strict concurrency checking should reject this since the inherited
17+
// conformance to Sendable has an unsatisfied conditional requirement.
18+
protocol ConditionalDerived : Sendable {}
19+
20+
extension ConditionalG : ConditionalDerived {}
21+
22+
protocol ConditionalP {
23+
associatedtype Value: ConditionalDerived
24+
}
25+
26+
// Value is concretized via a conditional conformance of
27+
// ConditionalG<ConditionalC> to Sendable.
28+
//
29+
// The conditional requirement ConditionalC: Sendable is satisfied
30+
// by an unavailable conformance. But we still allow it in this case.
31+
extension ConditionalP where Value == ConditionalG<ConditionalC> {}

0 commit comments

Comments
 (0)