[clang] Implement lifetime analysis for lifetime_capture_by(X) (#115921)
[llvm-project.git] / clang / test / ExtractAPI / objc_block.m
blob4761a864f5349f5d03ba947be8ac66814fca5d51
1 // RUN: rm -rf %t
2 // RUN: %clang_cc1 -extract-api --pretty-sgf --emit-sgf-symbol-labels-for-testing \
3 // RUN:   -fblocks -triple arm64-apple-macosx -x objective-c-header %s -o %t/output.symbols.json -verify
5 @interface Foo
6 // RUN: FileCheck %s --input-file %t/output.symbols.json --check-prefix NOPARAM
7 -(void)methodBlockNoParam:(void (^)())block;
8 // NOPARAM-LABEL: "!testLabel": "c:objc(cs)Foo(im)methodBlockNoParam:"
9 // NOPARAM:      "declarationFragments": [
10 // NOPARAM-NEXT:   {
11 // NOPARAM-NEXT:     "kind": "text",
12 // NOPARAM-NEXT:     "spelling": "- ("
13 // NOPARAM-NEXT:   },
14 // NOPARAM-NEXT:   {
15 // NOPARAM-NEXT:     "kind": "typeIdentifier",
16 // NOPARAM-NEXT:     "preciseIdentifier": "c:v",
17 // NOPARAM-NEXT:     "spelling": "void"
18 // NOPARAM-NEXT:   },
19 // NOPARAM-NEXT:   {
20 // NOPARAM-NEXT:     "kind": "text",
21 // NOPARAM-NEXT:     "spelling": ") "
22 // NOPARAM-NEXT:   },
23 // NOPARAM-NEXT:   {
24 // NOPARAM-NEXT:     "kind": "identifier",
25 // NOPARAM-NEXT:     "spelling": "methodBlockNoParam:"
26 // NOPARAM-NEXT:   },
27 // NOPARAM-NEXT:   {
28 // NOPARAM-NEXT:     "kind": "text",
29 // NOPARAM-NEXT:     "spelling": "("
30 // NOPARAM-NEXT:   },
31 // NOPARAM-NEXT:   {
32 // NOPARAM-NEXT:     "kind": "typeIdentifier",
33 // NOPARAM-NEXT:     "preciseIdentifier": "c:v",
34 // NOPARAM-NEXT:     "spelling": "void"
35 // NOPARAM-NEXT:   },
36 // NOPARAM-NEXT:   {
37 // NOPARAM-NEXT:     "kind": "text",
38 // NOPARAM-NEXT:     "spelling": " (^)()) "
39 // NOPARAM-NEXT:   },
40 // NOPARAM-NEXT:   {
41 // NOPARAM-NEXT:     "kind": "internalParam",
42 // NOPARAM-NEXT:     "spelling": "block"
43 // NOPARAM-NEXT:   },
44 // NOPARAM-NEXT:   {
45 // NOPARAM-NEXT:     "kind": "text",
46 // NOPARAM-NEXT:     "spelling": ";"
47 // NOPARAM-NEXT:   }
48 // NOPARAM-NEXT: ],
49 // NOPARAM:      "functionSignature": {
50 // NOPARAM-NEXT:   "parameters": [
51 // NOPARAM-NEXT:     {
52 // NOPARAM-NEXT:       "declarationFragments": [
53 // NOPARAM-NEXT:         {
54 // NOPARAM-NEXT:           "kind": "text",
55 // NOPARAM-NEXT:           "spelling": "("
56 // NOPARAM-NEXT:         },
57 // NOPARAM-NEXT:         {
58 // NOPARAM-NEXT:           "kind": "typeIdentifier",
59 // NOPARAM-NEXT:           "preciseIdentifier": "c:v",
60 // NOPARAM-NEXT:           "spelling": "void"
61 // NOPARAM-NEXT:         },
62 // NOPARAM-NEXT:         {
63 // NOPARAM-NEXT:           "kind": "text",
64 // NOPARAM-NEXT:           "spelling": " (^)()) "
65 // NOPARAM-NEXT:         },
66 // NOPARAM-NEXT:         {
67 // NOPARAM-NEXT:           "kind": "internalParam",
68 // NOPARAM-NEXT:           "spelling": "block"
69 // NOPARAM-NEXT:         }
70 // NOPARAM-NEXT:       ],
71 // NOPARAM-NEXT:       "name": "block"
72 // NOPARAM-NEXT:     }
73 // NOPARAM-NEXT:   ],
74 // NOPARAM-NEXT:   "returns": [
75 // NOPARAM-NEXT:     {
76 // NOPARAM-NEXT:       "kind": "typeIdentifier",
77 // NOPARAM-NEXT:       "preciseIdentifier": "c:v",
78 // NOPARAM-NEXT:       "spelling": "void"
79 // NOPARAM-NEXT:     }
80 // NOPARAM-NEXT:   ]
81 // NOPARAM-NEXT: }
83 // RUN: FileCheck %s --input-file %t/output.symbols.json --check-prefix PARAM
84 -(void)methodBlockWithParam:(int (^)(int foo))block;
85 // PARAM-LABEL: "!testLabel": "c:objc(cs)Foo(im)methodBlockWithParam:"
86 // PARAM:      "declarationFragments": [
87 // PARAM-NEXT:   {
88 // PARAM-NEXT:     "kind": "text",
89 // PARAM-NEXT:     "spelling": "- ("
90 // PARAM-NEXT:   },
91 // PARAM-NEXT:   {
92 // PARAM-NEXT:     "kind": "typeIdentifier",
93 // PARAM-NEXT:     "preciseIdentifier": "c:v",
94 // PARAM-NEXT:     "spelling": "void"
95 // PARAM-NEXT:   },
96 // PARAM-NEXT:   {
97 // PARAM-NEXT:     "kind": "text",
98 // PARAM-NEXT:     "spelling": ") "
99 // PARAM-NEXT:   },
100 // PARAM-NEXT:   {
101 // PARAM-NEXT:     "kind": "identifier",
102 // PARAM-NEXT:     "spelling": "methodBlockWithParam:"
103 // PARAM-NEXT:   },
104 // PARAM-NEXT:   {
105 // PARAM-NEXT:     "kind": "text",
106 // PARAM-NEXT:     "spelling": "("
107 // PARAM-NEXT:   },
108 // PARAM-NEXT:   {
109 // PARAM-NEXT:     "kind": "typeIdentifier",
110 // PARAM-NEXT:     "preciseIdentifier": "c:I",
111 // PARAM-NEXT:     "spelling": "int"
112 // PARAM-NEXT:   },
113 // PARAM-NEXT:   {
114 // PARAM-NEXT:     "kind": "text",
115 // PARAM-NEXT:     "spelling": " (^)("
116 // PARAM-NEXT:   },
117 // PARAM-NEXT:   {
118 // PARAM-NEXT:     "kind": "typeIdentifier",
119 // PARAM-NEXT:     "preciseIdentifier": "c:I",
120 // PARAM-NEXT:     "spelling": "int"
121 // PARAM-NEXT:   },
122 // PARAM-NEXT:   {
123 // PARAM-NEXT:     "kind": "text",
124 // PARAM-NEXT:     "spelling": " "
125 // PARAM-NEXT:   },
126 // PARAM-NEXT:   {
127 // PARAM-NEXT:     "kind": "internalParam",
128 // PARAM-NEXT:     "spelling": "foo"
129 // PARAM-NEXT:   },
130 // PARAM-NEXT:   {
131 // PARAM-NEXT:     "kind": "text",
132 // PARAM-NEXT:     "spelling": ")) "
133 // PARAM-NEXT:   },
134 // PARAM-NEXT:   {
135 // PARAM-NEXT:     "kind": "internalParam",
136 // PARAM-NEXT:     "spelling": "block"
137 // PARAM-NEXT:   },
138 // PARAM-NEXT:   {
139 // PARAM-NEXT:     "kind": "text",
140 // PARAM-NEXT:     "spelling": ";"
141 // PARAM-NEXT:   }
142 // PARAM-NEXT: ],
143 // PARAM:      "functionSignature": {
144 // PARAM-NEXT:   "parameters": [
145 // PARAM-NEXT:     {
146 // PARAM-NEXT:       "declarationFragments": [
147 // PARAM-NEXT:         {
148 // PARAM-NEXT:           "kind": "text",
149 // PARAM-NEXT:           "spelling": "("
150 // PARAM-NEXT:         },
151 // PARAM-NEXT:         {
152 // PARAM-NEXT:           "kind": "typeIdentifier",
153 // PARAM-NEXT:           "preciseIdentifier": "c:I",
154 // PARAM-NEXT:           "spelling": "int"
155 // PARAM-NEXT:         },
156 // PARAM-NEXT:         {
157 // PARAM-NEXT:           "kind": "text",
158 // PARAM-NEXT:           "spelling": " (^)("
159 // PARAM-NEXT:         },
160 // PARAM-NEXT:         {
161 // PARAM-NEXT:           "kind": "typeIdentifier",
162 // PARAM-NEXT:           "preciseIdentifier": "c:I",
163 // PARAM-NEXT:           "spelling": "int"
164 // PARAM-NEXT:         },
165 // PARAM-NEXT:         {
166 // PARAM-NEXT:           "kind": "text",
167 // PARAM-NEXT:           "spelling": " "
168 // PARAM-NEXT:         },
169 // PARAM-NEXT:         {
170 // PARAM-NEXT:           "kind": "internalParam",
171 // PARAM-NEXT:           "spelling": "foo"
172 // PARAM-NEXT:         },
173 // PARAM-NEXT:         {
174 // PARAM-NEXT:           "kind": "text",
175 // PARAM-NEXT:           "spelling": ")) "
176 // PARAM-NEXT:         },
177 // PARAM-NEXT:         {
178 // PARAM-NEXT:           "kind": "internalParam",
179 // PARAM-NEXT:           "spelling": "block"
180 // PARAM-NEXT:         }
181 // PARAM-NEXT:       ],
182 // PARAM-NEXT:       "name": "block"
183 // PARAM-NEXT:     }
184 // PARAM-NEXT:   ],
185 // PARAM-NEXT:   "returns": [
186 // PARAM-NEXT:     {
187 // PARAM-NEXT:       "kind": "typeIdentifier",
188 // PARAM-NEXT:       "preciseIdentifier": "c:v",
189 // PARAM-NEXT:       "spelling": "void"
190 // PARAM-NEXT:     }
191 // PARAM-NEXT:   ]
192 // PARAM-NEXT: }
194 // RUN: FileCheck %s --input-file %t/output.symbols.json --check-prefix MULTIPARAM
195 -(void)methodBlockWithMultipleParam:(int (^)(int foo, unsigned baz))block;
196 // MULTIPARAM-LABEL: "!testLabel": "c:objc(cs)Foo(im)methodBlockWithMultipleParam:"
197 // MULTIPARAM:      "declarationFragments": [
198 // MULTIPARAM-NEXT:   {
199 // MULTIPARAM-NEXT:     "kind": "text",
200 // MULTIPARAM-NEXT:     "spelling": "- ("
201 // MULTIPARAM-NEXT:   },
202 // MULTIPARAM-NEXT:   {
203 // MULTIPARAM-NEXT:     "kind": "typeIdentifier",
204 // MULTIPARAM-NEXT:     "preciseIdentifier": "c:v",
205 // MULTIPARAM-NEXT:     "spelling": "void"
206 // MULTIPARAM-NEXT:   },
207 // MULTIPARAM-NEXT:   {
208 // MULTIPARAM-NEXT:     "kind": "text",
209 // MULTIPARAM-NEXT:     "spelling": ") "
210 // MULTIPARAM-NEXT:   },
211 // MULTIPARAM-NEXT:   {
212 // MULTIPARAM-NEXT:     "kind": "identifier",
213 // MULTIPARAM-NEXT:     "spelling": "methodBlockWithMultipleParam:"
214 // MULTIPARAM-NEXT:   },
215 // MULTIPARAM-NEXT:   {
216 // MULTIPARAM-NEXT:     "kind": "text",
217 // MULTIPARAM-NEXT:     "spelling": "("
218 // MULTIPARAM-NEXT:   },
219 // MULTIPARAM-NEXT:   {
220 // MULTIPARAM-NEXT:     "kind": "typeIdentifier",
221 // MULTIPARAM-NEXT:     "preciseIdentifier": "c:I",
222 // MULTIPARAM-NEXT:     "spelling": "int"
223 // MULTIPARAM-NEXT:   },
224 // MULTIPARAM-NEXT:   {
225 // MULTIPARAM-NEXT:     "kind": "text",
226 // MULTIPARAM-NEXT:     "spelling": " (^)("
227 // MULTIPARAM-NEXT:   },
228 // MULTIPARAM-NEXT:   {
229 // MULTIPARAM-NEXT:     "kind": "typeIdentifier",
230 // MULTIPARAM-NEXT:     "preciseIdentifier": "c:I",
231 // MULTIPARAM-NEXT:     "spelling": "int"
232 // MULTIPARAM-NEXT:   },
233 // MULTIPARAM-NEXT:   {
234 // MULTIPARAM-NEXT:     "kind": "text",
235 // MULTIPARAM-NEXT:     "spelling": " "
236 // MULTIPARAM-NEXT:   },
237 // MULTIPARAM-NEXT:   {
238 // MULTIPARAM-NEXT:     "kind": "internalParam",
239 // MULTIPARAM-NEXT:     "spelling": "foo"
240 // MULTIPARAM-NEXT:   },
241 // MULTIPARAM-NEXT:   {
242 // MULTIPARAM-NEXT:     "kind": "text",
243 // MULTIPARAM-NEXT:     "spelling": ", "
244 // MULTIPARAM-NEXT:   },
245 // MULTIPARAM-NEXT:   {
246 // MULTIPARAM-NEXT:     "kind": "typeIdentifier",
247 // MULTIPARAM-NEXT:     "preciseIdentifier": "c:i",
248 // MULTIPARAM-NEXT:     "spelling": "unsigned int"
249 // MULTIPARAM-NEXT:   },
250 // MULTIPARAM-NEXT:   {
251 // MULTIPARAM-NEXT:     "kind": "text",
252 // MULTIPARAM-NEXT:     "spelling": " "
253 // MULTIPARAM-NEXT:   },
254 // MULTIPARAM-NEXT:   {
255 // MULTIPARAM-NEXT:     "kind": "internalParam",
256 // MULTIPARAM-NEXT:     "spelling": "baz"
257 // MULTIPARAM-NEXT:   },
258 // MULTIPARAM-NEXT:   {
259 // MULTIPARAM-NEXT:     "kind": "text",
260 // MULTIPARAM-NEXT:     "spelling": ")) "
261 // MULTIPARAM-NEXT:   },
262 // MULTIPARAM-NEXT:   {
263 // MULTIPARAM-NEXT:     "kind": "internalParam",
264 // MULTIPARAM-NEXT:     "spelling": "block"
265 // MULTIPARAM-NEXT:   },
266 // MULTIPARAM-NEXT:   {
267 // MULTIPARAM-NEXT:     "kind": "text",
268 // MULTIPARAM-NEXT:     "spelling": ";"
269 // MULTIPARAM-NEXT:   }
270 // MULTIPARAM-NEXT: ],
271 // MULTIPARAM:      "functionSignature": {
272 // MULTIPARAM-NEXT:   "parameters": [
273 // MULTIPARAM-NEXT:     {
274 // MULTIPARAM-NEXT:       "declarationFragments": [
275 // MULTIPARAM-NEXT:         {
276 // MULTIPARAM-NEXT:           "kind": "text",
277 // MULTIPARAM-NEXT:           "spelling": "("
278 // MULTIPARAM-NEXT:         },
279 // MULTIPARAM-NEXT:         {
280 // MULTIPARAM-NEXT:           "kind": "typeIdentifier",
281 // MULTIPARAM-NEXT:           "preciseIdentifier": "c:I",
282 // MULTIPARAM-NEXT:           "spelling": "int"
283 // MULTIPARAM-NEXT:         },
284 // MULTIPARAM-NEXT:         {
285 // MULTIPARAM-NEXT:           "kind": "text",
286 // MULTIPARAM-NEXT:           "spelling": " (^)("
287 // MULTIPARAM-NEXT:         },
288 // MULTIPARAM-NEXT:         {
289 // MULTIPARAM-NEXT:           "kind": "typeIdentifier",
290 // MULTIPARAM-NEXT:           "preciseIdentifier": "c:I",
291 // MULTIPARAM-NEXT:           "spelling": "int"
292 // MULTIPARAM-NEXT:         },
293 // MULTIPARAM-NEXT:         {
294 // MULTIPARAM-NEXT:           "kind": "text",
295 // MULTIPARAM-NEXT:           "spelling": " "
296 // MULTIPARAM-NEXT:         },
297 // MULTIPARAM-NEXT:         {
298 // MULTIPARAM-NEXT:           "kind": "internalParam",
299 // MULTIPARAM-NEXT:           "spelling": "foo"
300 // MULTIPARAM-NEXT:         },
301 // MULTIPARAM-NEXT:         {
302 // MULTIPARAM-NEXT:           "kind": "text",
303 // MULTIPARAM-NEXT:           "spelling": ", "
304 // MULTIPARAM-NEXT:         },
305 // MULTIPARAM-NEXT:         {
306 // MULTIPARAM-NEXT:           "kind": "typeIdentifier",
307 // MULTIPARAM-NEXT:           "preciseIdentifier": "c:i",
308 // MULTIPARAM-NEXT:           "spelling": "unsigned int"
309 // MULTIPARAM-NEXT:         },
310 // MULTIPARAM-NEXT:         {
311 // MULTIPARAM-NEXT:           "kind": "text",
312 // MULTIPARAM-NEXT:           "spelling": " "
313 // MULTIPARAM-NEXT:         },
314 // MULTIPARAM-NEXT:         {
315 // MULTIPARAM-NEXT:           "kind": "internalParam",
316 // MULTIPARAM-NEXT:           "spelling": "baz"
317 // MULTIPARAM-NEXT:         },
318 // MULTIPARAM-NEXT:         {
319 // MULTIPARAM-NEXT:           "kind": "text",
320 // MULTIPARAM-NEXT:           "spelling": ")) "
321 // MULTIPARAM-NEXT:         },
322 // MULTIPARAM-NEXT:         {
323 // MULTIPARAM-NEXT:           "kind": "internalParam",
324 // MULTIPARAM-NEXT:           "spelling": "block"
325 // MULTIPARAM-NEXT:         }
326 // MULTIPARAM-NEXT:       ],
327 // MULTIPARAM-NEXT:       "name": "block"
328 // MULTIPARAM-NEXT:     }
329 // MULTIPARAM-NEXT:   ],
330 // MULTIPARAM-NEXT:   "returns": [
331 // MULTIPARAM-NEXT:     {
332 // MULTIPARAM-NEXT:       "kind": "typeIdentifier",
333 // MULTIPARAM-NEXT:       "preciseIdentifier": "c:v",
334 // MULTIPARAM-NEXT:       "spelling": "void"
335 // MULTIPARAM-NEXT:     }
336 // MULTIPARAM-NEXT:   ]
337 // MULTIPARAM-NEXT: },
339 // RUN: FileCheck %s --input-file %t/output.symbols.json --check-prefix VARIADIC
340 -(void)methodBlockVariadic:(int (^)(int foo, ...))block;
341 // VARIADIC-LABEL: "!testLabel": "c:objc(cs)Foo(im)methodBlockVariadic:"
342 // VARIADIC:      "declarationFragments": [
343 // VARIADIC-NEXT:   {
344 // VARIADIC-NEXT:     "kind": "text",
345 // VARIADIC-NEXT:     "spelling": "- ("
346 // VARIADIC-NEXT:   },
347 // VARIADIC-NEXT:   {
348 // VARIADIC-NEXT:     "kind": "typeIdentifier",
349 // VARIADIC-NEXT:     "preciseIdentifier": "c:v",
350 // VARIADIC-NEXT:     "spelling": "void"
351 // VARIADIC-NEXT:   },
352 // VARIADIC-NEXT:   {
353 // VARIADIC-NEXT:     "kind": "text",
354 // VARIADIC-NEXT:     "spelling": ") "
355 // VARIADIC-NEXT:   },
356 // VARIADIC-NEXT:   {
357 // VARIADIC-NEXT:     "kind": "identifier",
358 // VARIADIC-NEXT:     "spelling": "methodBlockVariadic:"
359 // VARIADIC-NEXT:   },
360 // VARIADIC-NEXT:   {
361 // VARIADIC-NEXT:     "kind": "text",
362 // VARIADIC-NEXT:     "spelling": "("
363 // VARIADIC-NEXT:   },
364 // VARIADIC-NEXT:   {
365 // VARIADIC-NEXT:     "kind": "typeIdentifier",
366 // VARIADIC-NEXT:     "preciseIdentifier": "c:I",
367 // VARIADIC-NEXT:     "spelling": "int"
368 // VARIADIC-NEXT:   },
369 // VARIADIC-NEXT:   {
370 // VARIADIC-NEXT:     "kind": "text",
371 // VARIADIC-NEXT:     "spelling": " (^)("
372 // VARIADIC-NEXT:   },
373 // VARIADIC-NEXT:   {
374 // VARIADIC-NEXT:     "kind": "typeIdentifier",
375 // VARIADIC-NEXT:     "preciseIdentifier": "c:I",
376 // VARIADIC-NEXT:     "spelling": "int"
377 // VARIADIC-NEXT:   },
378 // VARIADIC-NEXT:   {
379 // VARIADIC-NEXT:     "kind": "text",
380 // VARIADIC-NEXT:     "spelling": " "
381 // VARIADIC-NEXT:   },
382 // VARIADIC-NEXT:   {
383 // VARIADIC-NEXT:     "kind": "internalParam",
384 // VARIADIC-NEXT:     "spelling": "foo"
385 // VARIADIC-NEXT:   },
386 // VARIADIC-NEXT:   {
387 // VARIADIC-NEXT:     "kind": "text",
388 // VARIADIC-NEXT:     "spelling": ", ...)) "
389 // VARIADIC-NEXT:   },
390 // VARIADIC-NEXT:   {
391 // VARIADIC-NEXT:     "kind": "internalParam",
392 // VARIADIC-NEXT:     "spelling": "block"
393 // VARIADIC-NEXT:   },
394 // VARIADIC-NEXT:   {
395 // VARIADIC-NEXT:     "kind": "text",
396 // VARIADIC-NEXT:     "spelling": ";"
397 // VARIADIC-NEXT:   }
398 // VARIADIC-NEXT: ],
399 // VARIADIC:      "functionSignature": {
400 // VARIADIC-NEXT:   "parameters": [
401 // VARIADIC-NEXT:     {
402 // VARIADIC-NEXT:       "declarationFragments": [
403 // VARIADIC-NEXT:         {
404 // VARIADIC-NEXT:           "kind": "text",
405 // VARIADIC-NEXT:           "spelling": "("
406 // VARIADIC-NEXT:         },
407 // VARIADIC-NEXT:         {
408 // VARIADIC-NEXT:           "kind": "typeIdentifier",
409 // VARIADIC-NEXT:           "preciseIdentifier": "c:I",
410 // VARIADIC-NEXT:           "spelling": "int"
411 // VARIADIC-NEXT:         },
412 // VARIADIC-NEXT:         {
413 // VARIADIC-NEXT:           "kind": "text",
414 // VARIADIC-NEXT:           "spelling": " (^)("
415 // VARIADIC-NEXT:         },
416 // VARIADIC-NEXT:         {
417 // VARIADIC-NEXT:           "kind": "typeIdentifier",
418 // VARIADIC-NEXT:           "preciseIdentifier": "c:I",
419 // VARIADIC-NEXT:           "spelling": "int"
420 // VARIADIC-NEXT:         },
421 // VARIADIC-NEXT:         {
422 // VARIADIC-NEXT:           "kind": "text",
423 // VARIADIC-NEXT:           "spelling": " "
424 // VARIADIC-NEXT:         },
425 // VARIADIC-NEXT:         {
426 // VARIADIC-NEXT:           "kind": "internalParam",
427 // VARIADIC-NEXT:           "spelling": "foo"
428 // VARIADIC-NEXT:         },
429 // VARIADIC-NEXT:         {
430 // VARIADIC-NEXT:           "kind": "text",
431 // VARIADIC-NEXT:           "spelling": ", ...)) "
432 // VARIADIC-NEXT:         },
433 // VARIADIC-NEXT:         {
434 // VARIADIC-NEXT:           "kind": "internalParam",
435 // VARIADIC-NEXT:           "spelling": "block"
436 // VARIADIC-NEXT:         }
437 // VARIADIC-NEXT:       ],
438 // VARIADIC-NEXT:       "name": "block"
439 // VARIADIC-NEXT:     }
440 // VARIADIC-NEXT:   ],
441 // VARIADIC-NEXT:   "returns": [
442 // VARIADIC-NEXT:     {
443 // VARIADIC-NEXT:       "kind": "typeIdentifier",
444 // VARIADIC-NEXT:       "preciseIdentifier": "c:v",
445 // VARIADIC-NEXT:       "spelling": "void"
446 // VARIADIC-NEXT:     }
447 // VARIADIC-NEXT:   ]
448 // VARIADIC-NEXT: },
449 @end
451 // RUN: FileCheck %s --input-file %t/output.symbols.json --check-prefix FUNC
452 void func(int (^arg)(int foo));
453 // FUNC-LABEL: "!testLabel": "c:@F@func"
454 // FUNC:      "declarationFragments": [
455 // FUNC-NEXT:   {
456 // FUNC-NEXT:     "kind": "typeIdentifier",
457 // FUNC-NEXT:     "preciseIdentifier": "c:v",
458 // FUNC-NEXT:     "spelling": "void"
459 // FUNC-NEXT:   },
460 // FUNC-NEXT:   {
461 // FUNC-NEXT:     "kind": "text",
462 // FUNC-NEXT:     "spelling": " "
463 // FUNC-NEXT:   },
464 // FUNC-NEXT:   {
465 // FUNC-NEXT:     "kind": "identifier",
466 // FUNC-NEXT:     "spelling": "func"
467 // FUNC-NEXT:   },
468 // FUNC-NEXT:   {
469 // FUNC-NEXT:     "kind": "text",
470 // FUNC-NEXT:     "spelling": "("
471 // FUNC-NEXT:   },
472 // FUNC-NEXT:   {
473 // FUNC-NEXT:     "kind": "typeIdentifier",
474 // FUNC-NEXT:     "preciseIdentifier": "c:I",
475 // FUNC-NEXT:     "spelling": "int"
476 // FUNC-NEXT:   },
477 // FUNC-NEXT:   {
478 // FUNC-NEXT:     "kind": "text",
479 // FUNC-NEXT:     "spelling": " (^"
480 // FUNC-NEXT:   },
481 // FUNC-NEXT:   {
482 // FUNC-NEXT:     "kind": "internalParam",
483 // FUNC-NEXT:     "spelling": "arg"
484 // FUNC-NEXT:   },
485 // FUNC-NEXT:   {
486 // FUNC-NEXT:     "kind": "text",
487 // FUNC-NEXT:     "spelling": ")("
488 // FUNC-NEXT:   },
489 // FUNC-NEXT:   {
490 // FUNC-NEXT:     "kind": "typeIdentifier",
491 // FUNC-NEXT:     "preciseIdentifier": "c:I",
492 // FUNC-NEXT:     "spelling": "int"
493 // FUNC-NEXT:   },
494 // FUNC-NEXT:   {
495 // FUNC-NEXT:     "kind": "text",
496 // FUNC-NEXT:     "spelling": " "
497 // FUNC-NEXT:   },
498 // FUNC-NEXT:   {
499 // FUNC-NEXT:     "kind": "internalParam",
500 // FUNC-NEXT:     "spelling": "foo"
501 // FUNC-NEXT:   },
502 // FUNC-NEXT:   {
503 // FUNC-NEXT:     "kind": "text",
504 // FUNC-NEXT:     "spelling": "));"
505 // FUNC-NEXT:   }
506 // FUNC-NEXT: ],
507 // FUNC:      "functionSignature": {
508 // FUNC-NEXT:   "parameters": [
509 // FUNC-NEXT:     {
510 // FUNC-NEXT:       "declarationFragments": [
511 // FUNC-NEXT:         {
512 // FUNC-NEXT:           "kind": "typeIdentifier",
513 // FUNC-NEXT:           "preciseIdentifier": "c:I",
514 // FUNC-NEXT:           "spelling": "int"
515 // FUNC-NEXT:         },
516 // FUNC-NEXT:         {
517 // FUNC-NEXT:           "kind": "text",
518 // FUNC-NEXT:           "spelling": " (^"
519 // FUNC-NEXT:         },
520 // FUNC-NEXT:         {
521 // FUNC-NEXT:           "kind": "internalParam",
522 // FUNC-NEXT:           "spelling": "arg"
523 // FUNC-NEXT:         },
524 // FUNC-NEXT:         {
525 // FUNC-NEXT:           "kind": "text",
526 // FUNC-NEXT:           "spelling": ")("
527 // FUNC-NEXT:         },
528 // FUNC-NEXT:         {
529 // FUNC-NEXT:           "kind": "typeIdentifier",
530 // FUNC-NEXT:           "preciseIdentifier": "c:I",
531 // FUNC-NEXT:           "spelling": "int"
532 // FUNC-NEXT:         },
533 // FUNC-NEXT:         {
534 // FUNC-NEXT:           "kind": "text",
535 // FUNC-NEXT:           "spelling": " "
536 // FUNC-NEXT:         },
537 // FUNC-NEXT:         {
538 // FUNC-NEXT:           "kind": "internalParam",
539 // FUNC-NEXT:           "spelling": "foo"
540 // FUNC-NEXT:         },
541 // FUNC-NEXT:         {
542 // FUNC-NEXT:           "kind": "text",
543 // FUNC-NEXT:           "spelling": ")"
544 // FUNC-NEXT:         }
545 // FUNC-NEXT:       ],
546 // FUNC-NEXT:       "name": "arg"
547 // FUNC-NEXT:     }
548 // FUNC-NEXT:   ],
549 // FUNC-NEXT:   "returns": [
550 // FUNC-NEXT:     {
551 // FUNC-NEXT:       "kind": "typeIdentifier",
552 // FUNC-NEXT:       "preciseIdentifier": "c:v",
553 // FUNC-NEXT:       "spelling": "void"
554 // FUNC-NEXT:     }
555 // FUNC-NEXT:   ]
556 // FUNC-NEXT: },
558 // RUN: FileCheck %s --input-file %t/output.symbols.json --check-prefix GLOBAL
559 int (^global)(int foo);
560 // GLOBAL-LABEL: "!testLabel": "c:@global"
561 // GLOBAL:      "declarationFragments": [
562 // GLOBAL-NEXT:   {
563 // GLOBAL-NEXT:     "kind": "typeIdentifier",
564 // GLOBAL-NEXT:     "preciseIdentifier": "c:I",
565 // GLOBAL-NEXT:     "spelling": "int"
566 // GLOBAL-NEXT:   },
567 // GLOBAL-NEXT:   {
568 // GLOBAL-NEXT:     "kind": "text",
569 // GLOBAL-NEXT:     "spelling": " (^"
570 // GLOBAL-NEXT:   },
571 // GLOBAL-NEXT:   {
572 // GLOBAL-NEXT:     "kind": "identifier",
573 // GLOBAL-NEXT:     "spelling": "global"
574 // GLOBAL-NEXT:   },
575 // GLOBAL-NEXT:   {
576 // GLOBAL-NEXT:     "kind": "text",
577 // GLOBAL-NEXT:     "spelling": ")("
578 // GLOBAL-NEXT:   },
579 // GLOBAL-NEXT:   {
580 // GLOBAL-NEXT:     "kind": "typeIdentifier",
581 // GLOBAL-NEXT:     "preciseIdentifier": "c:I",
582 // GLOBAL-NEXT:     "spelling": "int"
583 // GLOBAL-NEXT:   },
584 // GLOBAL-NEXT:   {
585 // GLOBAL-NEXT:     "kind": "text",
586 // GLOBAL-NEXT:     "spelling": " "
587 // GLOBAL-NEXT:   },
588 // GLOBAL-NEXT:   {
589 // GLOBAL-NEXT:     "kind": "internalParam",
590 // GLOBAL-NEXT:     "spelling": "foo"
591 // GLOBAL-NEXT:   },
592 // GLOBAL-NEXT:   {
593 // GLOBAL-NEXT:     "kind": "text",
594 // GLOBAL-NEXT:     "spelling": ");"
595 // GLOBAL-NEXT:   }
596 // GLOBAL-NEXT: ],
598 ///expected-no-diagnostics