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