Files
swift-mirror/test/decl/var/async_let.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}}
}