| // RUN: rm -rf %t | 
 | // RUN: %clang_cc1 -extract-api --pretty-sgf --emit-sgf-symbol-labels-for-testing \ | 
 | // RUN:   -fblocks -triple arm64-apple-macosx -x objective-c-header %s -o %t/output.symbols.json -verify | 
 |  | 
 | @interface Foo | 
 | // RUN: FileCheck %s --input-file %t/output.symbols.json --check-prefix NOPARAM | 
 | -(void)methodBlockNoParam:(void (^)())block; | 
 | // NOPARAM-LABEL: "!testLabel": "c:objc(cs)Foo(im)methodBlockNoParam:" | 
 | // NOPARAM:      "declarationFragments": [ | 
 | // NOPARAM-NEXT:   { | 
 | // NOPARAM-NEXT:     "kind": "text", | 
 | // NOPARAM-NEXT:     "spelling": "- (" | 
 | // NOPARAM-NEXT:   }, | 
 | // NOPARAM-NEXT:   { | 
 | // NOPARAM-NEXT:     "kind": "typeIdentifier", | 
 | // NOPARAM-NEXT:     "preciseIdentifier": "c:v", | 
 | // NOPARAM-NEXT:     "spelling": "void" | 
 | // NOPARAM-NEXT:   }, | 
 | // NOPARAM-NEXT:   { | 
 | // NOPARAM-NEXT:     "kind": "text", | 
 | // NOPARAM-NEXT:     "spelling": ") " | 
 | // NOPARAM-NEXT:   }, | 
 | // NOPARAM-NEXT:   { | 
 | // NOPARAM-NEXT:     "kind": "identifier", | 
 | // NOPARAM-NEXT:     "spelling": "methodBlockNoParam:" | 
 | // NOPARAM-NEXT:   }, | 
 | // NOPARAM-NEXT:   { | 
 | // NOPARAM-NEXT:     "kind": "text", | 
 | // NOPARAM-NEXT:     "spelling": "(" | 
 | // NOPARAM-NEXT:   }, | 
 | // NOPARAM-NEXT:   { | 
 | // NOPARAM-NEXT:     "kind": "typeIdentifier", | 
 | // NOPARAM-NEXT:     "preciseIdentifier": "c:v", | 
 | // NOPARAM-NEXT:     "spelling": "void" | 
 | // NOPARAM-NEXT:   }, | 
 | // NOPARAM-NEXT:   { | 
 | // NOPARAM-NEXT:     "kind": "text", | 
 | // NOPARAM-NEXT:     "spelling": " (^)()) " | 
 | // NOPARAM-NEXT:   }, | 
 | // NOPARAM-NEXT:   { | 
 | // NOPARAM-NEXT:     "kind": "internalParam", | 
 | // NOPARAM-NEXT:     "spelling": "block" | 
 | // NOPARAM-NEXT:   }, | 
 | // NOPARAM-NEXT:   { | 
 | // NOPARAM-NEXT:     "kind": "text", | 
 | // NOPARAM-NEXT:     "spelling": ";" | 
 | // NOPARAM-NEXT:   } | 
 | // NOPARAM-NEXT: ], | 
 | // NOPARAM:      "functionSignature": { | 
 | // NOPARAM-NEXT:   "parameters": [ | 
 | // NOPARAM-NEXT:     { | 
 | // NOPARAM-NEXT:       "declarationFragments": [ | 
 | // NOPARAM-NEXT:         { | 
 | // NOPARAM-NEXT:           "kind": "text", | 
 | // NOPARAM-NEXT:           "spelling": "(" | 
 | // NOPARAM-NEXT:         }, | 
 | // NOPARAM-NEXT:         { | 
 | // NOPARAM-NEXT:           "kind": "typeIdentifier", | 
 | // NOPARAM-NEXT:           "preciseIdentifier": "c:v", | 
 | // NOPARAM-NEXT:           "spelling": "void" | 
 | // NOPARAM-NEXT:         }, | 
 | // NOPARAM-NEXT:         { | 
 | // NOPARAM-NEXT:           "kind": "text", | 
 | // NOPARAM-NEXT:           "spelling": " (^)()) " | 
 | // NOPARAM-NEXT:         }, | 
 | // NOPARAM-NEXT:         { | 
 | // NOPARAM-NEXT:           "kind": "internalParam", | 
 | // NOPARAM-NEXT:           "spelling": "block" | 
 | // NOPARAM-NEXT:         } | 
 | // NOPARAM-NEXT:       ], | 
 | // NOPARAM-NEXT:       "name": "block" | 
 | // NOPARAM-NEXT:     } | 
 | // NOPARAM-NEXT:   ], | 
 | // NOPARAM-NEXT:   "returns": [ | 
 | // NOPARAM-NEXT:     { | 
 | // NOPARAM-NEXT:       "kind": "typeIdentifier", | 
 | // NOPARAM-NEXT:       "preciseIdentifier": "c:v", | 
 | // NOPARAM-NEXT:       "spelling": "void" | 
 | // NOPARAM-NEXT:     } | 
 | // NOPARAM-NEXT:   ] | 
 | // NOPARAM-NEXT: } | 
 |  | 
 | // RUN: FileCheck %s --input-file %t/output.symbols.json --check-prefix PARAM | 
 | -(void)methodBlockWithParam:(int (^)(int foo))block; | 
 | // PARAM-LABEL: "!testLabel": "c:objc(cs)Foo(im)methodBlockWithParam:" | 
 | // PARAM:      "declarationFragments": [ | 
 | // PARAM-NEXT:   { | 
 | // PARAM-NEXT:     "kind": "text", | 
 | // PARAM-NEXT:     "spelling": "- (" | 
 | // PARAM-NEXT:   }, | 
 | // PARAM-NEXT:   { | 
 | // PARAM-NEXT:     "kind": "typeIdentifier", | 
 | // PARAM-NEXT:     "preciseIdentifier": "c:v", | 
 | // PARAM-NEXT:     "spelling": "void" | 
 | // PARAM-NEXT:   }, | 
 | // PARAM-NEXT:   { | 
 | // PARAM-NEXT:     "kind": "text", | 
 | // PARAM-NEXT:     "spelling": ") " | 
 | // PARAM-NEXT:   }, | 
 | // PARAM-NEXT:   { | 
 | // PARAM-NEXT:     "kind": "identifier", | 
 | // PARAM-NEXT:     "spelling": "methodBlockWithParam:" | 
 | // PARAM-NEXT:   }, | 
 | // PARAM-NEXT:   { | 
 | // PARAM-NEXT:     "kind": "text", | 
 | // PARAM-NEXT:     "spelling": "(" | 
 | // PARAM-NEXT:   }, | 
 | // PARAM-NEXT:   { | 
 | // PARAM-NEXT:     "kind": "typeIdentifier", | 
 | // PARAM-NEXT:     "preciseIdentifier": "c:I", | 
 | // PARAM-NEXT:     "spelling": "int" | 
 | // PARAM-NEXT:   }, | 
 | // PARAM-NEXT:   { | 
 | // PARAM-NEXT:     "kind": "text", | 
 | // PARAM-NEXT:     "spelling": " (^)(" | 
 | // PARAM-NEXT:   }, | 
 | // PARAM-NEXT:   { | 
 | // PARAM-NEXT:     "kind": "typeIdentifier", | 
 | // PARAM-NEXT:     "preciseIdentifier": "c:I", | 
 | // PARAM-NEXT:     "spelling": "int" | 
 | // PARAM-NEXT:   }, | 
 | // PARAM-NEXT:   { | 
 | // PARAM-NEXT:     "kind": "text", | 
 | // PARAM-NEXT:     "spelling": " " | 
 | // PARAM-NEXT:   }, | 
 | // PARAM-NEXT:   { | 
 | // PARAM-NEXT:     "kind": "internalParam", | 
 | // PARAM-NEXT:     "spelling": "foo" | 
 | // PARAM-NEXT:   }, | 
 | // PARAM-NEXT:   { | 
 | // PARAM-NEXT:     "kind": "text", | 
 | // PARAM-NEXT:     "spelling": ")) " | 
 | // PARAM-NEXT:   }, | 
 | // PARAM-NEXT:   { | 
 | // PARAM-NEXT:     "kind": "internalParam", | 
 | // PARAM-NEXT:     "spelling": "block" | 
 | // PARAM-NEXT:   }, | 
 | // PARAM-NEXT:   { | 
 | // PARAM-NEXT:     "kind": "text", | 
 | // PARAM-NEXT:     "spelling": ";" | 
 | // PARAM-NEXT:   } | 
 | // PARAM-NEXT: ], | 
 | // PARAM:      "functionSignature": { | 
 | // PARAM-NEXT:   "parameters": [ | 
 | // PARAM-NEXT:     { | 
 | // PARAM-NEXT:       "declarationFragments": [ | 
 | // PARAM-NEXT:         { | 
 | // PARAM-NEXT:           "kind": "text", | 
 | // PARAM-NEXT:           "spelling": "(" | 
 | // PARAM-NEXT:         }, | 
 | // PARAM-NEXT:         { | 
 | // PARAM-NEXT:           "kind": "typeIdentifier", | 
 | // PARAM-NEXT:           "preciseIdentifier": "c:I", | 
 | // PARAM-NEXT:           "spelling": "int" | 
 | // PARAM-NEXT:         }, | 
 | // PARAM-NEXT:         { | 
 | // PARAM-NEXT:           "kind": "text", | 
 | // PARAM-NEXT:           "spelling": " (^)(" | 
 | // PARAM-NEXT:         }, | 
 | // PARAM-NEXT:         { | 
 | // PARAM-NEXT:           "kind": "typeIdentifier", | 
 | // PARAM-NEXT:           "preciseIdentifier": "c:I", | 
 | // PARAM-NEXT:           "spelling": "int" | 
 | // PARAM-NEXT:         }, | 
 | // PARAM-NEXT:         { | 
 | // PARAM-NEXT:           "kind": "text", | 
 | // PARAM-NEXT:           "spelling": " " | 
 | // PARAM-NEXT:         }, | 
 | // PARAM-NEXT:         { | 
 | // PARAM-NEXT:           "kind": "internalParam", | 
 | // PARAM-NEXT:           "spelling": "foo" | 
 | // PARAM-NEXT:         }, | 
 | // PARAM-NEXT:         { | 
 | // PARAM-NEXT:           "kind": "text", | 
 | // PARAM-NEXT:           "spelling": ")) " | 
 | // PARAM-NEXT:         }, | 
 | // PARAM-NEXT:         { | 
 | // PARAM-NEXT:           "kind": "internalParam", | 
 | // PARAM-NEXT:           "spelling": "block" | 
 | // PARAM-NEXT:         } | 
 | // PARAM-NEXT:       ], | 
 | // PARAM-NEXT:       "name": "block" | 
 | // PARAM-NEXT:     } | 
 | // PARAM-NEXT:   ], | 
 | // PARAM-NEXT:   "returns": [ | 
 | // PARAM-NEXT:     { | 
 | // PARAM-NEXT:       "kind": "typeIdentifier", | 
 | // PARAM-NEXT:       "preciseIdentifier": "c:v", | 
 | // PARAM-NEXT:       "spelling": "void" | 
 | // PARAM-NEXT:     } | 
 | // PARAM-NEXT:   ] | 
 | // PARAM-NEXT: } | 
 |  | 
 | // RUN: FileCheck %s --input-file %t/output.symbols.json --check-prefix MULTIPARAM | 
 | -(void)methodBlockWithMultipleParam:(int (^)(int foo, unsigned baz))block; | 
 | // MULTIPARAM-LABEL: "!testLabel": "c:objc(cs)Foo(im)methodBlockWithMultipleParam:" | 
 | // MULTIPARAM:      "declarationFragments": [ | 
 | // MULTIPARAM-NEXT:   { | 
 | // MULTIPARAM-NEXT:     "kind": "text", | 
 | // MULTIPARAM-NEXT:     "spelling": "- (" | 
 | // MULTIPARAM-NEXT:   }, | 
 | // MULTIPARAM-NEXT:   { | 
 | // MULTIPARAM-NEXT:     "kind": "typeIdentifier", | 
 | // MULTIPARAM-NEXT:     "preciseIdentifier": "c:v", | 
 | // MULTIPARAM-NEXT:     "spelling": "void" | 
 | // MULTIPARAM-NEXT:   }, | 
 | // MULTIPARAM-NEXT:   { | 
 | // MULTIPARAM-NEXT:     "kind": "text", | 
 | // MULTIPARAM-NEXT:     "spelling": ") " | 
 | // MULTIPARAM-NEXT:   }, | 
 | // MULTIPARAM-NEXT:   { | 
 | // MULTIPARAM-NEXT:     "kind": "identifier", | 
 | // MULTIPARAM-NEXT:     "spelling": "methodBlockWithMultipleParam:" | 
 | // MULTIPARAM-NEXT:   }, | 
 | // MULTIPARAM-NEXT:   { | 
 | // MULTIPARAM-NEXT:     "kind": "text", | 
 | // MULTIPARAM-NEXT:     "spelling": "(" | 
 | // MULTIPARAM-NEXT:   }, | 
 | // MULTIPARAM-NEXT:   { | 
 | // MULTIPARAM-NEXT:     "kind": "typeIdentifier", | 
 | // MULTIPARAM-NEXT:     "preciseIdentifier": "c:I", | 
 | // MULTIPARAM-NEXT:     "spelling": "int" | 
 | // MULTIPARAM-NEXT:   }, | 
 | // MULTIPARAM-NEXT:   { | 
 | // MULTIPARAM-NEXT:     "kind": "text", | 
 | // MULTIPARAM-NEXT:     "spelling": " (^)(" | 
 | // MULTIPARAM-NEXT:   }, | 
 | // MULTIPARAM-NEXT:   { | 
 | // MULTIPARAM-NEXT:     "kind": "typeIdentifier", | 
 | // MULTIPARAM-NEXT:     "preciseIdentifier": "c:I", | 
 | // MULTIPARAM-NEXT:     "spelling": "int" | 
 | // MULTIPARAM-NEXT:   }, | 
 | // MULTIPARAM-NEXT:   { | 
 | // MULTIPARAM-NEXT:     "kind": "text", | 
 | // MULTIPARAM-NEXT:     "spelling": " " | 
 | // MULTIPARAM-NEXT:   }, | 
 | // MULTIPARAM-NEXT:   { | 
 | // MULTIPARAM-NEXT:     "kind": "internalParam", | 
 | // MULTIPARAM-NEXT:     "spelling": "foo" | 
 | // MULTIPARAM-NEXT:   }, | 
 | // MULTIPARAM-NEXT:   { | 
 | // MULTIPARAM-NEXT:     "kind": "text", | 
 | // MULTIPARAM-NEXT:     "spelling": ", " | 
 | // MULTIPARAM-NEXT:   }, | 
 | // MULTIPARAM-NEXT:   { | 
 | // MULTIPARAM-NEXT:     "kind": "typeIdentifier", | 
 | // MULTIPARAM-NEXT:     "preciseIdentifier": "c:i", | 
 | // MULTIPARAM-NEXT:     "spelling": "unsigned int" | 
 | // MULTIPARAM-NEXT:   }, | 
 | // MULTIPARAM-NEXT:   { | 
 | // MULTIPARAM-NEXT:     "kind": "text", | 
 | // MULTIPARAM-NEXT:     "spelling": " " | 
 | // MULTIPARAM-NEXT:   }, | 
 | // MULTIPARAM-NEXT:   { | 
 | // MULTIPARAM-NEXT:     "kind": "internalParam", | 
 | // MULTIPARAM-NEXT:     "spelling": "baz" | 
 | // MULTIPARAM-NEXT:   }, | 
 | // MULTIPARAM-NEXT:   { | 
 | // MULTIPARAM-NEXT:     "kind": "text", | 
 | // MULTIPARAM-NEXT:     "spelling": ")) " | 
 | // MULTIPARAM-NEXT:   }, | 
 | // MULTIPARAM-NEXT:   { | 
 | // MULTIPARAM-NEXT:     "kind": "internalParam", | 
 | // MULTIPARAM-NEXT:     "spelling": "block" | 
 | // MULTIPARAM-NEXT:   }, | 
 | // MULTIPARAM-NEXT:   { | 
 | // MULTIPARAM-NEXT:     "kind": "text", | 
 | // MULTIPARAM-NEXT:     "spelling": ";" | 
 | // MULTIPARAM-NEXT:   } | 
 | // MULTIPARAM-NEXT: ], | 
 | // MULTIPARAM:      "functionSignature": { | 
 | // MULTIPARAM-NEXT:   "parameters": [ | 
 | // MULTIPARAM-NEXT:     { | 
 | // MULTIPARAM-NEXT:       "declarationFragments": [ | 
 | // MULTIPARAM-NEXT:         { | 
 | // MULTIPARAM-NEXT:           "kind": "text", | 
 | // MULTIPARAM-NEXT:           "spelling": "(" | 
 | // MULTIPARAM-NEXT:         }, | 
 | // MULTIPARAM-NEXT:         { | 
 | // MULTIPARAM-NEXT:           "kind": "typeIdentifier", | 
 | // MULTIPARAM-NEXT:           "preciseIdentifier": "c:I", | 
 | // MULTIPARAM-NEXT:           "spelling": "int" | 
 | // MULTIPARAM-NEXT:         }, | 
 | // MULTIPARAM-NEXT:         { | 
 | // MULTIPARAM-NEXT:           "kind": "text", | 
 | // MULTIPARAM-NEXT:           "spelling": " (^)(" | 
 | // MULTIPARAM-NEXT:         }, | 
 | // MULTIPARAM-NEXT:         { | 
 | // MULTIPARAM-NEXT:           "kind": "typeIdentifier", | 
 | // MULTIPARAM-NEXT:           "preciseIdentifier": "c:I", | 
 | // MULTIPARAM-NEXT:           "spelling": "int" | 
 | // MULTIPARAM-NEXT:         }, | 
 | // MULTIPARAM-NEXT:         { | 
 | // MULTIPARAM-NEXT:           "kind": "text", | 
 | // MULTIPARAM-NEXT:           "spelling": " " | 
 | // MULTIPARAM-NEXT:         }, | 
 | // MULTIPARAM-NEXT:         { | 
 | // MULTIPARAM-NEXT:           "kind": "internalParam", | 
 | // MULTIPARAM-NEXT:           "spelling": "foo" | 
 | // MULTIPARAM-NEXT:         }, | 
 | // MULTIPARAM-NEXT:         { | 
 | // MULTIPARAM-NEXT:           "kind": "text", | 
 | // MULTIPARAM-NEXT:           "spelling": ", " | 
 | // MULTIPARAM-NEXT:         }, | 
 | // MULTIPARAM-NEXT:         { | 
 | // MULTIPARAM-NEXT:           "kind": "typeIdentifier", | 
 | // MULTIPARAM-NEXT:           "preciseIdentifier": "c:i", | 
 | // MULTIPARAM-NEXT:           "spelling": "unsigned int" | 
 | // MULTIPARAM-NEXT:         }, | 
 | // MULTIPARAM-NEXT:         { | 
 | // MULTIPARAM-NEXT:           "kind": "text", | 
 | // MULTIPARAM-NEXT:           "spelling": " " | 
 | // MULTIPARAM-NEXT:         }, | 
 | // MULTIPARAM-NEXT:         { | 
 | // MULTIPARAM-NEXT:           "kind": "internalParam", | 
 | // MULTIPARAM-NEXT:           "spelling": "baz" | 
 | // MULTIPARAM-NEXT:         }, | 
 | // MULTIPARAM-NEXT:         { | 
 | // MULTIPARAM-NEXT:           "kind": "text", | 
 | // MULTIPARAM-NEXT:           "spelling": ")) " | 
 | // MULTIPARAM-NEXT:         }, | 
 | // MULTIPARAM-NEXT:         { | 
 | // MULTIPARAM-NEXT:           "kind": "internalParam", | 
 | // MULTIPARAM-NEXT:           "spelling": "block" | 
 | // MULTIPARAM-NEXT:         } | 
 | // MULTIPARAM-NEXT:       ], | 
 | // MULTIPARAM-NEXT:       "name": "block" | 
 | // MULTIPARAM-NEXT:     } | 
 | // MULTIPARAM-NEXT:   ], | 
 | // MULTIPARAM-NEXT:   "returns": [ | 
 | // MULTIPARAM-NEXT:     { | 
 | // MULTIPARAM-NEXT:       "kind": "typeIdentifier", | 
 | // MULTIPARAM-NEXT:       "preciseIdentifier": "c:v", | 
 | // MULTIPARAM-NEXT:       "spelling": "void" | 
 | // MULTIPARAM-NEXT:     } | 
 | // MULTIPARAM-NEXT:   ] | 
 | // MULTIPARAM-NEXT: }, | 
 |  | 
 | // RUN: FileCheck %s --input-file %t/output.symbols.json --check-prefix VARIADIC | 
 | -(void)methodBlockVariadic:(int (^)(int foo, ...))block; | 
 | // VARIADIC-LABEL: "!testLabel": "c:objc(cs)Foo(im)methodBlockVariadic:" | 
 | // VARIADIC:      "declarationFragments": [ | 
 | // VARIADIC-NEXT:   { | 
 | // VARIADIC-NEXT:     "kind": "text", | 
 | // VARIADIC-NEXT:     "spelling": "- (" | 
 | // VARIADIC-NEXT:   }, | 
 | // VARIADIC-NEXT:   { | 
 | // VARIADIC-NEXT:     "kind": "typeIdentifier", | 
 | // VARIADIC-NEXT:     "preciseIdentifier": "c:v", | 
 | // VARIADIC-NEXT:     "spelling": "void" | 
 | // VARIADIC-NEXT:   }, | 
 | // VARIADIC-NEXT:   { | 
 | // VARIADIC-NEXT:     "kind": "text", | 
 | // VARIADIC-NEXT:     "spelling": ") " | 
 | // VARIADIC-NEXT:   }, | 
 | // VARIADIC-NEXT:   { | 
 | // VARIADIC-NEXT:     "kind": "identifier", | 
 | // VARIADIC-NEXT:     "spelling": "methodBlockVariadic:" | 
 | // VARIADIC-NEXT:   }, | 
 | // VARIADIC-NEXT:   { | 
 | // VARIADIC-NEXT:     "kind": "text", | 
 | // VARIADIC-NEXT:     "spelling": "(" | 
 | // VARIADIC-NEXT:   }, | 
 | // VARIADIC-NEXT:   { | 
 | // VARIADIC-NEXT:     "kind": "typeIdentifier", | 
 | // VARIADIC-NEXT:     "preciseIdentifier": "c:I", | 
 | // VARIADIC-NEXT:     "spelling": "int" | 
 | // VARIADIC-NEXT:   }, | 
 | // VARIADIC-NEXT:   { | 
 | // VARIADIC-NEXT:     "kind": "text", | 
 | // VARIADIC-NEXT:     "spelling": " (^)(" | 
 | // VARIADIC-NEXT:   }, | 
 | // VARIADIC-NEXT:   { | 
 | // VARIADIC-NEXT:     "kind": "typeIdentifier", | 
 | // VARIADIC-NEXT:     "preciseIdentifier": "c:I", | 
 | // VARIADIC-NEXT:     "spelling": "int" | 
 | // VARIADIC-NEXT:   }, | 
 | // VARIADIC-NEXT:   { | 
 | // VARIADIC-NEXT:     "kind": "text", | 
 | // VARIADIC-NEXT:     "spelling": " " | 
 | // VARIADIC-NEXT:   }, | 
 | // VARIADIC-NEXT:   { | 
 | // VARIADIC-NEXT:     "kind": "internalParam", | 
 | // VARIADIC-NEXT:     "spelling": "foo" | 
 | // VARIADIC-NEXT:   }, | 
 | // VARIADIC-NEXT:   { | 
 | // VARIADIC-NEXT:     "kind": "text", | 
 | // VARIADIC-NEXT:     "spelling": ", ...)) " | 
 | // VARIADIC-NEXT:   }, | 
 | // VARIADIC-NEXT:   { | 
 | // VARIADIC-NEXT:     "kind": "internalParam", | 
 | // VARIADIC-NEXT:     "spelling": "block" | 
 | // VARIADIC-NEXT:   }, | 
 | // VARIADIC-NEXT:   { | 
 | // VARIADIC-NEXT:     "kind": "text", | 
 | // VARIADIC-NEXT:     "spelling": ";" | 
 | // VARIADIC-NEXT:   } | 
 | // VARIADIC-NEXT: ], | 
 | // VARIADIC:      "functionSignature": { | 
 | // VARIADIC-NEXT:   "parameters": [ | 
 | // VARIADIC-NEXT:     { | 
 | // VARIADIC-NEXT:       "declarationFragments": [ | 
 | // VARIADIC-NEXT:         { | 
 | // VARIADIC-NEXT:           "kind": "text", | 
 | // VARIADIC-NEXT:           "spelling": "(" | 
 | // VARIADIC-NEXT:         }, | 
 | // VARIADIC-NEXT:         { | 
 | // VARIADIC-NEXT:           "kind": "typeIdentifier", | 
 | // VARIADIC-NEXT:           "preciseIdentifier": "c:I", | 
 | // VARIADIC-NEXT:           "spelling": "int" | 
 | // VARIADIC-NEXT:         }, | 
 | // VARIADIC-NEXT:         { | 
 | // VARIADIC-NEXT:           "kind": "text", | 
 | // VARIADIC-NEXT:           "spelling": " (^)(" | 
 | // VARIADIC-NEXT:         }, | 
 | // VARIADIC-NEXT:         { | 
 | // VARIADIC-NEXT:           "kind": "typeIdentifier", | 
 | // VARIADIC-NEXT:           "preciseIdentifier": "c:I", | 
 | // VARIADIC-NEXT:           "spelling": "int" | 
 | // VARIADIC-NEXT:         }, | 
 | // VARIADIC-NEXT:         { | 
 | // VARIADIC-NEXT:           "kind": "text", | 
 | // VARIADIC-NEXT:           "spelling": " " | 
 | // VARIADIC-NEXT:         }, | 
 | // VARIADIC-NEXT:         { | 
 | // VARIADIC-NEXT:           "kind": "internalParam", | 
 | // VARIADIC-NEXT:           "spelling": "foo" | 
 | // VARIADIC-NEXT:         }, | 
 | // VARIADIC-NEXT:         { | 
 | // VARIADIC-NEXT:           "kind": "text", | 
 | // VARIADIC-NEXT:           "spelling": ", ...)) " | 
 | // VARIADIC-NEXT:         }, | 
 | // VARIADIC-NEXT:         { | 
 | // VARIADIC-NEXT:           "kind": "internalParam", | 
 | // VARIADIC-NEXT:           "spelling": "block" | 
 | // VARIADIC-NEXT:         } | 
 | // VARIADIC-NEXT:       ], | 
 | // VARIADIC-NEXT:       "name": "block" | 
 | // VARIADIC-NEXT:     } | 
 | // VARIADIC-NEXT:   ], | 
 | // VARIADIC-NEXT:   "returns": [ | 
 | // VARIADIC-NEXT:     { | 
 | // VARIADIC-NEXT:       "kind": "typeIdentifier", | 
 | // VARIADIC-NEXT:       "preciseIdentifier": "c:v", | 
 | // VARIADIC-NEXT:       "spelling": "void" | 
 | // VARIADIC-NEXT:     } | 
 | // VARIADIC-NEXT:   ] | 
 | // VARIADIC-NEXT: }, | 
 | @end | 
 |  | 
 | // RUN: FileCheck %s --input-file %t/output.symbols.json --check-prefix FUNC | 
 | void func(int (^arg)(int foo)); | 
 | // FUNC-LABEL: "!testLabel": "c:@F@func" | 
 | // FUNC:      "declarationFragments": [ | 
 | // FUNC-NEXT:   { | 
 | // FUNC-NEXT:     "kind": "typeIdentifier", | 
 | // FUNC-NEXT:     "preciseIdentifier": "c:v", | 
 | // FUNC-NEXT:     "spelling": "void" | 
 | // FUNC-NEXT:   }, | 
 | // FUNC-NEXT:   { | 
 | // FUNC-NEXT:     "kind": "text", | 
 | // FUNC-NEXT:     "spelling": " " | 
 | // FUNC-NEXT:   }, | 
 | // FUNC-NEXT:   { | 
 | // FUNC-NEXT:     "kind": "identifier", | 
 | // FUNC-NEXT:     "spelling": "func" | 
 | // FUNC-NEXT:   }, | 
 | // FUNC-NEXT:   { | 
 | // FUNC-NEXT:     "kind": "text", | 
 | // FUNC-NEXT:     "spelling": "(" | 
 | // FUNC-NEXT:   }, | 
 | // FUNC-NEXT:   { | 
 | // FUNC-NEXT:     "kind": "typeIdentifier", | 
 | // FUNC-NEXT:     "preciseIdentifier": "c:I", | 
 | // FUNC-NEXT:     "spelling": "int" | 
 | // FUNC-NEXT:   }, | 
 | // FUNC-NEXT:   { | 
 | // FUNC-NEXT:     "kind": "text", | 
 | // FUNC-NEXT:     "spelling": " (^" | 
 | // FUNC-NEXT:   }, | 
 | // FUNC-NEXT:   { | 
 | // FUNC-NEXT:     "kind": "internalParam", | 
 | // FUNC-NEXT:     "spelling": "arg" | 
 | // FUNC-NEXT:   }, | 
 | // FUNC-NEXT:   { | 
 | // FUNC-NEXT:     "kind": "text", | 
 | // FUNC-NEXT:     "spelling": ")(" | 
 | // FUNC-NEXT:   }, | 
 | // FUNC-NEXT:   { | 
 | // FUNC-NEXT:     "kind": "typeIdentifier", | 
 | // FUNC-NEXT:     "preciseIdentifier": "c:I", | 
 | // FUNC-NEXT:     "spelling": "int" | 
 | // FUNC-NEXT:   }, | 
 | // FUNC-NEXT:   { | 
 | // FUNC-NEXT:     "kind": "text", | 
 | // FUNC-NEXT:     "spelling": " " | 
 | // FUNC-NEXT:   }, | 
 | // FUNC-NEXT:   { | 
 | // FUNC-NEXT:     "kind": "internalParam", | 
 | // FUNC-NEXT:     "spelling": "foo" | 
 | // FUNC-NEXT:   }, | 
 | // FUNC-NEXT:   { | 
 | // FUNC-NEXT:     "kind": "text", | 
 | // FUNC-NEXT:     "spelling": "));" | 
 | // FUNC-NEXT:   } | 
 | // FUNC-NEXT: ], | 
 | // FUNC:      "functionSignature": { | 
 | // FUNC-NEXT:   "parameters": [ | 
 | // FUNC-NEXT:     { | 
 | // FUNC-NEXT:       "declarationFragments": [ | 
 | // FUNC-NEXT:         { | 
 | // FUNC-NEXT:           "kind": "typeIdentifier", | 
 | // FUNC-NEXT:           "preciseIdentifier": "c:I", | 
 | // FUNC-NEXT:           "spelling": "int" | 
 | // FUNC-NEXT:         }, | 
 | // FUNC-NEXT:         { | 
 | // FUNC-NEXT:           "kind": "text", | 
 | // FUNC-NEXT:           "spelling": " (^" | 
 | // FUNC-NEXT:         }, | 
 | // FUNC-NEXT:         { | 
 | // FUNC-NEXT:           "kind": "internalParam", | 
 | // FUNC-NEXT:           "spelling": "arg" | 
 | // FUNC-NEXT:         }, | 
 | // FUNC-NEXT:         { | 
 | // FUNC-NEXT:           "kind": "text", | 
 | // FUNC-NEXT:           "spelling": ")(" | 
 | // FUNC-NEXT:         }, | 
 | // FUNC-NEXT:         { | 
 | // FUNC-NEXT:           "kind": "typeIdentifier", | 
 | // FUNC-NEXT:           "preciseIdentifier": "c:I", | 
 | // FUNC-NEXT:           "spelling": "int" | 
 | // FUNC-NEXT:         }, | 
 | // FUNC-NEXT:         { | 
 | // FUNC-NEXT:           "kind": "text", | 
 | // FUNC-NEXT:           "spelling": " " | 
 | // FUNC-NEXT:         }, | 
 | // FUNC-NEXT:         { | 
 | // FUNC-NEXT:           "kind": "internalParam", | 
 | // FUNC-NEXT:           "spelling": "foo" | 
 | // FUNC-NEXT:         }, | 
 | // FUNC-NEXT:         { | 
 | // FUNC-NEXT:           "kind": "text", | 
 | // FUNC-NEXT:           "spelling": ")" | 
 | // FUNC-NEXT:         } | 
 | // FUNC-NEXT:       ], | 
 | // FUNC-NEXT:       "name": "arg" | 
 | // FUNC-NEXT:     } | 
 | // FUNC-NEXT:   ], | 
 | // FUNC-NEXT:   "returns": [ | 
 | // FUNC-NEXT:     { | 
 | // FUNC-NEXT:       "kind": "typeIdentifier", | 
 | // FUNC-NEXT:       "preciseIdentifier": "c:v", | 
 | // FUNC-NEXT:       "spelling": "void" | 
 | // FUNC-NEXT:     } | 
 | // FUNC-NEXT:   ] | 
 | // FUNC-NEXT: }, | 
 |  | 
 | // RUN: FileCheck %s --input-file %t/output.symbols.json --check-prefix GLOBAL | 
 | int (^global)(int foo); | 
 | // GLOBAL-LABEL: "!testLabel": "c:@global" | 
 | // GLOBAL:      "declarationFragments": [ | 
 | // GLOBAL-NEXT:   { | 
 | // GLOBAL-NEXT:     "kind": "typeIdentifier", | 
 | // GLOBAL-NEXT:     "preciseIdentifier": "c:I", | 
 | // GLOBAL-NEXT:     "spelling": "int" | 
 | // GLOBAL-NEXT:   }, | 
 | // GLOBAL-NEXT:   { | 
 | // GLOBAL-NEXT:     "kind": "text", | 
 | // GLOBAL-NEXT:     "spelling": " (^" | 
 | // GLOBAL-NEXT:   }, | 
 | // GLOBAL-NEXT:   { | 
 | // GLOBAL-NEXT:     "kind": "identifier", | 
 | // GLOBAL-NEXT:     "spelling": "global" | 
 | // GLOBAL-NEXT:   }, | 
 | // GLOBAL-NEXT:   { | 
 | // GLOBAL-NEXT:     "kind": "text", | 
 | // GLOBAL-NEXT:     "spelling": ")(" | 
 | // GLOBAL-NEXT:   }, | 
 | // GLOBAL-NEXT:   { | 
 | // GLOBAL-NEXT:     "kind": "typeIdentifier", | 
 | // GLOBAL-NEXT:     "preciseIdentifier": "c:I", | 
 | // GLOBAL-NEXT:     "spelling": "int" | 
 | // GLOBAL-NEXT:   }, | 
 | // GLOBAL-NEXT:   { | 
 | // GLOBAL-NEXT:     "kind": "text", | 
 | // GLOBAL-NEXT:     "spelling": " " | 
 | // GLOBAL-NEXT:   }, | 
 | // GLOBAL-NEXT:   { | 
 | // GLOBAL-NEXT:     "kind": "internalParam", | 
 | // GLOBAL-NEXT:     "spelling": "foo" | 
 | // GLOBAL-NEXT:   }, | 
 | // GLOBAL-NEXT:   { | 
 | // GLOBAL-NEXT:     "kind": "text", | 
 | // GLOBAL-NEXT:     "spelling": ");" | 
 | // GLOBAL-NEXT:   } | 
 | // GLOBAL-NEXT: ], | 
 |  | 
 | ///expected-no-diagnostics |