mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
This warnings don't give much benefits for developers. Code completion
UI tends to show them unusable. But usually, developers can modify the
context to accept async calls, e.g. by wrapping it with `Task { }`
rdar://126737530
100 lines
3.1 KiB
Swift
100 lines
3.1 KiB
Swift
// RUN: %batch-code-completion
|
|
// REQUIRES: concurrency
|
|
|
|
// SAFE_NOTREC: Begin completions, 2 items
|
|
// SAFE_NOTREC-DAG: Keyword[self]/CurrNominal: self[#SafelyIsolatedCls#];
|
|
// SAFE_NOTREC-DAG: Decl[InstanceMethod]/CurrNominal: method()[' async'][#Void#];
|
|
|
|
// UNSAFE_NOTREC: Begin completions, 2 items
|
|
// UNSAFE_NOTREC-DAG: Keyword[self]/CurrNominal: self[#UnsafelyIsolatedCls#];
|
|
// UNSAFE_NOTREC-DAG: Decl[InstanceMethod]/CurrNominal: method()[' async'][#Void#];
|
|
|
|
// SAFE_OK: Begin completions, 2 items
|
|
// SAFE_OK-DAG: Keyword[self]/CurrNominal: self[#SafelyIsolatedCls#];
|
|
// SAFE_OK-DAG: Decl[InstanceMethod]/CurrNominal: method()[' async'][#Void#];
|
|
|
|
// UNSAFE_OK: Begin completions, 2 items
|
|
// UNSAFE_OK-DAG: Keyword[self]/CurrNominal: self[#UnsafelyIsolatedCls#];
|
|
// UNSAFE_OK-DAG: Decl[InstanceMethod]/CurrNominal: method()[' async'][#Void#];
|
|
|
|
// UNSAFE_OK_SYNC: Begin completions, 2 items
|
|
// UNSAFE_OK_SYNC-DAG: Keyword[self]/CurrNominal: self[#UnsafelyIsolatedCls#];
|
|
// UNSAFE_OK_SYNC-DAG: Decl[InstanceMethod]/CurrNominal: method()[#Void#];
|
|
|
|
@globalActor
|
|
actor MyGlobalActor {
|
|
static let shared = MyGlobalActor()
|
|
}
|
|
|
|
@MyGlobalActor(unsafe)
|
|
class UnsafelyIsolatedCls {
|
|
func method()
|
|
}
|
|
|
|
@MyGlobalActor
|
|
class SafelyIsolatedCls {
|
|
func method()
|
|
}
|
|
|
|
class TestNormal {
|
|
func testSync(s: SafelyIsolatedCls, u: UnsafelyIsolatedCls) {
|
|
s.#^IN_METHOD_SYNC_SAFE?check=SAFE_NOTREC^#
|
|
u.#^IN_METHOD_SYNC_UNSAFE?check=UNSAFE_OK_SYNC^#
|
|
}
|
|
func testAsync(s: SafelyIsolatedCls, u: UnsafelyIsolatedCls) async {
|
|
s.#^IN_METHOD_ASYNC_SAFE?check=SAFE_OK^#
|
|
u.#^IN_METHOD_ASYNC_UNSAFE?check=UNSAFE_OK^#
|
|
}
|
|
}
|
|
|
|
func testSync(s: SafelyIsolatedCls, u: UnsafelyIsolatedCls) {
|
|
s.#^IN_FUNC_SYNC_SAFE?check=SAFE_NOTREC^#
|
|
u.#^IN_FUNC_SYNC_UNSAFE?check=UNSAFE_OK_SYNC^#
|
|
}
|
|
func testAsync(s: SafelyIsolatedCls, u: UnsafelyIsolatedCls) async {
|
|
s.#^IN_FUNC_ASYNC_SAFE?check=SAFE_OK^#
|
|
u.#^IN_FUNC_ASYNC_UNSAFE?check=UNSAFE_OK^#
|
|
}
|
|
|
|
func testClosure(s: SafelyIsolatedCls, u: UnsafelyIsolatedCls) {
|
|
func receiverSync(fn: () -> Void) {}
|
|
func receiverAsync(fn: () async -> Void) {}
|
|
|
|
receiverSync {
|
|
dummy;
|
|
s.#^IN_CLOSURE_SYNC_SAFE?check=SAFE_NOTREC^#
|
|
u.#^IN_CLOSURE_SYNC_UNSAFE?check=UNSAFE_OK_SYNC^#
|
|
}
|
|
|
|
receiverAsync {
|
|
dummy;
|
|
s.#^IN_CLOSURE_ASYNC_SAFE?check=SAFE_OK^#
|
|
u.#^IN_CLOSURE_ASYNC_UNSAFE?check=UNSAFE_OK^#
|
|
}
|
|
}
|
|
|
|
actor TestActor {
|
|
func test(s: SafelyIsolatedCls, u: UnsafelyIsolatedCls) {
|
|
s.#^IN_ACTOR_SYNC_SAFE?check=SAFE_NOTREC^#
|
|
u.#^IN_ACTOR_SYNC_UNSAFE?check=UNSAFE_NOTREC^#
|
|
}
|
|
|
|
func testAsync(s: SafelyIsolatedCls, u: UnsafelyIsolatedCls) async {
|
|
s.#^IN_ACTOR_ASYNC_SAFE?check=SAFE_OK^#
|
|
u.#^IN_ACTOR_ASYNC_UNSAFE?check=UNSAFE_OK^#
|
|
}
|
|
}
|
|
|
|
@MainActor
|
|
class TestMainActorIsolated {
|
|
func test(s: SafelyIsolatedCls, u: UnsafelyIsolatedCls) {
|
|
s.#^IN_GLOBALACTOR_SYNC_SAFE?check=SAFE_NOTREC^#
|
|
u.#^IN_GLOBALACTOR_SYNC_UNSAFE?check=UNSAFE_NOTREC^#
|
|
}
|
|
|
|
func testAsync(s: SafelyIsolatedCls, u: UnsafelyIsolatedCls) async {
|
|
s.#^IN_GLOBALACTOR_ASYNC_SAFE?check=SAFE_OK^#
|
|
u.#^IN_GLOBALACTOR_ASYNC_UNSAFE?check=UNSAFE_OK^#
|
|
}
|
|
}
|