@@ -4458,17 +4458,21 @@ namespace {
44584458 }
44594459
44604460 // Attempt to resolve the global actor type of a closure.
4461- Type resolveGlobalActorType (ClosureExpr *closure ) {
4461+ Type resolveGlobalActorType (AbstractClosureExpr *ACE ) {
44624462 // Check whether the closure's type has a global actor already.
4463- if (Type closureType = getType (closure )) {
4463+ if (Type closureType = getType (ACE )) {
44644464 if (auto closureFnType = closureType->getAs <FunctionType>()) {
44654465 if (Type globalActor = closureFnType->getGlobalActor ())
44664466 return globalActor;
44674467 }
44684468 }
44694469
44704470 // Look for an explicit attribute.
4471- return getExplicitGlobalActor (closure);
4471+ if (auto *CE = dyn_cast<ClosureExpr>(ACE)) {
4472+ if (auto globalActor = getExplicitGlobalActor (CE))
4473+ return globalActor;
4474+ }
4475+ return Type ();
44724476 }
44734477
44744478 public:
@@ -4480,14 +4484,16 @@ namespace {
44804484 AbstractClosureExpr *closure) {
44814485 bool preconcurrency = false ;
44824486
4483- if (auto explicitClosure = dyn_cast<ClosureExpr>(closure)) {
4487+ if (auto explicitClosure = dyn_cast<ClosureExpr>(closure))
44844488 preconcurrency = explicitClosure->isIsolatedByPreconcurrency ();
44854489
4486- // If the closure specifies a global actor, use it.
4487- if (Type globalActor = resolveGlobalActorType (explicitClosure))
4488- return ActorIsolation::forGlobalActor (globalActor)
4489- .withPreconcurrency (preconcurrency);
4490+ // If the closure specifies a global actor, use it.
4491+ if (Type globalActor = resolveGlobalActorType (closure)) {
4492+ return ActorIsolation::forGlobalActor (globalActor)
4493+ .withPreconcurrency (preconcurrency);
4494+ }
44904495
4496+ if (auto *explicitClosure = dyn_cast<ClosureExpr>(closure)) {
44914497 if (auto *attr =
44924498 explicitClosure->getAttrs ().getAttribute <NonisolatedAttr>();
44934499 attr && ctx.LangOpts .hasFeature (Feature::ClosureIsolation)) {
0 commit comments