Files
swift-mirror/test/Concurrency/Runtime/async_task_locals_async_let.swift
2021-04-29 15:48:23 +09:00

87 lines
2.4 KiB
Swift

// RUN: %target-run-simple-swift(-Xfrontend -enable-experimental-concurrency -parse-as-library %import-libdispatch) | %FileCheck %s
// REQUIRES: executable_test
// REQUIRES: concurrency
// REQUIRES: libdispatch
// rdar://76038845
// UNSUPPORTED: use_os_stdlib
// UNSUPPORTED: back_deployment_runtime
@available(macOS 9999, iOS 9999, watchOS 9999, tvOS 9999, *)
enum TL {
@TaskLocal(default: 0)
static var number
}
@available(macOS 9999, iOS 9999, watchOS 9999, tvOS 9999, *)
@discardableResult
func printTaskLocal<V>(
_ key: TaskLocal<V>.Access,
_ expected: V? = nil,
file: String = #file, line: UInt = #line
) -> V? {
let value = key.get()
print("\(key) (\(value)) at \(file):\(line)")
if let expected = expected {
assert("\(expected)" == "\(value)",
"Expected [\(expected)] but found: \(value), at \(file):\(line)")
}
return expected
}
// ==== ------------------------------------------------------------------------
@available(macOS 9999, iOS 9999, watchOS 9999, tvOS 9999, *)
func async_let_nested() async {
printTaskLocal(TL.number) // CHECK: TaskLocal<Int>.Access (0)
async let x1: () = TL.number.withValue(2) {
async let x2 = printTaskLocal(TL.number) // CHECK: TaskLocal<Int>.Access (2)
@Sendable
func test() async {
printTaskLocal(TL.number) // CHECK: TaskLocal<Int>.Access (2)
async let x31 = printTaskLocal(TL.number) // CHECK: TaskLocal<Int>.Access (2)
_ = await x31
}
async let x3: () = test()
_ = await x2
await x3
}
_ = await x1
printTaskLocal(TL.number) // CHECK: TaskLocal<Int>.Access (0)
}
@available(macOS 9999, iOS 9999, watchOS 9999, tvOS 9999, *)
func async_let_nested_skip_optimization() async {
async let x1: Int? = TL.number.withValue(2) {
async let x2: Int? = { () async -> Int? in
async let x3: Int? = { () async -> Int? in
async let x4: Int? = { () async -> Int? in
async let x5: Int? = { () async -> Int? in
assert(TL.number.get() == 2)
async let xx = printTaskLocal(TL.number) // CHECK: TaskLocal<Int>.Access (2)
return await xx
}()
return await x5
}()
return await x4
}()
return await x3
}()
return await x2
}
_ = await x1
}
@available(macOS 9999, iOS 9999, watchOS 9999, tvOS 9999, *)
@main struct Main {
static func main() async {
await async_let_nested()
await async_let_nested_skip_optimization()
}
}