1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
|
// RUN: %target-swift-frontend -dump-ast %s -disable-availability-checking -enable-experimental-feature ClosureIsolation | %FileCheck %s
// REQUIRES: concurrency
// REQUIRES: asserts
func acceptClosure<T>(_: () -> T) { }
func acceptSendableClosure<T>(_: @Sendable () -> T) { }
func acceptAsyncClosure<T>(_: () async -> T) { }
func acceptEscapingAsyncClosure<T>(_: @escaping () async -> T) { }
actor MyActor {
func method() async -> String { "" }
func syncMethod() -> String { "" }
}
extension MyActor {
// CHECK-LABEL: testClosureIsolation
func testClosureIsolation() async {
// CHECK: acceptClosure
// CHECK: closure_expr
// CHECK: actor_isolated
acceptClosure { self.syncMethod() }
// CHECK: acceptSendableClosure
// CHECK: closure_expr
// CHECK-NOT: actor_isolated
acceptSendableClosure { print(self) }
// CHECK: acceptAsyncClosure
// CHECK: closure_expr
// CHECK-SAME: actor_isolated="closure_isolation.(file).MyActor extension.testClosureIsolation().self@
acceptAsyncClosure { await method() }
// CHECK: acceptAsyncClosure
// CHECK: closure_expr
// CHECK-NOT: actor_isolated
acceptAsyncClosure { () async in print() }
// CHECK: acceptEscapingAsyncClosure
// CHECK: closure_expr
// CHECK: actor_isolated
acceptEscapingAsyncClosure { self.syncMethod() }
// CHECK: acceptEscapingAsyncClosure
// CHECK: closure_expr
// CHECK: actor_isolated
acceptEscapingAsyncClosure { () async in print(self) }
// CHECK: acceptClosure
// CHECK: closure_expr
// CHECK: nonisolated
acceptClosure { nonisolated in print() }
}
}
actor SomeActor { }
@globalActor
struct SomeGlobalActor {
static let shared = SomeActor()
}
func someAsyncFunc() async { }
@SomeGlobalActor func getGlobal7() -> Int { 7 }
// CHECK-LABEL: someGlobalActorFunc
@SomeGlobalActor func someGlobalActorFunc() async {
// CHECK: acceptAsyncClosure
// CHECK: closure_expr
// CHECK-SAME: global_actor_isolated="SomeGlobalActor"
acceptAsyncClosure { await someAsyncFunc() }
// CHECK: acceptAsyncClosure
// CHECK: closure_expr
// CHECK-SAME: global_actor_isolated="SomeGlobalActor"
acceptAsyncClosure { () async in print("hello") }
// CHECK: acceptEscapingAsyncClosure
// CHECK: closure_expr
// CHECK: actor_isolated
acceptEscapingAsyncClosure { await someAsyncFunc() }
// CHECK: acceptEscapingAsyncClosure
// CHECK: closure_expr
// CHECK: actor_isolated
acceptEscapingAsyncClosure { () async in print("hello") }
}
|