xref: /llvm-project/clang/test/ExtractAPI/objc_block.m (revision 2bcbe40f8a1c6cc9a256711261d8aa8fde50f7b3)
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
4
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: }
82
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: }
193
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: },
338
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
450
451// RUN: FileCheck %s --input-file %t/output.symbols.json --check-prefix FUNC
452void 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: },
557
558// RUN: FileCheck %s --input-file %t/output.symbols.json --check-prefix GLOBAL
559int (^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: ],
597
598///expected-no-diagnostics
599