@@ -5529,82 +5529,6 @@ static void addAttributesForActorIsolation(ValueDecl *value,
5529
5529
}
5530
5530
}
5531
5531
5532
- // / Determine the default isolation and isolation source for this declaration,
5533
- // / which may still be overridden by other inference rules.
5534
- static std::tuple<InferredActorIsolation, ValueDecl *,
5535
- std::optional<ActorIsolation>>
5536
- computeDefaultInferredActorIsolation (ValueDecl *value) {
5537
- auto &ctx = value->getASTContext ();
5538
-
5539
- // If we are supposed to infer main actor isolation by default for entities
5540
- // within our module, make our default isolation main actor.
5541
- if (ctx.LangOpts .hasFeature (Feature::UnspecifiedMeansMainActorIsolated) &&
5542
- value->getModuleContext () == ctx.MainModule ) {
5543
-
5544
- // Default global actor isolation does not apply to any declarations
5545
- // within actors and distributed actors.
5546
- bool inActorContext = false ;
5547
- auto *dc = value->getInnermostDeclContext ();
5548
- while (dc && !inActorContext) {
5549
- if (auto *nominal = dc->getSelfNominalTypeDecl ()) {
5550
- inActorContext = nominal->isAnyActor ();
5551
- }
5552
- dc = dc->getParent ();
5553
- }
5554
-
5555
- if (!inActorContext) {
5556
- // FIXME: deinit should be implicitly MainActor too.
5557
- if (isa<TypeDecl>(value) || isa<ExtensionDecl>(value) ||
5558
- isa<AbstractStorageDecl>(value) || isa<FuncDecl>(value) ||
5559
- isa<ConstructorDecl>(value)) {
5560
- return {{ActorIsolation::forMainActor (ctx), {}}, nullptr , {}};
5561
- }
5562
- }
5563
- }
5564
-
5565
- // If we have an async function... by default we inherit isolation.
5566
- if (ctx.LangOpts .hasFeature (
5567
- Feature::NonIsolatedAsyncInheritsIsolationFromContext)) {
5568
- if (auto *func = dyn_cast<AbstractFunctionDecl>(value);
5569
- func && func->hasAsync () &&
5570
- func->getModuleContext () == ctx.MainModule ) {
5571
- return {{ActorIsolation::forNonisolated (false /* is unsafe*/ ), {}},
5572
- nullptr ,
5573
- {}};
5574
- }
5575
- }
5576
-
5577
- if (auto func = dyn_cast<AbstractFunctionDecl>(value)) {
5578
- // A @Sendable function is assumed to be actor-independent.
5579
- if (func->isSendable ()) {
5580
- return {
5581
- {ActorIsolation::forConcurrent (/* unsafe=*/ false ), {}}, nullptr , {}};
5582
- }
5583
- }
5584
-
5585
- // When no other isolation applies, an actor's non-async init is independent
5586
- if (auto nominal = value->getDeclContext ()->getSelfNominalTypeDecl ())
5587
- if (nominal->isAnyActor ())
5588
- if (auto ctor = dyn_cast<ConstructorDecl>(value))
5589
- if (!ctor->hasAsync ())
5590
- return {{ActorIsolation::forConcurrent (/* unsafe=*/ false ), {}},
5591
- nullptr ,
5592
- {}};
5593
-
5594
- // Look for and remember the overridden declaration's isolation.
5595
- if (auto *overriddenValue = value->getOverriddenDeclOrSuperDeinit ()) {
5596
- // Use the overridden decl's iso as the default isolation for this decl.
5597
- auto isolation = getOverriddenIsolationFor (value);
5598
- return {{isolation,
5599
- IsolationSource (overriddenValue, IsolationSource::Override)},
5600
- overriddenValue,
5601
- isolation};
5602
- }
5603
-
5604
- // We did not find anything special, return unspecified.
5605
- return {{ActorIsolation::forUnspecified (), {}}, nullptr , {}};
5606
- }
5607
-
5608
5532
InferredActorIsolation ActorIsolationRequest::evaluate (
5609
5533
Evaluator &evaluator, ValueDecl *value) const {
5610
5534
// If this declaration has actor-isolated "self", it's isolated to that
@@ -5648,7 +5572,7 @@ InferredActorIsolation ActorIsolationRequest::evaluate(
5648
5572
value->getAttrs ().add (preconcurrency);
5649
5573
}
5650
5574
5651
- if (auto *fd = dyn_cast<FuncDecl>(value)) {
5575
+ if (FuncDecl *fd = dyn_cast<FuncDecl>(value)) {
5652
5576
// Main.main() and Main.$main are implicitly MainActor-protected.
5653
5577
// Any other isolation is an error.
5654
5578
std::optional<ActorIsolation> mainIsolation =
@@ -5681,11 +5605,74 @@ InferredActorIsolation ActorIsolationRequest::evaluate(
5681
5605
IsolationSource (/* source*/ nullptr , IsolationSource::Explicit)};
5682
5606
}
5683
5607
5684
- InferredActorIsolation defaultIsolation;
5685
- ValueDecl *overriddenValue;
5686
- std::optional<ActorIsolation> overriddenIsolation;
5687
- std::tie (defaultIsolation, overriddenValue, overriddenIsolation) =
5688
- computeDefaultInferredActorIsolation (value);
5608
+ // Determine the default isolation for this declaration, which may still be
5609
+ // overridden by other inference rules.
5610
+ ActorIsolation defaultIsolation = ActorIsolation::forUnspecified ();
5611
+ IsolationSource defaultIsolationSource;
5612
+
5613
+ // If we are supposed to infer main actor isolation by default for entities
5614
+ // within our module, make our default isolation main actor.
5615
+ if (ctx.LangOpts .hasFeature (Feature::UnspecifiedMeansMainActorIsolated) &&
5616
+ value->getModuleContext () == ctx.MainModule ) {
5617
+
5618
+ // Default global actor isolation does not apply to any declarations
5619
+ // within actors and distributed actors.
5620
+ bool inActorContext = false ;
5621
+ auto *dc = value->getInnermostDeclContext ();
5622
+ while (dc && !inActorContext) {
5623
+ if (auto *nominal = dc->getSelfNominalTypeDecl ()) {
5624
+ inActorContext = nominal->isAnyActor ();
5625
+ }
5626
+ dc = dc->getParent ();
5627
+ }
5628
+
5629
+ if (!inActorContext) {
5630
+ // FIXME: deinit should be implicitly MainActor too.
5631
+ if (isa<TypeDecl>(value) || isa<ExtensionDecl>(value) ||
5632
+ isa<AbstractStorageDecl>(value) || isa<FuncDecl>(value) ||
5633
+ isa<ConstructorDecl>(value)) {
5634
+ defaultIsolation = ActorIsolation::forMainActor (ctx);
5635
+ }
5636
+ }
5637
+ }
5638
+
5639
+ // If we have an async function... by default we inherit isolation.
5640
+ if (ctx.LangOpts .hasFeature (
5641
+ Feature::NonIsolatedAsyncInheritsIsolationFromContext)) {
5642
+ if (auto *func = dyn_cast<AbstractFunctionDecl>(value);
5643
+ func && func->hasAsync () &&
5644
+ func->getModuleContext () == ctx.MainModule ) {
5645
+ defaultIsolation = ActorIsolation::forNonisolated (false /* is unsafe*/ );
5646
+ }
5647
+ }
5648
+
5649
+ if (auto func = dyn_cast<AbstractFunctionDecl>(value)) {
5650
+ // A @Sendable function is assumed to be actor-independent.
5651
+ if (func->isSendable ()) {
5652
+ defaultIsolation = ActorIsolation::forConcurrent (/* unsafe=*/ false );
5653
+ }
5654
+ }
5655
+
5656
+ // When no other isolation applies, an actor's non-async init is independent
5657
+ if (auto nominal = value->getDeclContext ()->getSelfNominalTypeDecl ())
5658
+ if (nominal->isAnyActor ())
5659
+ if (auto ctor = dyn_cast<ConstructorDecl>(value))
5660
+ if (!ctor->hasAsync ())
5661
+ defaultIsolation = ActorIsolation::forConcurrent (/* unsafe=*/ false );
5662
+
5663
+ // Look for and remember the overridden declaration's isolation.
5664
+ std::optional<ActorIsolation> overriddenIso;
5665
+ ValueDecl *overriddenValue = value->getOverriddenDeclOrSuperDeinit ();
5666
+ if (overriddenValue) {
5667
+ // use the overridden decl's iso as the default isolation for this decl.
5668
+ defaultIsolation = getOverriddenIsolationFor (value);
5669
+ defaultIsolationSource =
5670
+ IsolationSource (overriddenValue, IsolationSource::Override);
5671
+ overriddenIso = defaultIsolation;
5672
+ }
5673
+
5674
+ // NOTE: After this point, the default has been set. Only touch the default
5675
+ // isolation above this point since code below assumes it is now constant.
5689
5676
5690
5677
// Function used when returning an inferred isolation.
5691
5678
auto inferredIsolation = [&](ActorIsolation inferred,
@@ -5696,17 +5683,16 @@ InferredActorIsolation ActorIsolationRequest::evaluate(
5696
5683
// if the inferred isolation is not valid, then carry-over the overridden
5697
5684
// declaration's isolation as this decl's inferred isolation.
5698
5685
switch (validOverrideIsolation (value, inferred, overriddenValue,
5699
- *overriddenIsolation )) {
5686
+ *overriddenIso )) {
5700
5687
case OverrideIsolationResult::Allowed:
5701
5688
case OverrideIsolationResult::Sendable:
5702
5689
break ;
5703
5690
5704
5691
case OverrideIsolationResult::Disallowed:
5705
- if (overriddenValue->hasClangNode () &&
5706
- overriddenIsolation->isUnspecified ()) {
5707
- inferred = overriddenIsolation->withPreconcurrency (true );
5692
+ if (overriddenValue->hasClangNode () && overriddenIso->isUnspecified ()) {
5693
+ inferred = overriddenIso->withPreconcurrency (true );
5708
5694
} else {
5709
- inferred = *overriddenIsolation ;
5695
+ inferred = *overriddenIso ;
5710
5696
}
5711
5697
break ;
5712
5698
}
@@ -5965,7 +5951,7 @@ InferredActorIsolation ActorIsolationRequest::evaluate(
5965
5951
}
5966
5952
5967
5953
// Default isolation for this member.
5968
- return defaultIsolation;
5954
+ return { defaultIsolation, defaultIsolationSource} ;
5969
5955
}
5970
5956
5971
5957
bool HasIsolatedSelfRequest::evaluate (
0 commit comments