@@ -4458,17 +4458,21 @@ namespace {
4458
4458
}
4459
4459
4460
4460
// Attempt to resolve the global actor type of a closure.
4461
- Type resolveGlobalActorType (ClosureExpr *closure ) {
4461
+ Type resolveGlobalActorType (AbstractClosureExpr *ACE ) {
4462
4462
// Check whether the closure's type has a global actor already.
4463
- if (Type closureType = getType (closure )) {
4463
+ if (Type closureType = getType (ACE )) {
4464
4464
if (auto closureFnType = closureType->getAs <FunctionType>()) {
4465
4465
if (Type globalActor = closureFnType->getGlobalActor ())
4466
4466
return globalActor;
4467
4467
}
4468
4468
}
4469
4469
4470
4470
// 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 ();
4472
4476
}
4473
4477
4474
4478
public:
@@ -4480,14 +4484,16 @@ namespace {
4480
4484
AbstractClosureExpr *closure) {
4481
4485
bool preconcurrency = false ;
4482
4486
4483
- if (auto explicitClosure = dyn_cast<ClosureExpr>(closure)) {
4487
+ if (auto explicitClosure = dyn_cast<ClosureExpr>(closure))
4484
4488
preconcurrency = explicitClosure->isIsolatedByPreconcurrency ();
4485
4489
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
+ }
4490
4495
4496
+ if (auto *explicitClosure = dyn_cast<ClosureExpr>(closure)) {
4491
4497
if (auto *attr =
4492
4498
explicitClosure->getAttrs ().getAttribute <NonisolatedAttr>();
4493
4499
attr && ctx.LangOpts .hasFeature (Feature::ClosureIsolation)) {
0 commit comments