Skip to content

Commit ce45f27

Browse files
committed
Only look through explicit conformances.
Explanation: do not let global from implied conformances influence the isolation of the conforming type. The overall isolation should be only computed from the explicit conformances to enable global actor cut off with 'nonisolated' on protocols.
1 parent 5143a40 commit ce45f27

File tree

1 file changed

+4
-20
lines changed

1 file changed

+4
-20
lines changed

lib/Sema/TypeCheckConcurrency.cpp

Lines changed: 4 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5167,7 +5167,7 @@ getIsolationFromConformances(NominalTypeDecl *nominal) {
51675167

51685168
std::optional<InferredActorIsolation> foundIsolation;
51695169
for (auto conformance :
5170-
nominal->getLocalConformances(ConformanceLookupKind::NonStructural)) {
5170+
nominal->getLocalConformances(ConformanceLookupKind::OnlyExplicit)) {
51715171

51725172
// Don't include inherited conformances. If a conformance is inherited
51735173
// from a superclass, the isolation of the subclass should be inferred
@@ -5184,35 +5184,19 @@ getIsolationFromConformances(NominalTypeDecl *nominal) {
51845184
}
51855185

51865186
auto *proto = conformance->getProtocol();
5187-
auto inferredIsolation = getInferredActorIsolation(proto);
5188-
auto protoIsolation = inferredIsolation.isolation;
5189-
switch (protoIsolation) {
5187+
switch (auto protoIsolation = getActorIsolation(proto)) {
51905188
case ActorIsolation::ActorInstance:
51915189
case ActorIsolation::Unspecified:
5190+
case ActorIsolation::Nonisolated:
51925191
case ActorIsolation::CallerIsolationInheriting:
51935192
case ActorIsolation::NonisolatedUnsafe:
51945193
break;
5195-
case ActorIsolation::Nonisolated:
5196-
if (inferredIsolation.source.kind == IsolationSource::Kind::Explicit) {
5197-
if (!foundIsolation) {
5198-
// We found an explicitly 'nonisolated' protocol.
5199-
foundIsolation = {
5200-
protoIsolation,
5201-
IsolationSource(proto, IsolationSource::Conformance)};
5202-
}
5203-
continue;
5204-
} else {
5205-
break;
5206-
}
52075194

52085195
case ActorIsolation::Erased:
52095196
llvm_unreachable("protocol cannot have erased isolation");
52105197

52115198
case ActorIsolation::GlobalActor:
5212-
// If we encountered an explicit globally isolated conformance, allow it
5213-
// to override the nonisolated isolation kind.
5214-
if (!foundIsolation ||
5215-
conformance->getSourceKind() == ConformanceEntryKind::Explicit) {
5199+
if (!foundIsolation) {
52165200
foundIsolation = {
52175201
protoIsolation,
52185202
IsolationSource(proto, IsolationSource::Conformance)

0 commit comments

Comments
 (0)