@@ -7991,46 +7991,55 @@ bool swift::diagnoseNonSendableFromDeinit(
7991
7991
}
7992
7992
7993
7993
std::optional<ActorIsolation> ProtocolConformance::getRawIsolation () const {
7994
+ // Only normal protocol conformances can be isolated.
7995
+ auto rootNormal =
7996
+ dyn_cast<NormalProtocolConformance>(this ->getRootConformance ());
7997
+ if (!rootNormal)
7998
+ return ActorIsolation::forNonisolated (false );
7999
+
8000
+ if (this != rootNormal)
8001
+ return rootNormal->getRawIsolation ();
8002
+
7994
8003
ASTContext &ctx = getDeclContext ()->getASTContext ();
7995
- auto conformance = const_cast <ProtocolConformance *>(this );
8004
+ auto conformance = const_cast <NormalProtocolConformance *>(rootNormal );
7996
8005
return evaluateOrDefault (
7997
8006
ctx.evaluator , RawConformanceIsolationRequest{conformance},
7998
8007
ActorIsolation ());
7999
8008
}
8000
8009
8001
8010
ActorIsolation ProtocolConformance::getIsolation () const {
8011
+ // Only normal protocol conformances can be isolated.
8012
+ auto rootNormal =
8013
+ dyn_cast<NormalProtocolConformance>(this ->getRootConformance ());
8014
+ if (!rootNormal)
8015
+ return ActorIsolation::forNonisolated (false );
8016
+
8017
+ if (this != rootNormal)
8018
+ return rootNormal->getIsolation ();
8019
+
8002
8020
ASTContext &ctx = getDeclContext ()->getASTContext ();
8003
- auto conformance = const_cast <ProtocolConformance *>(this );
8021
+ auto conformance = const_cast <NormalProtocolConformance *>(rootNormal );
8004
8022
return evaluateOrDefault (
8005
8023
ctx.evaluator , ConformanceIsolationRequest{conformance},
8006
8024
ActorIsolation ());
8007
8025
}
8008
8026
8009
8027
std::optional<ActorIsolation>
8010
8028
RawConformanceIsolationRequest::evaluate (
8011
- Evaluator &evaluator, ProtocolConformance *conformance
8029
+ Evaluator &evaluator, NormalProtocolConformance *conformance
8012
8030
) const {
8013
- // Only normal protocol conformances can be isolated.
8014
- auto rootNormal =
8015
- dyn_cast<NormalProtocolConformance>(conformance->getRootConformance ());
8016
- if (!rootNormal)
8017
- return ActorIsolation::forNonisolated (false );
8018
-
8019
- if (conformance != rootNormal)
8020
- return rootNormal->getRawIsolation ();
8021
-
8022
8031
// If the conformance is explicitly non-isolated, report that.
8023
- if (rootNormal ->getOptions ().contains (ProtocolConformanceFlags::Nonisolated))
8032
+ if (conformance ->getOptions ().contains (ProtocolConformanceFlags::Nonisolated))
8024
8033
return ActorIsolation::forNonisolated (false );
8025
8034
8026
8035
// If there is an explicitly-specified global actor on the isolation,
8027
8036
// resolve it and report it.
8028
- if (auto globalActorTypeExpr = rootNormal ->getExplicitGlobalActorIsolation ()) {
8037
+ if (auto globalActorTypeExpr = conformance ->getExplicitGlobalActorIsolation ()) {
8029
8038
// If we don't already have a resolved global actor type, resolve it now.
8030
8039
Type globalActorType = globalActorTypeExpr->getInstanceType ();
8031
8040
if (!globalActorType) {
8032
8041
const auto resolution = TypeResolution::forInterface (
8033
- rootNormal ->getDeclContext (), std::nullopt,
8042
+ conformance ->getDeclContext (), std::nullopt,
8034
8043
/* unboundTyOpener*/ nullptr ,
8035
8044
/* placeholderHandler*/ nullptr ,
8036
8045
/* packElementOpener*/ nullptr );
@@ -8048,9 +8057,9 @@ RawConformanceIsolationRequest::evaluate(
8048
8057
return ActorIsolation::forGlobalActor (globalActorType);
8049
8058
}
8050
8059
8051
- auto dc = rootNormal ->getDeclContext ();
8060
+ auto dc = conformance ->getDeclContext ();
8052
8061
ASTContext &ctx = dc->getASTContext ();
8053
- auto proto = rootNormal ->getProtocol ();
8062
+ auto proto = conformance ->getProtocol ();
8054
8063
8055
8064
// If the protocol itself is isolated, don't infer isolation for the
8056
8065
// conformance.
@@ -8064,7 +8073,7 @@ RawConformanceIsolationRequest::evaluate(
8064
8073
return ActorIsolation::forNonisolated (false );
8065
8074
8066
8075
// @preconcurrency disables isolation inference.
8067
- if (rootNormal ->isPreconcurrency ())
8076
+ if (conformance ->isPreconcurrency ())
8068
8077
return ActorIsolation::forNonisolated (false );
8069
8078
8070
8079
return std::nullopt;
@@ -8129,25 +8138,15 @@ ActorIsolation swift::inferConformanceIsolation(
8129
8138
8130
8139
ActorIsolation
8131
8140
ConformanceIsolationRequest::evaluate (
8132
- Evaluator &evaluator, ProtocolConformance *conformance
8141
+ Evaluator &evaluator, NormalProtocolConformance *conformance
8133
8142
) const {
8134
8143
// If there is raw isolation, use that.
8135
8144
if (auto rawIsolation = conformance->getRawIsolation ())
8136
8145
return *rawIsolation;
8137
8146
8138
8147
// Otherwise, we may infer isolation.
8139
-
8140
- // Only normal protocol conformances can be isolated.
8141
- auto rootNormal =
8142
- dyn_cast<NormalProtocolConformance>(conformance->getRootConformance ());
8143
- if (!rootNormal)
8144
- return ActorIsolation::forNonisolated (false );
8145
-
8146
- if (conformance != rootNormal)
8147
- return rootNormal->getIsolation ();
8148
-
8149
8148
return inferConformanceIsolation (
8150
- rootNormal , /* hasKnownIsolatedWitness=*/ false );
8149
+ conformance , /* hasKnownIsolatedWitness=*/ false );
8151
8150
}
8152
8151
8153
8152
namespace {
0 commit comments