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
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": [
11 // NOPARAM-NEXT: "kind": "text",
12 // NOPARAM-NEXT: "spelling": "- ("
15 // NOPARAM-NEXT: "kind": "typeIdentifier",
16 // NOPARAM-NEXT: "preciseIdentifier": "c:v",
17 // NOPARAM-NEXT: "spelling": "void"
20 // NOPARAM-NEXT: "kind": "text",
21 // NOPARAM-NEXT: "spelling": ") "
24 // NOPARAM-NEXT: "kind": "identifier",
25 // NOPARAM-NEXT: "spelling": "methodBlockNoParam:"
28 // NOPARAM-NEXT: "kind": "text",
29 // NOPARAM-NEXT: "spelling": "("
32 // NOPARAM-NEXT: "kind": "typeIdentifier",
33 // NOPARAM-NEXT: "preciseIdentifier": "c:v",
34 // NOPARAM-NEXT: "spelling": "void"
37 // NOPARAM-NEXT: "kind": "text",
38 // NOPARAM-NEXT: "spelling": " (^)()) "
41 // NOPARAM-NEXT: "kind": "internalParam",
42 // NOPARAM-NEXT: "spelling": "block"
45 // NOPARAM-NEXT: "kind": "text",
46 // NOPARAM-NEXT: "spelling": ";"
49 // NOPARAM: "functionSignature": {
50 // NOPARAM-NEXT: "parameters": [
52 // NOPARAM-NEXT: "declarationFragments": [
54 // NOPARAM-NEXT: "kind": "text",
55 // NOPARAM-NEXT: "spelling": "("
58 // NOPARAM-NEXT: "kind": "typeIdentifier",
59 // NOPARAM-NEXT: "preciseIdentifier": "c:v",
60 // NOPARAM-NEXT: "spelling": "void"
63 // NOPARAM-NEXT: "kind": "text",
64 // NOPARAM-NEXT: "spelling": " (^)()) "
67 // NOPARAM-NEXT: "kind": "internalParam",
68 // NOPARAM-NEXT: "spelling": "block"
71 // NOPARAM-NEXT: "name": "block"
74 // NOPARAM-NEXT: "returns": [
76 // NOPARAM-NEXT: "kind": "typeIdentifier",
77 // NOPARAM-NEXT: "preciseIdentifier": "c:v",
78 // NOPARAM-NEXT: "spelling": "void"
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": [
88 // PARAM-NEXT: "kind": "text",
89 // PARAM-NEXT: "spelling": "- ("
92 // PARAM-NEXT: "kind": "typeIdentifier",
93 // PARAM-NEXT: "preciseIdentifier": "c:v",
94 // PARAM-NEXT: "spelling": "void"
97 // PARAM-NEXT: "kind": "text",
98 // PARAM-NEXT: "spelling": ") "
101 // PARAM-NEXT: "kind": "identifier",
102 // PARAM-NEXT: "spelling": "methodBlockWithParam:"
105 // PARAM-NEXT: "kind": "text",
106 // PARAM-NEXT: "spelling": "("
109 // PARAM-NEXT: "kind": "typeIdentifier",
110 // PARAM-NEXT: "preciseIdentifier": "c:I",
111 // PARAM-NEXT: "spelling": "int"
114 // PARAM-NEXT: "kind": "text",
115 // PARAM-NEXT: "spelling": " (^)("
118 // PARAM-NEXT: "kind": "typeIdentifier",
119 // PARAM-NEXT: "preciseIdentifier": "c:I",
120 // PARAM-NEXT: "spelling": "int"
123 // PARAM-NEXT: "kind": "text",
124 // PARAM-NEXT: "spelling": " "
127 // PARAM-NEXT: "kind": "internalParam",
128 // PARAM-NEXT: "spelling": "foo"
131 // PARAM-NEXT: "kind": "text",
132 // PARAM-NEXT: "spelling": ")) "
135 // PARAM-NEXT: "kind": "internalParam",
136 // PARAM-NEXT: "spelling": "block"
139 // PARAM-NEXT: "kind": "text",
140 // PARAM-NEXT: "spelling": ";"
143 // PARAM: "functionSignature": {
144 // PARAM-NEXT: "parameters": [
146 // PARAM-NEXT: "declarationFragments": [
148 // PARAM-NEXT: "kind": "text",
149 // PARAM-NEXT: "spelling": "("
152 // PARAM-NEXT: "kind": "typeIdentifier",
153 // PARAM-NEXT: "preciseIdentifier": "c:I",
154 // PARAM-NEXT: "spelling": "int"
157 // PARAM-NEXT: "kind": "text",
158 // PARAM-NEXT: "spelling": " (^)("
161 // PARAM-NEXT: "kind": "typeIdentifier",
162 // PARAM-NEXT: "preciseIdentifier": "c:I",
163 // PARAM-NEXT: "spelling": "int"
166 // PARAM-NEXT: "kind": "text",
167 // PARAM-NEXT: "spelling": " "
170 // PARAM-NEXT: "kind": "internalParam",
171 // PARAM-NEXT: "spelling": "foo"
174 // PARAM-NEXT: "kind": "text",
175 // PARAM-NEXT: "spelling": ")) "
178 // PARAM-NEXT: "kind": "internalParam",
179 // PARAM-NEXT: "spelling": "block"
182 // PARAM-NEXT: "name": "block"
185 // PARAM-NEXT: "returns": [
187 // PARAM-NEXT: "kind": "typeIdentifier",
188 // PARAM-NEXT: "preciseIdentifier": "c:v",
189 // PARAM-NEXT: "spelling": "void"
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": [
344 // VARIADIC-NEXT: "kind": "text",
345 // VARIADIC-NEXT: "spelling": "- ("
348 // VARIADIC-NEXT: "kind": "typeIdentifier",
349 // VARIADIC-NEXT: "preciseIdentifier": "c:v",
350 // VARIADIC-NEXT: "spelling": "void"
353 // VARIADIC-NEXT: "kind": "text",
354 // VARIADIC-NEXT: "spelling": ") "
357 // VARIADIC-NEXT: "kind": "identifier",
358 // VARIADIC-NEXT: "spelling": "methodBlockVariadic:"
361 // VARIADIC-NEXT: "kind": "text",
362 // VARIADIC-NEXT: "spelling": "("
365 // VARIADIC-NEXT: "kind": "typeIdentifier",
366 // VARIADIC-NEXT: "preciseIdentifier": "c:I",
367 // VARIADIC-NEXT: "spelling": "int"
370 // VARIADIC-NEXT: "kind": "text",
371 // VARIADIC-NEXT: "spelling": " (^)("
374 // VARIADIC-NEXT: "kind": "typeIdentifier",
375 // VARIADIC-NEXT: "preciseIdentifier": "c:I",
376 // VARIADIC-NEXT: "spelling": "int"
379 // VARIADIC-NEXT: "kind": "text",
380 // VARIADIC-NEXT: "spelling": " "
383 // VARIADIC-NEXT: "kind": "internalParam",
384 // VARIADIC-NEXT: "spelling": "foo"
387 // VARIADIC-NEXT: "kind": "text",
388 // VARIADIC-NEXT: "spelling": ", ...)) "
391 // VARIADIC-NEXT: "kind": "internalParam",
392 // VARIADIC-NEXT: "spelling": "block"
395 // VARIADIC-NEXT: "kind": "text",
396 // VARIADIC-NEXT: "spelling": ";"
399 // VARIADIC: "functionSignature": {
400 // VARIADIC-NEXT: "parameters": [
402 // VARIADIC-NEXT: "declarationFragments": [
404 // VARIADIC-NEXT: "kind": "text",
405 // VARIADIC-NEXT: "spelling": "("
408 // VARIADIC-NEXT: "kind": "typeIdentifier",
409 // VARIADIC-NEXT: "preciseIdentifier": "c:I",
410 // VARIADIC-NEXT: "spelling": "int"
413 // VARIADIC-NEXT: "kind": "text",
414 // VARIADIC-NEXT: "spelling": " (^)("
417 // VARIADIC-NEXT: "kind": "typeIdentifier",
418 // VARIADIC-NEXT: "preciseIdentifier": "c:I",
419 // VARIADIC-NEXT: "spelling": "int"
422 // VARIADIC-NEXT: "kind": "text",
423 // VARIADIC-NEXT: "spelling": " "
426 // VARIADIC-NEXT: "kind": "internalParam",
427 // VARIADIC-NEXT: "spelling": "foo"
430 // VARIADIC-NEXT: "kind": "text",
431 // VARIADIC-NEXT: "spelling": ", ...)) "
434 // VARIADIC-NEXT: "kind": "internalParam",
435 // VARIADIC-NEXT: "spelling": "block"
438 // VARIADIC-NEXT: "name": "block"
441 // VARIADIC-NEXT: "returns": [
443 // VARIADIC-NEXT: "kind": "typeIdentifier",
444 // VARIADIC-NEXT: "preciseIdentifier": "c:v",
445 // VARIADIC-NEXT: "spelling": "void"
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": [
456 // FUNC-NEXT: "kind": "typeIdentifier",
457 // FUNC-NEXT: "preciseIdentifier": "c:v",
458 // FUNC-NEXT: "spelling": "void"
461 // FUNC-NEXT: "kind": "text",
462 // FUNC-NEXT: "spelling": " "
465 // FUNC-NEXT: "kind": "identifier",
466 // FUNC-NEXT: "spelling": "func"
469 // FUNC-NEXT: "kind": "text",
470 // FUNC-NEXT: "spelling": "("
473 // FUNC-NEXT: "kind": "typeIdentifier",
474 // FUNC-NEXT: "preciseIdentifier": "c:I",
475 // FUNC-NEXT: "spelling": "int"
478 // FUNC-NEXT: "kind": "text",
479 // FUNC-NEXT: "spelling": " (^"
482 // FUNC-NEXT: "kind": "internalParam",
483 // FUNC-NEXT: "spelling": "arg"
486 // FUNC-NEXT: "kind": "text",
487 // FUNC-NEXT: "spelling": ")("
490 // FUNC-NEXT: "kind": "typeIdentifier",
491 // FUNC-NEXT: "preciseIdentifier": "c:I",
492 // FUNC-NEXT: "spelling": "int"
495 // FUNC-NEXT: "kind": "text",
496 // FUNC-NEXT: "spelling": " "
499 // FUNC-NEXT: "kind": "internalParam",
500 // FUNC-NEXT: "spelling": "foo"
503 // FUNC-NEXT: "kind": "text",
504 // FUNC-NEXT: "spelling": "));"
507 // FUNC: "functionSignature": {
508 // FUNC-NEXT: "parameters": [
510 // FUNC-NEXT: "declarationFragments": [
512 // FUNC-NEXT: "kind": "typeIdentifier",
513 // FUNC-NEXT: "preciseIdentifier": "c:I",
514 // FUNC-NEXT: "spelling": "int"
517 // FUNC-NEXT: "kind": "text",
518 // FUNC-NEXT: "spelling": " (^"
521 // FUNC-NEXT: "kind": "internalParam",
522 // FUNC-NEXT: "spelling": "arg"
525 // FUNC-NEXT: "kind": "text",
526 // FUNC-NEXT: "spelling": ")("
529 // FUNC-NEXT: "kind": "typeIdentifier",
530 // FUNC-NEXT: "preciseIdentifier": "c:I",
531 // FUNC-NEXT: "spelling": "int"
534 // FUNC-NEXT: "kind": "text",
535 // FUNC-NEXT: "spelling": " "
538 // FUNC-NEXT: "kind": "internalParam",
539 // FUNC-NEXT: "spelling": "foo"
542 // FUNC-NEXT: "kind": "text",
543 // FUNC-NEXT: "spelling": ")"
546 // FUNC-NEXT: "name": "arg"
549 // FUNC-NEXT: "returns": [
551 // FUNC-NEXT: "kind": "typeIdentifier",
552 // FUNC-NEXT: "preciseIdentifier": "c:v",
553 // FUNC-NEXT: "spelling": "void"
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": [
563 // GLOBAL-NEXT: "kind": "typeIdentifier",
564 // GLOBAL-NEXT: "preciseIdentifier": "c:I",
565 // GLOBAL-NEXT: "spelling": "int"
568 // GLOBAL-NEXT: "kind": "text",
569 // GLOBAL-NEXT: "spelling": " (^"
572 // GLOBAL-NEXT: "kind": "identifier",
573 // GLOBAL-NEXT: "spelling": "global"
576 // GLOBAL-NEXT: "kind": "text",
577 // GLOBAL-NEXT: "spelling": ")("
580 // GLOBAL-NEXT: "kind": "typeIdentifier",
581 // GLOBAL-NEXT: "preciseIdentifier": "c:I",
582 // GLOBAL-NEXT: "spelling": "int"
585 // GLOBAL-NEXT: "kind": "text",
586 // GLOBAL-NEXT: "spelling": " "
589 // GLOBAL-NEXT: "kind": "internalParam",
590 // GLOBAL-NEXT: "spelling": "foo"
593 // GLOBAL-NEXT: "kind": "text",
594 // GLOBAL-NEXT: "spelling": ");"
598 ///expected-no-diagnostics