Skip to content

Commit 1815e24

Browse files
authored
Merge pull request swiftlang#40963 from etcwilde/ewilde/global-actor-top-level-vars
Allow global-actor isolation on top-level variables
2 parents 7e9b64e + 7b873c3 commit 1815e24

File tree

5 files changed

+123
-4
lines changed

5 files changed

+123
-4
lines changed

lib/SILGen/SILGenLValue.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2825,7 +2825,8 @@ void LValue::addNonMemberVarComponent(SILGenFunction &SGF, SILLocation loc,
28252825
if (!address) {
28262826
address = SGF.emitGlobalVariableRef(Loc, Storage, ActorIso);
28272827
} else {
2828-
assert(!ActorIso && "local var should not be actor isolated!");
2828+
assert((!ActorIso || Storage->isTopLevelGlobal()) &&
2829+
"local var should not be actor isolated!");
28292830
}
28302831
assert(address.isLValue() &&
28312832
"physical lvalue decl ref must evaluate to an address");

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/top_level_captures.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
// RUN: %target-swift-frontend -emit-silgen %s | %FileCheck %s
2+
// RUN: %target-swift-frontend -enable-experimental-async-top-level -emit-silgen %s | %FileCheck %s
23

34
guard let x: Int = nil else { while true { } }
45

test/SILGen/toplevel_errors.swift

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
// RUN: %target-swift-emit-silgen %s | %FileCheck %s
1+
// RUN: %target-swift-emit-silgen %s | %FileCheck %s --check-prefixes='CHECK,SYNC-CHECK'
2+
// RUN: %target-swift-emit-silgen -enable-experimental-async-top-level %s | %FileCheck %s --check-prefixes='CHECK,ASYNC-CHECK'
23

34
enum MyError : Error {
45
case A, B
@@ -17,7 +18,10 @@ throw MyError.A
1718
// CHECK: br bb2([[ERR2]] : $Error)
1819

1920
// CHECK: bb1([[T0:%.*]] : $Int32):
20-
// CHECK: return [[T0]] : $Int32
21+
// SYNC-CHECK: return [[T0]] : $Int32
22+
// ASYNC-CHECK: [[EXITFUNC:%[0-9]+]] = function_ref @exit
23+
// ASYNC-CHECK: {{[0-9]+}} = apply [[EXITFUNC]]([[T0]])
24+
// ASYNC-CHECK: unreachable
2125

2226
// CHECK: bb2([[T0:%.*]] : @owned $Error):
2327
// CHECK: builtin "errorInMain"([[T0]] : $Error)
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
// RUN: %target-swift-emit-silgen -Xllvm -sil-full-demangle -enable-experimental-async-top-level %s | %FileCheck %s
2+
3+
// a
4+
// CHECK-LABEL: sil_global hidden @$s24toplevel_globalactorvars1aSivp : $Int
5+
// b
6+
// CHECK-LABEL: sil_global hidden @$s24toplevel_globalactorvars1bSivp : $Int
7+
8+
// CHECK-LABEL: sil hidden [ossa] @async_Main
9+
// CHECK: bb0:
10+
// CHECK-NEXT: alloc_global @$s24toplevel_globalactorvars1aSivp
11+
// CHECK-NEXT: [[AREF:%[0-9]+]] = global_addr @$s24toplevel_globalactorvars1aSivp : $*Int
12+
13+
@available(SwiftStdlib 5.1, *)
14+
actor MyActorImpl {}
15+
16+
@available(SwiftStdlib 5.1, *)
17+
@globalActor
18+
struct MyActor {
19+
static let shared = MyActorImpl()
20+
}
21+
22+
@MyActor
23+
var a = 10
24+
25+
@MyActor
26+
func incrementA() {
27+
a += 1
28+
}
29+
30+
await print(a)
31+
32+
// CHECK: [[ACTORREF:%[0-9]+]] = begin_borrow {{%[0-9]+}} : $MyActorImpl
33+
// CHECK: [[OLDACTOR:%[0-9]+]] = builtin "getCurrentExecutor"() : $Optional<Builtin.Executor>
34+
// CHECK: hop_to_executor [[ACTORREF]] : $MyActorImpl
35+
// CHECK: [[AACCESS:%[0-9]+]] = begin_access [read] [dynamic] [[AREF]] : $*Int
36+
// CHECK: [[AGLOBAL:%[0-9]+]] = load [trivial] [[AACCESS]] : $*Int
37+
// CHECK: end_access [[AACCESS]]
38+
// CHECK: hop_to_executor [[OLDACTOR]]
39+
// CHECK: end_borrow [[ACTORREF]]
40+
41+
await incrementA()
42+
43+
// CHECK: [[INCREMENTA:%[0-9]+]] = function_ref @$s24toplevel_globalactorvars10incrementAyyF
44+
// CHECK: [[ACTORREF:%[0-9]+]] = begin_borrow {{%[0-9]+}} : $MyActorImpl
45+
// CHECK: [[OLDACTOR:%[0-9]+]] = builtin "getCurrentExecutor"() : $Optional<Builtin.Executor>
46+
// CHECK: hop_to_executor [[ACTORREF]] : $MyActorImpl
47+
// CHECK: {{%[0-9]+}} = apply [[INCREMENTA]]()
48+
// CHECK: hop_to_executor [[OLDACTOR]]
49+
// CHECK: end_borrow [[ACTORREF]]
50+
51+
await print(a)
52+
53+
// CHECK: [[ACTORREF:%[0-9]+]] = begin_borrow {{%[0-9]+}} : $MyActorImpl
54+
// CHECK: [[OLDACTOR:%[0-9]+]] = builtin "getCurrentExecutor"() : $Optional<Builtin.Executor>
55+
// CHECK: hop_to_executor [[ACTORREF]] : $MyActorImpl
56+
// CHECK: [[AACCESS:%[0-9]+]] = begin_access [read] [dynamic] [[AREF]] : $*Int
57+
// CHECK: [[AGLOBAL:%[0-9]+]] = load [trivial] [[AACCESS]] : $*Int
58+
// CHECK: end_access [[AACCESS]]
59+
// CHECK: hop_to_executor [[OLDACTOR]]
60+
// CHECK: end_borrow [[ACTORREF]]
61+
62+
var b = 11
63+
64+
// CHECK: alloc_global @$s24toplevel_globalactorvars1bSivp
65+
// CHECK: [[BGLOBAL_ADDR:%[0-9]+]] = global_addr @$s24toplevel_globalactorvars1bSivp
66+
// Int.init(_builtinIntegerLiteral:)
67+
// CHECK: [[INT_INIT_FUNC:%[0-9]+]] = function_ref @$sSi22_builtinIntegerLiteralSiBI_tcfC
68+
// CHECK: [[INITD_INT:%[0-9]+]] = apply [[INT_INIT_FUNC]]({{%[0-9]+}}, {{%[0-9]+}})
69+
// CHECK: store [[INITD_INT]] to [trivial] [[BGLOBAL_ADDR]]
70+
71+
b += 1
72+
73+
// CHECK-NOT: hop_to_executor
74+
// CHECK: [[BACCESS:%[0-9]+]] = begin_access [modify] [dynamic] [[BGLOBAL_ADDR]]
75+
// static Int.+= infix(_:_:)
76+
// CHECK: [[PE_INT_FUNC:%[0-9]+]] = function_ref @$sSi2peoiyySiz_SitFZ
77+
// CHECK: [[INCREMENTED:%[0-9]+]] = apply [[PE_INT_FUNC]]([[BACCESS]], {{%[0-9]+}}, {{%[0-9]+}})
78+
// CHECK: end_access [[BACCESS]]
79+
80+
81+
// CHECK: bb1:
82+
if #available(SwiftStdlib 5.1, *) {
83+
await print(a)
84+
85+
// CHECK: [[ACTORREF:%[0-9]+]] = begin_borrow {{%[0-9]+}} : $MyActorImpl
86+
// CHECK: [[OLDACTOR:%[0-9]+]] = builtin "getCurrentExecutor"() : $Optional<Builtin.Executor>
87+
// CHECK: hop_to_executor [[ACTORREF]] : $MyActorImpl
88+
// CHECK: [[AACCESS:%[0-9]+]] = begin_access [read] [dynamic] [[AREF]] : $*Int
89+
// CHECK: [[AGLOBAL:%[0-9]+]] = load [trivial] [[AACCESS]] : $*Int
90+
// CHECK: end_access [[AACCESS]]
91+
// CHECK: hop_to_executor [[OLDACTOR]]
92+
// CHECK: end_borrow [[ACTORREF]]
93+
94+
await incrementA()
95+
96+
// CHECK: [[INCREMENTA:%[0-9]+]] = function_ref @$s24toplevel_globalactorvars10incrementAyyF
97+
// CHECK: [[ACTORREF:%[0-9]+]] = begin_borrow {{%[0-9]+}} : $MyActorImpl
98+
// CHECK: [[OLDACTOR:%[0-9]+]] = builtin "getCurrentExecutor"() : $Optional<Builtin.Executor>
99+
// CHECK: hop_to_executor [[ACTORREF]] : $MyActorImpl
100+
// CHECK: {{%[0-9]+}} = apply [[INCREMENTA]]()
101+
// CHECK: hop_to_executor [[OLDACTOR]]
102+
// CHECK: end_borrow [[ACTORREF]]
103+
104+
105+
b += 1
106+
107+
// CHECK-NOT: hop_to_executor
108+
// CHECK: [[BACCESS:%[0-9]+]] = begin_access [modify] [dynamic] [[BGLOBAL_ADDR]]
109+
// static Int.+= infix(_:_:)
110+
// CHECK: [[PE_INT_FUNC:%[0-9]+]] = function_ref @$sSi2peoiyySiz_SitFZ
111+
// CHECK: [[INCREMENTED:%[0-9]+]] = apply [[PE_INT_FUNC]]([[BACCESS]], {{%[0-9]+}}, {{%[0-9]+}})
112+
// CHECK: end_access [[BACCESS]]
113+
}

0 commit comments

Comments
 (0)