Skip to content

Commit 150f32c

Browse files
committed
Fix resilience of global actor hops and test MainActor.run.
1 parent 420e21a commit 150f32c

File tree

2 files changed

+25
-1
lines changed

2 files changed

+25
-1
lines changed

lib/SILGen/SILGenProlog.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -642,7 +642,7 @@ SILValue SILGenFunction::emitLoadGlobalActorExecutor(Type globalActor) {
642642
actorType->getTypeOfMember(SGM.SwiftModule, sharedInstanceDecl);
643643

644644
auto metaRepr =
645-
nominal->isResilient(SGM.SwiftModule, ResilienceExpansion::Maximal)
645+
nominal->isResilient(SGM.SwiftModule, F.getResilienceExpansion())
646646
? MetatypeRepresentation::Thick
647647
: MetatypeRepresentation::Thin;
648648

test/Concurrency/Runtime/mainactor.swift

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,10 @@ actor A {
8181
// CHECK-NOT: ERROR
8282
// CHECK: finished with return counter = 4
8383

84+
// CHECK: detached task not on main queue
85+
// CHECK: on main queue again
86+
// CHECK: detached task hopped back
87+
8488
@main struct RunIt {
8589
static func main() async {
8690
print("starting")
@@ -91,5 +95,25 @@ actor A {
9195
}
9296
let result = await someFunc()
9397
print("finished with return counter = \(result)")
98+
99+
// Check actor hopping with MainActor.run.
100+
let task = Task.detached {
101+
if checkIfMainQueue(expectedAnswer: false) {
102+
print("detached task not on main queue")
103+
} else {
104+
print("ERROR: detached task is on the main queue?")
105+
}
106+
107+
_ = await MainActor.run {
108+
checkAnotherFn(1)
109+
}
110+
111+
if checkIfMainQueue(expectedAnswer: false) {
112+
print("detached task hopped back")
113+
} else {
114+
print("ERROR: detached task is on the main queue?")
115+
}
116+
}
117+
_ = await task.value
94118
}
95119
}

0 commit comments

Comments
 (0)