Skip to content

Commit 75858cd

Browse files
committed
[Concurrency] Allow capturing nonisolated(unsafe) local variables in
`@Sendable` closures.
1 parent 7cc2afd commit 75858cd

File tree

2 files changed

+17
-0
lines changed

2 files changed

+17
-0
lines changed

lib/Sema/TypeCheckConcurrency.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2468,6 +2468,15 @@ namespace {
24682468
// If the closure won't execute concurrently with the context in
24692469
// which the declaration occurred, it's okay.
24702470
auto decl = capture.getDecl();
2471+
auto isolation = getActorIsolation(decl);
2472+
2473+
// 'nonisolated' local variables are always okay to capture in
2474+
// 'Sendable' closures because they can be accessed from anywhere.
2475+
// Note that only 'nonisolated(unsafe)' can be applied to local
2476+
// variables.
2477+
if (isolation.isNonisolated())
2478+
continue;
2479+
24712480
auto *context = localFunc.getAsDeclContext();
24722481
auto fnType = localFunc.getType()->getAs<AnyFunctionType>();
24732482
if (!mayExecuteConcurrentlyWith(context, decl->getDeclContext()))

test/Concurrency/sendable_checking.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -367,4 +367,12 @@ final class UseNonisolatedUnsafe: Sendable {
367367
nonisolated(unsafe) var x1: NonSendable = .init()
368368
nonisolated(unsafe) let x2: NonSendable = .init()
369369
nonisolated(unsafe) var x3: Int = 0
370+
371+
func captureInTask() {
372+
nonisolated(unsafe) var x = NonSendable()
373+
Task {
374+
print(x)
375+
x = NonSendable()
376+
}
377+
}
370378
}

0 commit comments

Comments
 (0)