Skip to content

Commit 7e21eb9

Browse files
committed
Top-level global vars aren't local
Top-level global variables aren't actually local variables. They can have global actors applied to them.
1 parent 9907d24 commit 7e21eb9

File tree

2 files changed

+36
-1
lines changed

2 files changed

+36
-1
lines changed

lib/Sema/TypeCheckConcurrency.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -271,7 +271,7 @@ GlobalActorAttributeRequest::evaluate(
271271
} else if (auto storage = dyn_cast<AbstractStorageDecl>(decl)) {
272272
// Subscripts and properties are fine...
273273
if (auto var = dyn_cast<VarDecl>(storage)) {
274-
if (var->getDeclContext()->isLocalContext()) {
274+
if (var->getDeclContext()->isLocalContext() && !var->isTopLevelGlobal()) {
275275
var->diagnose(diag::global_actor_on_local_variable, var->getName())
276276
.highlight(globalActorAttr->getRangeWithAt());
277277
return None;

test/SILGen/toplevel_globalactorvars.swift

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,3 +74,38 @@ b += 1
7474
// CHECK: [[PE_INT_FUNC:%[0-9]+]] = function_ref @$sSi2peoiyySiz_SitFZ
7575
// CHECK: [[INCREMENTED:%[0-9]+]] = apply [[PE_INT_FUNC]]([[BACCESS]], {{%[0-9]+}}, {{%[0-9]+}})
7676
// CHECK: end_access [[BACCESS]]
77+
78+
79+
// CHECK: bb1:
80+
if #available(SwiftStdlib 5.1, *) {
81+
await print(a)
82+
83+
// CHECK: [[ACTORREF:%[0-9]+]] = begin_borrow {{%[0-9]+}} : $MyActorImpl
84+
// CHECK: [[OLDACTOR:%[0-9]+]] = builtin "getCurrentExecutor"() : $Optional<Builtin.Executor>
85+
// CHECK: hop_to_executor [[ACTORREF]] : $MyActorImpl
86+
// CHECK: [[AACCESS:%[0-9]+]] = begin_access [read] [dynamic] [[AREF]] : $*Int
87+
// CHECK: [[AGLOBAL:%[0-9]+]] = load [trivial] [[AACCESS]] : $*Int
88+
// CHECK: end_access [[AACCESS]]
89+
// CHECK: hop_to_executor [[OLDACTOR]]
90+
// CHECK: end_borrow [[ACTORREF]]
91+
92+
await incrementA()
93+
94+
// CHECK: [[INCREMENTA:%[0-9]+]] = function_ref @$s24toplevel_globalactorvars10incrementAyyF
95+
// CHECK: [[ACTORREF:%[0-9]+]] = begin_borrow {{%[0-9]+}} : $MyActorImpl
96+
// CHECK: [[OLDACTOR:%[0-9]+]] = builtin "getCurrentExecutor"() : $Optional<Builtin.Executor>
97+
// CHECK: hop_to_executor [[ACTORREF]] : $MyActorImpl
98+
// CHECK: {{%[0-9]+}} = apply [[INCREMENTA]]()
99+
// CHECK: hop_to_executor [[OLDACTOR]]
100+
// CHECK: end_borrow [[ACTORREF]]
101+
102+
103+
b += 1
104+
105+
// CHECK-NOT: hop_to_executor
106+
// CHECK: [[BACCESS:%[0-9]+]] = begin_access [modify] [dynamic] [[BGLOBAL_ADDR]]
107+
// static Int.+= infix(_:_:)
108+
// CHECK: [[PE_INT_FUNC:%[0-9]+]] = function_ref @$sSi2peoiyySiz_SitFZ
109+
// CHECK: [[INCREMENTED:%[0-9]+]] = apply [[PE_INT_FUNC]]([[BACCESS]], {{%[0-9]+}}, {{%[0-9]+}})
110+
// CHECK: end_access [[BACCESS]]
111+
}

0 commit comments

Comments
 (0)