@@ -7979,46 +7979,55 @@ bool swift::diagnoseNonSendableFromDeinit(
79797979}
79807980
79817981std::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+
79827991 ASTContext &ctx = getDeclContext ()->getASTContext ();
7983- auto conformance = const_cast <ProtocolConformance *>(this );
7992+ auto conformance = const_cast <NormalProtocolConformance *>(rootNormal );
79847993 return evaluateOrDefault (
79857994 ctx.evaluator , RawConformanceIsolationRequest{conformance},
79867995 ActorIsolation ());
79877996}
79887997
79897998ActorIsolation 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+
79908008 ASTContext &ctx = getDeclContext ()->getASTContext ();
7991- auto conformance = const_cast <ProtocolConformance *>(this );
8009+ auto conformance = const_cast <NormalProtocolConformance *>(rootNormal );
79928010 return evaluateOrDefault (
79938011 ctx.evaluator , ConformanceIsolationRequest{conformance},
79948012 ActorIsolation ());
79958013}
79968014
79978015std::optional<ActorIsolation>
79988016RawConformanceIsolationRequest::evaluate (
7999- Evaluator &evaluator, ProtocolConformance *conformance
8017+ Evaluator &evaluator, NormalProtocolConformance *conformance
80008018) 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-
80108019 // If the conformance is explicitly non-isolated, report that.
8011- if (rootNormal ->getOptions ().contains (ProtocolConformanceFlags::Nonisolated))
8020+ if (conformance ->getOptions ().contains (ProtocolConformanceFlags::Nonisolated))
80128021 return ActorIsolation::forNonisolated (false );
80138022
80148023 // If there is an explicitly-specified global actor on the isolation,
80158024 // resolve it and report it.
8016- if (auto globalActorTypeExpr = rootNormal ->getExplicitGlobalActorIsolation ()) {
8025+ if (auto globalActorTypeExpr = conformance ->getExplicitGlobalActorIsolation ()) {
80178026 // If we don't already have a resolved global actor type, resolve it now.
80188027 Type globalActorType = globalActorTypeExpr->getInstanceType ();
80198028 if (!globalActorType) {
80208029 const auto resolution = TypeResolution::forInterface (
8021- rootNormal ->getDeclContext (), std::nullopt ,
8030+ conformance ->getDeclContext (), std::nullopt ,
80228031 /* unboundTyOpener*/ nullptr ,
80238032 /* placeholderHandler*/ nullptr ,
80248033 /* packElementOpener*/ nullptr );
@@ -8036,9 +8045,9 @@ RawConformanceIsolationRequest::evaluate(
80368045 return ActorIsolation::forGlobalActor (globalActorType);
80378046 }
80388047
8039- auto dc = rootNormal ->getDeclContext ();
8048+ auto dc = conformance ->getDeclContext ();
80408049 ASTContext &ctx = dc->getASTContext ();
8041- auto proto = rootNormal ->getProtocol ();
8050+ auto proto = conformance ->getProtocol ();
80428051
80438052 // If the protocol itself is isolated, don't infer isolation for the
80448053 // conformance.
@@ -8052,7 +8061,7 @@ RawConformanceIsolationRequest::evaluate(
80528061 return ActorIsolation::forNonisolated (false );
80538062
80548063 // @preconcurrency disables isolation inference.
8055- if (rootNormal ->isPreconcurrency ())
8064+ if (conformance ->isPreconcurrency ())
80568065 return ActorIsolation::forNonisolated (false );
80578066
80588067 return std::nullopt ;
@@ -8117,25 +8126,15 @@ ActorIsolation swift::inferConformanceIsolation(
81178126
81188127ActorIsolation
81198128ConformanceIsolationRequest::evaluate (
8120- Evaluator &evaluator, ProtocolConformance *conformance
8129+ Evaluator &evaluator, NormalProtocolConformance *conformance
81218130) const {
81228131 // If there is raw isolation, use that.
81238132 if (auto rawIsolation = conformance->getRawIsolation ())
81248133 return *rawIsolation;
81258134
81268135 // 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-
81378136 return inferConformanceIsolation (
8138- rootNormal , /* hasKnownIsolatedWitness=*/ false );
8137+ conformance , /* hasKnownIsolatedWitness=*/ false );
81398138}
81408139
81418140namespace {
0 commit comments