- Notifications
You must be signed in to change notification settings - Fork 10.5k
/
Copy pathasync_sequence_syntax.swift
132 lines (109 loc) · 4.24 KB
/
async_sequence_syntax.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
// RUN: %target-swift-frontend -target %target-swift-5.1-abi-triple %s -emit-sil -o /dev/null -verify
// RUN: %target-swift-frontend -target %target-swift-5.1-abi-triple %s -emit-sil -o /dev/null -verify -strict-concurrency=targeted
// RUN: %target-swift-frontend -target %target-swift-5.1-abi-triple %s -emit-sil -o /dev/null -verify -strict-concurrency=complete
// REQUIRES: concurrency
// REQUIRES: asserts
// expected-note@+2{{add 'async' to function 'missingAsync' to make it asynchronous}}
@available(SwiftStdlib 5.1,*)
func missingAsync<T :AsyncSequence>(_ seq:T)throws{
fortryawait_in seq {} // expected-error{{'async' in a function that does not support concurrency}}
}
@available(SwiftStdlib 5.1,*)
func missingThrows<T :AsyncSequence>(_ seq:T)async{
fortryawait_in seq {}
// expected-error@-1 {{errors thrown from here are not handled}}
}
@available(SwiftStdlib 5.1,*)
func executeAsync(_ work:()async->Void){}
@available(SwiftStdlib 5.1,*)
func execute(_ work:()->Void){}
@available(SwiftStdlib 5.1,*)
func missingThrowingInBlock<T :AsyncSequence>(_ seq:T){
executeAsync{ // expected-error{{invalid conversion from throwing function of type '() async throws -> Void' to non-throwing function type '() async -> Void'}}
fortryawait_in seq {}
}
}
@available(SwiftStdlib 5.1,*)
func missingTryInBlock<T :AsyncSequence>(_ seq:T){
executeAsync{
forawait_in seq {}
// expected-error@-1{{call can throw, but the error is not handled}}
// expected-error@-2{{errors thrown from here are not handled}}
}
}
@available(SwiftStdlib 5.1,*)
func missingAsyncInBlock<T :AsyncSequence>(_ seq:T){
execute{ // expected-error{{cannot pass function of type '() async -> Void' to parameter expecting synchronous function type}}
do{
fortryawait_in seq {} // expected-note {{'async' inferred from asynchronous operation used here}}
}catch{}
}
}
@available(SwiftStdlib 5.1,*)
func doubleDiagCheckGeneric<T :AsyncSequence>(_ seq:T)async{
varit= seq.makeAsyncIterator()
// expected-error@+1{{call can throw, but it is not marked with 'try' and the error is not handled}}
let _ =await it.next()
}
@available(SwiftStdlib 5.1,*)
structThrowingAsyncSequence:AsyncSequence,AsyncIteratorProtocol{
typealiasElement=Int
typealiasAsyncIterator=Self
mutatingfunc next()asyncthrows->Int?{
returnnil
}
func makeAsyncIterator()->Self{returnself}
}
@available(SwiftStdlib 5.1,*)
func doubleDiagCheckConcrete(_ seq:ThrowingAsyncSequence)async{
varit= seq.makeAsyncIterator()
// expected-error@+1{{call can throw, but it is not marked with 'try' and the error is not handled}}
let _ =await it.next()
}
// rdar://75274975
@available(SwiftStdlib 5.1,*)
func forAwaitInsideDoCatch<Source:AsyncSequence>(_ source:Source)async{
do{
fortryawaititemin source {
print(item)
}
}catch{} // no-warning
}
@available(SwiftStdlib 5.1,*)
func forAwaitWithConcreteType(_ seq:ThrowingAsyncSequence)throws{ // expected-note {{add 'async' to function 'forAwaitWithConcreteType' to make it asynchronous}}
fortryawaiteltin seq { // expected-error {{'async' in a function that does not support concurrency}}
_ = elt
}
}
@available(SwiftStdlib 5.1,*)
func forTryAwaitReturningExistentialType()asyncthrows{
structS{
func seq()->anyAsyncSequence{fatalError()}
}
fortryawait_inS().seq(){ // Ok
}
}
@available(SwiftStdlib 5.1,*)
publicstructReaderSeq:AsyncSequence,Sendable{
publicenumFailure:Error{
case x
}
publictypealiasElement=Int
publicfunc makeAsyncIterator()->Reader{}
publicactorReader:AsyncIteratorProtocol{
publicfunc next()asyncthrows->Element?{}
}
}
@available(SwiftStdlib 5.1,*)
func test1()->Error{
returnReaderSeq.Failure.x
}
@available(SwiftStdlib 5.1,*)
publicstructMineOwnIterator<Element>:AsyncSequence,AsyncIteratorProtocol{
publicmutatingfunc next()async->Element?{nil}
publicfunc makeAsyncIterator()->Self{self}
@_implements(AsyncIteratorProtocol, Failure)
publictypealias__AsyncIteratorProtocol_Failure=Never
@_implements(AsyncSequence, Failure)
publictypealias__AsyncSequence_Failure=Never
}