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