@@ -496,7 +496,8 @@ Type swift::getExplicitGlobalActor(ClosureExpr *closure) {
496
496
// / nonisolated or it is accessed from within the same module.
497
497
static bool varIsSafeAcrossActors (const ModuleDecl *fromModule,
498
498
VarDecl *var,
499
- const ActorIsolation &varIsolation) {
499
+ const ActorIsolation &varIsolation,
500
+ ActorReferenceResult::Options &options) {
500
501
// must be immutable
501
502
if (!var->isLet ())
502
503
return false ;
@@ -517,8 +518,12 @@ static bool varIsSafeAcrossActors(const ModuleDecl *fromModule,
517
518
518
519
// Static 'let's are initialized upon first access, so they cannot be
519
520
// synchronously accessed across actors.
520
- if (var->isGlobalStorage () && var->isLazilyInitializedGlobal ())
521
+ if (var->isGlobalStorage () && var->isLazilyInitializedGlobal ()) {
522
+ // Compiler versions <= 5.9 accepted this code, so downgrade to a
523
+ // warning prior to Swift 6.
524
+ options = ActorReferenceResult::Flags::Preconcurrency;
521
525
return false ;
526
+ }
522
527
523
528
// If it's distributed, generally variable access is not okay...
524
529
if (auto nominalParent = var->getDeclContext ()->getSelfNominalTypeDecl ()) {
@@ -534,7 +539,8 @@ static bool varIsSafeAcrossActors(const ModuleDecl *fromModule,
534
539
bool swift::isLetAccessibleAnywhere (const ModuleDecl *fromModule,
535
540
VarDecl *let) {
536
541
auto isolation = getActorIsolation (let);
537
- return varIsSafeAcrossActors (fromModule, let, isolation);
542
+ ActorReferenceResult::Options options = llvm::None;
543
+ return varIsSafeAcrossActors (fromModule, let, isolation, options);
538
544
}
539
545
540
546
namespace {
@@ -5814,7 +5820,8 @@ static bool isNonValueReference(const ValueDecl *value) {
5814
5820
5815
5821
bool swift::isAccessibleAcrossActors (
5816
5822
ValueDecl *value, const ActorIsolation &isolation,
5817
- const DeclContext *fromDC, llvm::Optional<ReferencedActor> actorInstance) {
5823
+ const DeclContext *fromDC, ActorReferenceResult::Options &options,
5824
+ llvm::Optional<ReferencedActor> actorInstance) {
5818
5825
// Initializers and enum elements are accessible across actors unless they
5819
5826
// are global-actor qualified.
5820
5827
if (isa<ConstructorDecl>(value) || isa<EnumElementDecl>(value)) {
@@ -5834,12 +5841,22 @@ bool swift::isAccessibleAcrossActors(
5834
5841
// 'let' declarations are immutable, so some of them can be accessed across
5835
5842
// actors.
5836
5843
if (auto var = dyn_cast<VarDecl>(value)) {
5837
- return varIsSafeAcrossActors (fromDC->getParentModule (), var, isolation);
5844
+ return varIsSafeAcrossActors (
5845
+ fromDC->getParentModule (), var, isolation, options);
5838
5846
}
5839
5847
5840
5848
return false ;
5841
5849
}
5842
5850
5851
+ bool swift::isAccessibleAcrossActors (
5852
+ ValueDecl *value, const ActorIsolation &isolation,
5853
+ const DeclContext *fromDC,
5854
+ llvm::Optional<ReferencedActor> actorInstance) {
5855
+ ActorReferenceResult::Options options = llvm::None;
5856
+ return isAccessibleAcrossActors (
5857
+ value, isolation, fromDC, options, actorInstance);
5858
+ }
5859
+
5843
5860
ActorReferenceResult ActorReferenceResult::forSameConcurrencyDomain (
5844
5861
ActorIsolation isolation) {
5845
5862
return ActorReferenceResult{SameConcurrencyDomain, llvm::None, isolation};
@@ -5978,16 +5995,18 @@ ActorReferenceResult ActorReferenceResult::forReference(
5978
5995
(isa<ConstructorDecl>(fromDC) || isa<DestructorDecl>(fromDC)))
5979
5996
return forSameConcurrencyDomain (declIsolation);
5980
5997
5998
+ // Determine what adjustments we need to perform for cross-actor
5999
+ // references.
6000
+ Options options = llvm::None;
6001
+
5981
6002
// At this point, we are accessing the target from outside the actor.
5982
6003
// First, check whether it is something that can be accessed directly,
5983
6004
// without any kind of promotion.
5984
6005
if (isAccessibleAcrossActors (
5985
- declRef.getDecl (), declIsolation, fromDC, actorInstance))
6006
+ declRef.getDecl (), declIsolation, fromDC, options, actorInstance))
5986
6007
return forEntersActor (declIsolation, llvm::None);
5987
6008
5988
- // This is a cross-actor reference, so determine what adjustments we need
5989
- // to perform.
5990
- Options options = llvm::None;
6009
+ // This is a cross-actor reference.
5991
6010
5992
6011
// Note if the reference originates from a @preconcurrency-isolated context.
5993
6012
if (contextIsolation.preconcurrency () || declIsolation.preconcurrency ())
0 commit comments