1
1
// REQUIRES: concurrency
2
2
// REQUIRES: objc_interop
3
3
4
- // RUN: %target-typecheck-verify-swift -disable-availability-checking - verify-ignore-unknown -I %S/Inputs/custom-modules
5
- // RUN: %target-typecheck-verify-swift -disable-availability-checking - verify-ignore-unknown -parse-as-library -I %S/Inputs/custom-modules
4
+ // RUN: %target-typecheck-verify-swift -verify-ignore-unknown -I %S/Inputs/custom-modules
5
+ // RUN: %target-typecheck-verify-swift -verify-ignore-unknown -parse-as-library -I %S/Inputs/custom-modules
6
6
7
7
import ObjcAsync
8
8
@@ -12,62 +12,74 @@ import ObjcAsync
12
12
func goodFunc1( value: String , completionHandler: @escaping ( Int ) -> Void ) { }
13
13
@available ( * , renamed: " asyncFunc(_:) " )
14
14
func goodFunc2( value: String , completionHandler: @escaping ( Int ) -> Void ) { }
15
- // expected-note@+1 4 {{'asyncFunc' declared here}}
15
+ // expected-note@+2 4 {{'asyncFunc' declared here}}
16
+ @available ( SwiftStdlib 5 . 5 , * )
16
17
func asyncFunc( _ text: String ) async -> Int { }
17
18
18
19
// Ambiguous but only one is async
19
20
@available ( * , renamed: " overloaded() " )
20
21
func asyncOnlyOverload( completionHandler: @escaping ( ) -> Void ) { }
21
22
func overloaded( ) { }
22
- // expected-note@+1 {{'overloaded()' declared here}}
23
+ // expected-note@+2 {{'overloaded()' declared here}}
24
+ @available ( SwiftStdlib 5 . 5 , * )
23
25
func overloaded( ) async { }
24
26
25
27
// Renamed decl is ambiguous but the params only match a single case
26
28
@available ( * , renamed: " overloadedAsyncFunc(value:) " )
27
29
func nonAmbiguousFunc( value: Int , handler: @escaping ( ) -> Void ) { }
28
- // expected-note@+1 {{'overloadedAsyncFunc(value:)' declared here}}
30
+ // expected-note@+2 {{'overloadedAsyncFunc(value:)' declared here}}
31
+ @available ( SwiftStdlib 5 . 5 , * )
29
32
func overloadedAsyncFunc( value: Int ) async { }
33
+ @available ( SwiftStdlib 5 . 5 , * )
30
34
func overloadedAsyncFunc( value: String ) async { }
31
35
32
36
// More parameters in async but they have defaults and different labels
33
37
@available ( * , renamed: " defaultedParamsStart(newArg:arg:) " )
34
38
func defaultedParamsStart( arg: Int , completionHandler: @escaping ( ) -> Void ) { }
35
- // expected-note@+1 {{'defaultedParamsStart(newArg:arg:)' declared here}}
39
+ // expected-note@+2 {{'defaultedParamsStart(newArg:arg:)' declared here}}
40
+ @available ( SwiftStdlib 5 . 5 , * )
36
41
func defaultedParamsStart( newArg: String = " " , arg: Int ) async { }
37
42
38
43
@available ( * , renamed: " defaultedParamsStart2(newArg:arg:) " )
39
44
func defaultedParamsStart2( arg: Int , completionHandler: @escaping ( ) -> Void ) { }
40
- // expected-note@+1 {{'defaultedParamsStart2(newArg:arg:)' declared here}}
45
+ // expected-note@+2 {{'defaultedParamsStart2(newArg:arg:)' declared here}}
46
+ @available ( SwiftStdlib 5 . 5 , * )
41
47
func defaultedParamsStart2( newArg: Int = 0 , arg: Int ) async { }
42
48
43
49
@available ( * , renamed: " defaultedParamsMiddle(arg1:newArg:arg2:) " )
44
50
func defaultedParamsMiddle( arg1: Int , arg2: Int , completionHandler: @escaping ( ) -> Void ) { }
45
- // expected-note@+1 {{'defaultedParamsMiddle(arg1:newArg:arg2:)' declared here}}
51
+ // expected-note@+2 {{'defaultedParamsMiddle(arg1:newArg:arg2:)' declared here}}
52
+ @available ( SwiftStdlib 5 . 5 , * )
46
53
func defaultedParamsMiddle( arg1: Int , newArg: String = " " , arg2: Int ) async { }
47
54
48
55
@available ( * , renamed: " defaultedParamsMiddle2(arg1:newArg:arg2:) " )
49
56
func defaultedParamsMiddle2( arg1: Int , arg2: Int , completionHandler: @escaping ( ) -> Void ) { }
50
- // expected-note@+1 {{'defaultedParamsMiddle2(arg1:newArg:arg2:)' declared here}}
57
+ // expected-note@+2 {{'defaultedParamsMiddle2(arg1:newArg:arg2:)' declared here}}
58
+ @available ( SwiftStdlib 5 . 5 , * )
51
59
func defaultedParamsMiddle2( arg1: Int , newArg: Int = 0 , arg2: Int ) async { }
52
60
53
61
@available ( * , renamed: " defaultedParamsEnd(arg:newArg:) " )
54
62
func defaultedParamsEnd( arg: Int , completionHandler: @escaping ( ) -> Void ) { }
55
- // expected-note@+1 {{'defaultedParamsEnd(arg:newArg:)' declared here}}
63
+ // expected-note@+2 {{'defaultedParamsEnd(arg:newArg:)' declared here}}
64
+ @available ( SwiftStdlib 5 . 5 , * )
56
65
func defaultedParamsEnd( arg: Int , newArg: String = " " ) async { }
57
66
58
67
@available ( * , renamed: " defaultedParamsEnd2(arg:newArg:) " )
59
68
func defaultedParamsEnd2( arg: Int , completionHandler: @escaping ( ) -> Void ) { }
60
- // expected-note@+1 {{'defaultedParamsEnd2(arg:newArg:)' declared here}}
69
+ // expected-note@+2 {{'defaultedParamsEnd2(arg:newArg:)' declared here}}
70
+ @available ( SwiftStdlib 5 . 5 , * )
61
71
func defaultedParamsEnd2( arg: Int , newArg: Int = 0 ) async { }
62
72
63
73
@available ( * , renamed: " defaultedParamsEnd3(newArg:arg:) " )
64
74
func defaultedParamsEnd3( arg: Int , completionHandler: @escaping ( ) -> Void ) { }
65
- // expected-note@+1 {{'defaultedParamsEnd3(newArg:arg:)' declared here}}
75
+ // expected-note@+2 {{'defaultedParamsEnd3(newArg:arg:)' declared here}}
76
+ @available ( SwiftStdlib 5 . 5 , * )
66
77
func defaultedParamsEnd3( newArg: Int , arg: String = " " ) async { }
67
78
68
79
@available ( * , renamed: " defaultedParamsEnd4(newArg:arg:) " )
69
80
func defaultedParamsEnd4( arg: Int , completionHandler: @escaping ( ) -> Void ) { }
70
- // expected-note@+1 {{'defaultedParamsEnd4(newArg:arg:)' declared here}}
81
+ // expected-note@+2 {{'defaultedParamsEnd4(newArg:arg:)' declared here}}
82
+ @available ( SwiftStdlib 5 . 5 , * )
71
83
func defaultedParamsEnd4( newArg: Int , arg: Int = 0 ) async { }
72
84
73
85
@available ( * , deprecated)
@@ -77,18 +89,22 @@ func defaultedParamsEnd4(newArg: Int, arg: Int = 0) async { }
77
89
@available ( macOS, deprecated: 12 , renamed: " manyAttrsOld() " )
78
90
@available ( * , deprecated)
79
91
func manyAttrs( completionHandler: @escaping ( ) -> Void ) { }
80
- // expected-note@+1 {{'manyAttrsNew()' declared here}}
92
+ // expected-note@+2 {{'manyAttrsNew()' declared here}}
93
+ @available ( SwiftStdlib 5 . 5 , * )
81
94
func manyAttrsNew( ) async { }
82
95
83
96
@available ( macOS, introduced: 12 , renamed: " platformOnlyNew() " )
84
97
func platformOnly( completionHandler: @escaping ( ) -> Void ) { }
85
- // expected-note@+1 {{'platformOnlyNew()' declared here}}
98
+ // expected-note@+2 {{'platformOnlyNew()' declared here}}
99
+ @available ( SwiftStdlib 5 . 5 , * )
86
100
func platformOnlyNew( ) async { }
87
101
102
+ @available ( SwiftStdlib 5 . 5 , * )
88
103
struct AnotherStruct {
89
104
var otherInstanceProp : Int { get async { 1 } }
90
105
}
91
106
107
+ @available ( SwiftStdlib 5 . 5 , * )
92
108
struct SomeStruct {
93
109
@available ( * , renamed: " structFunc " )
94
110
func structFunc( continuation: @escaping ( ) -> Void ) { }
@@ -138,6 +154,7 @@ func badFunc(value: String, completionHandler: @escaping (Int) -> Void) {}
138
154
// Not a completion handler
139
155
@available ( * , renamed: " notCompletionRenamed() " )
140
156
func notCompletion( ) { }
157
+ @available ( SwiftStdlib 5 . 5 , * )
141
158
func notCompletionRenamed( ) async { }
142
159
143
160
// Corresponding function isn't async
@@ -148,22 +165,27 @@ func completionNotAsyncRenamed() {}
148
165
// Renamed decl is ambiguous and there's multiple matches
149
166
@available ( * , renamed: " asyncFuncDifferentParamNames " )
150
167
func ambiguousFunc( value: Int , handler: @escaping ( ) -> Void ) { }
168
+ @available ( SwiftStdlib 5 . 5 , * )
151
169
func asyncFuncDifferentParamNames( value: Int ) async { }
170
+ @available ( SwiftStdlib 5 . 5 , * )
152
171
func asyncFuncDifferentParamNames( value2: Int ) async { }
153
172
154
173
// Renamed decl doesn't have enough params
155
174
@available ( * , renamed: " fewerParamsFunc() " )
156
175
func fewerParamsFunc( value: Int , handler: @escaping ( ) -> Void ) { }
176
+ @available ( SwiftStdlib 5 . 5 , * )
157
177
func fewerParamsFunc( ) async { }
158
178
159
179
// Renamed decl has more params
160
180
@available ( * , renamed: " moreParamsFunc() " )
161
181
func moreParamsFunc( handler: @escaping ( ) -> Void ) { }
182
+ @available ( SwiftStdlib 5 . 5 , * )
162
183
func moreParamsFunc( value: Int ) async { }
163
184
164
185
// Renamed decl params types don't match
165
186
@available ( * , renamed: " noMatchingParamsIntFunc(value:) " )
166
187
func noMatchingParamsFunc( value: Character , handler: @escaping ( ) -> Void ) { }
188
+ @available ( SwiftStdlib 5 . 5 , * )
167
189
func noMatchingParamsIntFunc( value: Int ) async { }
168
190
169
191
// Matching function isn't async
@@ -173,33 +195,40 @@ func noMatchingSyncFunc(value: Int) {}
173
195
174
196
@available ( * , renamed: " sameLabelsDifferentOrder(arg2:arg:) " )
175
197
func sameLabelsDifferentOrder( arg: Int , arg2: String , completionHandler: @escaping ( ) -> Void ) { }
198
+ @available ( SwiftStdlib 5 . 5 , * )
176
199
func sameLabelsDifferentOrder( arg2: String , arg: Int ) async { }
177
200
178
201
@available ( * , renamed: " handlerNotRemoved(newArg:completionHandler:) " )
179
202
func handlerNotRemoved( arg: Int , completionHandler: @escaping ( ) -> Void ) { }
203
+ @available ( SwiftStdlib 5 . 5 , * )
180
204
func handlerNotRemoved( newArg: Int , completionHandler: @escaping ( ) -> Void ) async { }
181
205
182
206
// Extra arguments. Even though there's defaults, they match the previous
183
207
// labels so they shouldn't be skipped. Thus the functions do not match.
184
208
@available ( * , renamed: " defaultedParamsStartBad(arg:newArg:) " )
185
209
func defaultedParamsStartBad( arg: Int , completionHandler: @escaping ( ) -> Void ) { }
210
+ @available ( SwiftStdlib 5 . 5 , * )
186
211
func defaultedParamsStartBad( arg: String = " " , newArg: Int ) async { }
187
212
188
213
@available ( * , renamed: " defaultedParamsStartBad2(arg:newArg:) " )
189
214
func defaultedParamsStartBad2( arg: Int , completionHandler: @escaping ( ) -> Void ) { }
215
+ @available ( SwiftStdlib 5 . 5 , * )
190
216
func defaultedParamsStartBad2( arg: Int = 0 , newArg: Int ) async { }
191
217
192
218
@available ( * , renamed: " defaultedParamsMiddleBad(arg1:arg2:newArg:) " )
193
219
func defaultedParamsMiddleBad( arg1: Int , arg2: Int , completionHandler: @escaping ( ) -> Void ) { }
220
+ @available ( SwiftStdlib 5 . 5 , * )
194
221
func defaultedParamsMiddleBad( arg1: Int , arg2: String = " " , newArg: Int ) async { }
195
222
196
223
@available ( * , renamed: " defaultedParamsMiddleBad2(arg1:arg2:newArg:) " )
197
224
func defaultedParamsMiddleBad2( arg1: Int , arg2: Int , completionHandler: @escaping ( ) -> Void ) { }
225
+ @available ( SwiftStdlib 5 . 5 , * )
198
226
func defaultedParamsMiddleBad2( arg1: Int , arg2: Int = 0 , newArg: Int ) async { }
199
227
200
228
201
229
// Suggest using async alternative function in async context
202
230
231
+ @available ( SwiftStdlib 5 . 5 , * )
203
232
func asyncContext( t: HandlerTest ) async {
204
233
// expected-warning@+1{{consider using asynchronous alternative function}}
205
234
goodFunc1 ( value: " Hello " ) { _ in }
@@ -217,6 +246,14 @@ func asyncContext(t: HandlerTest) async {
217
246
218
247
let _ = await asyncFunc ( " World " )
219
248
249
+ defer {
250
+ goodFunc1 ( value: " Hello " ) { _ in }
251
+ }
252
+
253
+ func syncFunc( ) {
254
+ goodFunc1 ( value: " Hello " ) { _ in }
255
+ }
256
+
220
257
// expected-warning@+1{{consider using asynchronous alternative function}}
221
258
asyncOnlyOverload ( ) { }
222
259
// expected-warning@+1{{consider using asynchronous alternative function}}
@@ -237,7 +274,8 @@ func asyncContext(t: HandlerTest) async {
237
274
defaultedParamsEnd3 ( arg: 1 ) { }
238
275
// expected-warning@+1{{consider using asynchronous alternative function}}
239
276
defaultedParamsEnd4 ( arg: 1 ) { }
240
- // expected-warning@+1{{consider using asynchronous alternative function}}
277
+ // expected-warning@+2{{consider using asynchronous alternative function}}
278
+ // expected-warning@+1{{'manyAttrs(completionHandler:)' is deprecated}}
241
279
manyAttrs ( ) { }
242
280
// expected-warning@+1{{consider using asynchronous alternative function}}
243
281
platformOnly ( ) { }
@@ -287,6 +325,7 @@ func asyncContext(t: HandlerTest) async {
287
325
t. asyncImportSame ( 1 , replyTo: { _ in } )
288
326
}
289
327
328
+ @available ( SwiftStdlib 5 . 5 , * )
290
329
func syncContext( t: HandlerTest ) {
291
330
goodFunc1 ( value: " Hello " ) { _ in }
292
331
t. simple { _ in }
@@ -303,6 +342,7 @@ let asyncGlobalClosure = { () async -> () in
303
342
goodFunc1 ( value: " neat " ) { _ in }
304
343
}
305
344
345
+ @available ( SwiftStdlib 5 . 5 , * )
306
346
class ClassCallingAsyncStuff {
307
347
struct NestedStruct {
308
348
@available ( * , renamed: " structFunc() " )
0 commit comments