mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
The concurrency runtime now deploys back to macOS 10.15, iOS 13.0, watchOS 6.0, tvOS 13.0, which corresponds to the 5.1 release of the stdlib. Adjust macro usages accordingly.
157 lines
3.7 KiB
Swift
157 lines
3.7 KiB
Swift
// RUN: %target-run-simple-swift( -Xfrontend -disable-availability-checking -parse-as-library) | %FileCheck %s --dump-input=always
|
|
// REQUIRES: executable_test
|
|
// REQUIRES: concurrency
|
|
// REQUIRES: concurrency_runtime
|
|
// UNSUPPORTED: back_deployment_runtime
|
|
// UNSUPPORTED: linux
|
|
|
|
struct Boom: Error {}
|
|
|
|
func boom() async throws -> Int {
|
|
throw Boom()
|
|
}
|
|
|
|
@available(SwiftStdlib 5.1, *)
|
|
func test_taskGroup_next() async {
|
|
let sum = await withThrowingTaskGroup(of: Int.self, returning: Int.self) { group in
|
|
for n in 1...10 {
|
|
group.spawn {
|
|
return n.isMultiple(of: 3) ? try await boom() : n
|
|
}
|
|
}
|
|
|
|
var sum = 0
|
|
var catches = 0
|
|
for _ in 1...5 {
|
|
do {
|
|
while let r = try await group.next() {
|
|
sum += r
|
|
print("add \(r) -> sum: \(sum)")
|
|
}
|
|
} catch {
|
|
catches += 1
|
|
print("catch: \(catches)")
|
|
}
|
|
}
|
|
|
|
// CHECK: catches with group.next(): 3
|
|
print("catches with group.next(): \(catches)")
|
|
|
|
return sum
|
|
}
|
|
|
|
// CHECK: result with group.next(): 37
|
|
print("result with group.next(): \(sum)")
|
|
}
|
|
|
|
@available(SwiftStdlib 5.1, *)
|
|
func test_taskGroup_for_in() async {
|
|
let sum = await withThrowingTaskGroup(of: Int.self, returning: Int.self) { group in
|
|
for n in 1...10 {
|
|
group.spawn {
|
|
return n.isMultiple(of: 3) ? try await boom() : n
|
|
}
|
|
}
|
|
|
|
var sum = 0
|
|
var catches = 0
|
|
for _ in 1...5 {
|
|
do {
|
|
for try await r in group {
|
|
sum += r
|
|
}
|
|
} catch {
|
|
catches += 1
|
|
}
|
|
}
|
|
|
|
// CHECK: catches with for-in: 3
|
|
print("catches with for-in: \(catches)")
|
|
|
|
return sum
|
|
}
|
|
|
|
// CHECK: result with for-in: 37
|
|
print("result with for-in: \(sum)")
|
|
}
|
|
|
|
@available(SwiftStdlib 5.1, *)
|
|
func test_taskGroup_asyncIterator() async {
|
|
let sum = await withThrowingTaskGroup(of: Int.self, returning: Int.self) { group in
|
|
for n in 1...10 {
|
|
group.spawn {
|
|
return n.isMultiple(of: 3) ? try await boom() : n
|
|
}
|
|
}
|
|
|
|
var sum = 0
|
|
var catches = 0
|
|
for _ in 1...5 {
|
|
var iterator = group.makeAsyncIterator()
|
|
do {
|
|
while let r = try await iterator.next() {
|
|
sum += r
|
|
}
|
|
if try! await iterator.next() != nil {
|
|
fatalError("Element returned from iterator after nil")
|
|
}
|
|
} catch {
|
|
catches += 1
|
|
if try! await iterator.next() != nil {
|
|
fatalError("Element returned from iterator after throw")
|
|
}
|
|
}
|
|
}
|
|
|
|
// CHECK: catches with for-in: 3
|
|
print("catches with for-in: \(catches)")
|
|
|
|
return sum
|
|
}
|
|
|
|
// CHECK: result with async iterator: 37
|
|
print("result with async iterator: \(sum)")
|
|
}
|
|
|
|
@available(SwiftStdlib 5.1, *)
|
|
func test_taskGroup_contains() async {
|
|
let sum = await withTaskGroup(of: Int.self, returning: Int.self) { group in
|
|
for n in 1...4 {
|
|
group.spawn {
|
|
return n
|
|
}
|
|
}
|
|
|
|
let three = await group.contains(3)
|
|
print("three = \(three)") // CHECK: three = true
|
|
|
|
for n in 5...7 {
|
|
group.spawn {
|
|
return n
|
|
}
|
|
}
|
|
|
|
let six = await group.contains(6)
|
|
print("six = \(six)") // CHECK: six = true
|
|
|
|
|
|
let sixAgain = await group.contains(6)
|
|
print("six again = \(sixAgain)") // CHECK: six again = false
|
|
|
|
return 0
|
|
}
|
|
|
|
// CHECK: result with async iterator: 0
|
|
print("result with async iterator: \(sum)")
|
|
}
|
|
|
|
@available(SwiftStdlib 5.1, *)
|
|
@main struct Main {
|
|
static func main() async {
|
|
await test_taskGroup_next()
|
|
await test_taskGroup_for_in()
|
|
await test_taskGroup_asyncIterator()
|
|
await test_taskGroup_contains()
|
|
}
|
|
}
|