@@ -7991,46 +7991,55 @@ bool swift::diagnoseNonSendableFromDeinit(
79917991}
79927992
79937993std::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+
79948003 ASTContext &ctx = getDeclContext ()->getASTContext ();
7995- auto conformance = const_cast <ProtocolConformance *>(this );
8004+ auto conformance = const_cast <NormalProtocolConformance *>(rootNormal );
79968005 return evaluateOrDefault (
79978006 ctx.evaluator , RawConformanceIsolationRequest{conformance},
79988007 ActorIsolation ());
79998008}
80008009
80018010ActorIsolation 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+
80028020 ASTContext &ctx = getDeclContext ()->getASTContext ();
8003- auto conformance = const_cast <ProtocolConformance *>(this );
8021+ auto conformance = const_cast <NormalProtocolConformance *>(rootNormal );
80048022 return evaluateOrDefault (
80058023 ctx.evaluator , ConformanceIsolationRequest{conformance},
80068024 ActorIsolation ());
80078025}
80088026
80098027std::optional<ActorIsolation>
80108028RawConformanceIsolationRequest::evaluate (
8011- Evaluator &evaluator, ProtocolConformance *conformance
8029+ Evaluator &evaluator, NormalProtocolConformance *conformance
80128030) 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-
80228031 // If the conformance is explicitly non-isolated, report that.
8023- if (rootNormal ->getOptions ().contains (ProtocolConformanceFlags::Nonisolated))
8032+ if (conformance ->getOptions ().contains (ProtocolConformanceFlags::Nonisolated))
80248033 return ActorIsolation::forNonisolated (false );
80258034
80268035 // If there is an explicitly-specified global actor on the isolation,
80278036 // resolve it and report it.
8028- if (auto globalActorTypeExpr = rootNormal ->getExplicitGlobalActorIsolation ()) {
8037+ if (auto globalActorTypeExpr = conformance ->getExplicitGlobalActorIsolation ()) {
80298038 // If we don't already have a resolved global actor type, resolve it now.
80308039 Type globalActorType = globalActorTypeExpr->getInstanceType ();
80318040 if (!globalActorType) {
80328041 const auto resolution = TypeResolution::forInterface (
8033- rootNormal ->getDeclContext (), std::nullopt ,
8042+ conformance ->getDeclContext (), std::nullopt ,
80348043 /* unboundTyOpener*/ nullptr ,
80358044 /* placeholderHandler*/ nullptr ,
80368045 /* packElementOpener*/ nullptr );
@@ -8048,9 +8057,9 @@ RawConformanceIsolationRequest::evaluate(
80488057 return ActorIsolation::forGlobalActor (globalActorType);
80498058 }
80508059
8051- auto dc = rootNormal ->getDeclContext ();
8060+ auto dc = conformance ->getDeclContext ();
80528061 ASTContext &ctx = dc->getASTContext ();
8053- auto proto = rootNormal ->getProtocol ();
8062+ auto proto = conformance ->getProtocol ();
80548063
80558064 // If the protocol itself is isolated, don't infer isolation for the
80568065 // conformance.
@@ -8064,7 +8073,7 @@ RawConformanceIsolationRequest::evaluate(
80648073 return ActorIsolation::forNonisolated (false );
80658074
80668075 // @preconcurrency disables isolation inference.
8067- if (rootNormal ->isPreconcurrency ())
8076+ if (conformance ->isPreconcurrency ())
80688077 return ActorIsolation::forNonisolated (false );
80698078
80708079 return std::nullopt ;
@@ -8129,25 +8138,15 @@ ActorIsolation swift::inferConformanceIsolation(
81298138
81308139ActorIsolation
81318140ConformanceIsolationRequest::evaluate (
8132- Evaluator &evaluator, ProtocolConformance *conformance
8141+ Evaluator &evaluator, NormalProtocolConformance *conformance
81338142) const {
81348143 // If there is raw isolation, use that.
81358144 if (auto rawIsolation = conformance->getRawIsolation ())
81368145 return *rawIsolation;
81378146
81388147 // 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-
81498148 return inferConformanceIsolation (
8150- rootNormal , /* hasKnownIsolatedWitness=*/ false );
8149+ conformance , /* hasKnownIsolatedWitness=*/ false );
81518150}
81528151
81538152namespace {
0 commit comments