mirror of
https://github.com/apple/swift.git
synced 2026-10-08 12:50:50 +02:00
81 lines
2.1 KiB
Swift
81 lines
2.1 KiB
Swift
// RUN: %target-typecheck-verify-swift -target %target-swift-5.1-abi-triple
|
|
|
|
// REQUIRES: concurrency
|
|
|
|
func test() async {
|
|
async let x = 1 // okay
|
|
_ = await x
|
|
}
|
|
|
|
struct X {
|
|
async let x = 1 // expected-error{{'async let' can only be used on local declarations}}
|
|
}
|
|
|
|
func testAsyncFunc() async {
|
|
async let (z1, z2) = (2, 3)
|
|
async let (_, _) = (2, 3)
|
|
async let x2 = 1
|
|
|
|
async var x = 17 // expected-error{{'async' can only be used with 'let' declarations}}{{9-12=let}}
|
|
async let (_, _) = (1, 2), y2 = 7 // expected-error{{'async let' requires at least one named variable}}
|
|
async let y: Int // expected-error{{'async let' binding requires an initializer expression}}
|
|
_ = await x
|
|
_ = y
|
|
_ = await z1
|
|
_ = await z2
|
|
_ = await x2
|
|
await x = 1
|
|
_ = y2
|
|
}
|
|
|
|
// Cooking example
|
|
func chopVegetables() async throws -> [String] { [] }
|
|
func marinateMeat() async -> String { "MEAT" }
|
|
|
|
func cook() async throws {
|
|
async let veggies = try await chopVegetables(), meat = await marinateMeat()
|
|
_ = try await veggies
|
|
_ = await meat
|
|
}
|
|
|
|
func testInterpolation() async {
|
|
async let y = "\(12345)"
|
|
_ = await y
|
|
}
|
|
|
|
// https://forums.swift.org/t/disable-constant-inferred-to-have-type-warning-when-using-async-let/83025
|
|
|
|
func testVoidResultTypeDiagnostics() async {
|
|
async let void = print("hello")
|
|
await void
|
|
async let void2 = ()
|
|
await void2
|
|
async let void3 = Void()
|
|
await void3
|
|
async let void4 = { _ = 42 }()
|
|
await void4
|
|
|
|
@Sendable func syncVoid() {}
|
|
async let void5 = syncVoid()
|
|
await void5
|
|
|
|
@Sendable func asyncVoid() async {}
|
|
async let void6 = asyncVoid()
|
|
await void6
|
|
|
|
async let maybeVoid = { Bool.random() ? () : nil }()
|
|
await maybeVoid
|
|
|
|
do {
|
|
final class C: Sendable { func doit() {} }
|
|
let c: C? = nil
|
|
async let maybeVoid2 = c?.doit()
|
|
let _: ()? = await maybeVoid2
|
|
}
|
|
|
|
// expected-warning @+2 {{constant 'boxOVoid' inferred to have type '[()]', which may be unexpected}}
|
|
// expected-note @+1 {{add an explicit type annotation to silence this warning}}
|
|
async let boxOVoid = { [(), (), ()] }()
|
|
await boxOVoid // expected-warning {{expression of type '[()]' is unused}}
|
|
}
|