1 // RUN: rm -rf %t 2 // RUN: %clang_cc1 -extract-api --pretty-sgf --emit-sgf-symbol-labels-for-testing \ 3 // RUN: -triple arm64-apple-macosx -std=c++17 -x c++-header %s -o %t/output.symbols.json -verify 4 5 // RUN: FileCheck %s --input-file %t/output.symbols.json --check-prefix FOO 6 template <typename T, int N = 4> class Foo { }; 7 // FOO-LABEL: "!testLabel": "c:@ST>2#T#NI@Foo" 8 // FOO: "declarationFragments": [ 9 // FOO-NEXT: { 10 // FOO-NEXT: "kind": "keyword", 11 // FOO-NEXT: "spelling": "template" 12 // FOO-NEXT: }, 13 // FOO-NEXT: { 14 // FOO-NEXT: "kind": "text", 15 // FOO-NEXT: "spelling": " <" 16 // FOO-NEXT: }, 17 // FOO-NEXT: { 18 // FOO-NEXT: "kind": "keyword", 19 // FOO-NEXT: "spelling": "typename" 20 // FOO-NEXT: }, 21 // FOO-NEXT: { 22 // FOO-NEXT: "kind": "text", 23 // FOO-NEXT: "spelling": " " 24 // FOO-NEXT: }, 25 // FOO-NEXT: { 26 // FOO-NEXT: "kind": "genericParameter", 27 // FOO-NEXT: "spelling": "T" 28 // FOO-NEXT: }, 29 // FOO-NEXT: { 30 // FOO-NEXT: "kind": "text", 31 // FOO-NEXT: "spelling": ", " 32 // FOO-NEXT: }, 33 // FOO-NEXT: { 34 // FOO-NEXT: "kind": "typeIdentifier", 35 // FOO-NEXT: "preciseIdentifier": "c:I", 36 // FOO-NEXT: "spelling": "int" 37 // FOO-NEXT: }, 38 // FOO-NEXT: { 39 // FOO-NEXT: "kind": "text", 40 // FOO-NEXT: "spelling": " " 41 // FOO-NEXT: }, 42 // FOO-NEXT: { 43 // FOO-NEXT: "kind": "genericParameter", 44 // FOO-NEXT: "spelling": "N" 45 // FOO-NEXT: }, 46 // FOO-NEXT: { 47 // FOO-NEXT: "kind": "text", 48 // FOO-NEXT: "spelling": " = 4> " 49 // FOO-NEXT: }, 50 // FOO-NEXT: { 51 // FOO-NEXT: "kind": "keyword", 52 // FOO-NEXT: "spelling": "class" 53 // FOO-NEXT: }, 54 // FOO-NEXT: { 55 // FOO-NEXT: "kind": "text", 56 // FOO-NEXT: "spelling": " " 57 // FOO-NEXT: }, 58 // FOO-NEXT: { 59 // FOO-NEXT: "kind": "identifier", 60 // FOO-NEXT: "spelling": "Foo" 61 // FOO-NEXT: }, 62 // FOO-NEXT: { 63 // FOO-NEXT: "kind": "text", 64 // FOO-NEXT: "spelling": ";" 65 // FOO-NEXT: } 66 // FOO-NEXT: ] 67 68 // RUN: FileCheck %s --input-file %t/output.symbols.json --check-prefix FOO-SPEC 69 template <typename T> class Foo <T, 4> { }; 70 // FOO-SPEC-LABEL: "!testLabel": "c:@SP>1#T@Foo>#t0.0#VI4" 71 // FOO-SPEC: "declarationFragments": [ 72 // FOO-SPEC-NEXT: { 73 // FOO-SPEC-NEXT: "kind": "keyword", 74 // FOO-SPEC-NEXT: "spelling": "template" 75 // FOO-SPEC-NEXT: }, 76 // FOO-SPEC-NEXT: { 77 // FOO-SPEC-NEXT: "kind": "text", 78 // FOO-SPEC-NEXT: "spelling": " <" 79 // FOO-SPEC-NEXT: }, 80 // FOO-SPEC-NEXT: { 81 // FOO-SPEC-NEXT: "kind": "keyword", 82 // FOO-SPEC-NEXT: "spelling": "typename" 83 // FOO-SPEC-NEXT: }, 84 // FOO-SPEC-NEXT: { 85 // FOO-SPEC-NEXT: "kind": "text", 86 // FOO-SPEC-NEXT: "spelling": " " 87 // FOO-SPEC-NEXT: }, 88 // FOO-SPEC-NEXT: { 89 // FOO-SPEC-NEXT: "kind": "genericParameter", 90 // FOO-SPEC-NEXT: "spelling": "T" 91 // FOO-SPEC-NEXT: }, 92 // FOO-SPEC-NEXT: { 93 // FOO-SPEC-NEXT: "kind": "text", 94 // FOO-SPEC-NEXT: "spelling": "> " 95 // FOO-SPEC-NEXT: }, 96 // FOO-SPEC-NEXT: { 97 // FOO-SPEC-NEXT: "kind": "keyword", 98 // FOO-SPEC-NEXT: "spelling": "class" 99 // FOO-SPEC-NEXT: }, 100 // FOO-SPEC-NEXT: { 101 // FOO-SPEC-NEXT: "kind": "text", 102 // FOO-SPEC-NEXT: "spelling": " " 103 // FOO-SPEC-NEXT: }, 104 // FOO-SPEC-NEXT: { 105 // FOO-SPEC-NEXT: "kind": "identifier", 106 // FOO-SPEC-NEXT: "spelling": "Foo" 107 // FOO-SPEC-NEXT: }, 108 // FOO-SPEC-NEXT: { 109 // FOO-SPEC-NEXT: "kind": "text", 110 // FOO-SPEC-NEXT: "spelling": "<" 111 // FOO-SPEC-NEXT: }, 112 // FOO-SPEC-NEXT: { 113 // FOO-SPEC-NEXT: "kind": "typeIdentifier", 114 // FOO-SPEC-NEXT: "preciseIdentifier": "c:t0.0", 115 // FOO-SPEC-NEXT: "spelling": "T" 116 // FOO-SPEC-NEXT: }, 117 // FOO-SPEC-NEXT: { 118 // FOO-SPEC-NEXT: "kind": "text", 119 // FOO-SPEC-NEXT: "spelling": ", 4>;" 120 // FOO-SPEC-NEXT: } 121 // FOO-SPEC-NEXT: ] 122 123 // RUN: FileCheck %s --input-file %t/output.symbols.json --check-prefix NEST 124 template <template <template <typename> typename> class... Bs> class NestedTemplateTemplateParamPack{ }; 125 // NEST-LABEL: "!testLabel": "c:@ST>1#pt>1#t>1#T@NestedTemplateTemplateParamPack" 126 // NEST: "declarationFragments": [ 127 // NEST-NEXT: { 128 // NEST-NEXT: "kind": "keyword", 129 // NEST-NEXT: "spelling": "template" 130 // NEST-NEXT: }, 131 // NEST-NEXT: { 132 // NEST-NEXT: "kind": "text", 133 // NEST-NEXT: "spelling": " <" 134 // NEST-NEXT: }, 135 // NEST-NEXT: { 136 // NEST-NEXT: "kind": "keyword", 137 // NEST-NEXT: "spelling": "template" 138 // NEST-NEXT: }, 139 // NEST-NEXT: { 140 // NEST-NEXT: "kind": "text", 141 // NEST-NEXT: "spelling": " <" 142 // NEST-NEXT: }, 143 // NEST-NEXT: { 144 // NEST-NEXT: "kind": "keyword", 145 // NEST-NEXT: "spelling": "template" 146 // NEST-NEXT: }, 147 // NEST-NEXT: { 148 // NEST-NEXT: "kind": "text", 149 // NEST-NEXT: "spelling": " <" 150 // NEST-NEXT: }, 151 // NEST-NEXT: { 152 // NEST-NEXT: "kind": "keyword", 153 // NEST-NEXT: "spelling": "typename" 154 // NEST-NEXT: }, 155 // NEST-NEXT: { 156 // NEST-NEXT: "kind": "text", 157 // NEST-NEXT: "spelling": "> " 158 // NEST-NEXT: }, 159 // NEST-NEXT: { 160 // NEST-NEXT: "kind": "keyword", 161 // NEST-NEXT: "spelling": "typename" 162 // NEST-NEXT: }, 163 // NEST-NEXT: { 164 // NEST-NEXT: "kind": "text", 165 // NEST-NEXT: "spelling": "> " 166 // NEST-NEXT: }, 167 // NEST-NEXT: { 168 // NEST-NEXT: "kind": "keyword", 169 // NEST-NEXT: "spelling": "class" 170 // NEST-NEXT: }, 171 // NEST-NEXT: { 172 // NEST-NEXT: "kind": "text", 173 // NEST-NEXT: "spelling": "... " 174 // NEST-NEXT: }, 175 // NEST-NEXT: { 176 // NEST-NEXT: "kind": "genericParameter", 177 // NEST-NEXT: "spelling": "Bs" 178 // NEST-NEXT: }, 179 // NEST-NEXT: { 180 // NEST-NEXT: "kind": "text", 181 // NEST-NEXT: "spelling": "> " 182 // NEST-NEXT: }, 183 // NEST-NEXT: { 184 // NEST-NEXT: "kind": "keyword", 185 // NEST-NEXT: "spelling": "class" 186 // NEST-NEXT: }, 187 // NEST-NEXT: { 188 // NEST-NEXT: "kind": "text", 189 // NEST-NEXT: "spelling": " " 190 // NEST-NEXT: }, 191 // NEST-NEXT: { 192 // NEST-NEXT: "kind": "identifier", 193 // NEST-NEXT: "spelling": "NestedTemplateTemplateParamPack" 194 // NEST-NEXT: }, 195 // NEST-NEXT: { 196 // NEST-NEXT: "kind": "text", 197 // NEST-NEXT: "spelling": ";" 198 // NEST-NEXT: } 199 // NEST-NEXT: ] 200 201 // RUN: FileCheck %s --input-file %t/output.symbols.json --check-prefix BAR 202 template <template <typename> typename T = Foo> struct Bar { }; 203 // BAR-LABEL: "!testLabel": "c:@ST>1#t>1#T@Bar" 204 // BAR: "declarationFragments": [ 205 // BAR-NEXT: { 206 // BAR-NEXT: "kind": "keyword", 207 // BAR-NEXT: "spelling": "template" 208 // BAR-NEXT: }, 209 // BAR-NEXT: { 210 // BAR-NEXT: "kind": "text", 211 // BAR-NEXT: "spelling": " <" 212 // BAR-NEXT: }, 213 // BAR-NEXT: { 214 // BAR-NEXT: "kind": "keyword", 215 // BAR-NEXT: "spelling": "template" 216 // BAR-NEXT: }, 217 // BAR-NEXT: { 218 // BAR-NEXT: "kind": "text", 219 // BAR-NEXT: "spelling": " <" 220 // BAR-NEXT: }, 221 // BAR-NEXT: { 222 // BAR-NEXT: "kind": "keyword", 223 // BAR-NEXT: "spelling": "typename" 224 // BAR-NEXT: }, 225 // BAR-NEXT: { 226 // BAR-NEXT: "kind": "text", 227 // BAR-NEXT: "spelling": "> " 228 // BAR-NEXT: }, 229 // BAR-NEXT: { 230 // BAR-NEXT: "kind": "keyword", 231 // BAR-NEXT: "spelling": "typename" 232 // BAR-NEXT: }, 233 // BAR-NEXT: { 234 // BAR-NEXT: "kind": "text", 235 // BAR-NEXT: "spelling": " " 236 // BAR-NEXT: }, 237 // BAR-NEXT: { 238 // BAR-NEXT: "kind": "genericParameter", 239 // BAR-NEXT: "spelling": "T" 240 // BAR-NEXT: }, 241 // BAR-NEXT: { 242 // BAR-NEXT: "kind": "text", 243 // BAR-NEXT: "spelling": " = " 244 // BAR-NEXT: }, 245 // BAR-NEXT: { 246 // BAR-NEXT: "kind": "typeIdentifier", 247 // BAR-NEXT: "preciseIdentifier": "c:@ST>2#T#NI@Foo", 248 // BAR-NEXT: "spelling": "Foo" 249 // BAR-NEXT: }, 250 // BAR-NEXT: { 251 // BAR-NEXT: "kind": "text", 252 // BAR-NEXT: "spelling": "> " 253 // BAR-NEXT: }, 254 // BAR-NEXT: { 255 // BAR-NEXT: "kind": "keyword", 256 // BAR-NEXT: "spelling": "struct" 257 // BAR-NEXT: }, 258 // BAR-NEXT: { 259 // BAR-NEXT: "kind": "text", 260 // BAR-NEXT: "spelling": " " 261 // BAR-NEXT: }, 262 // BAR-NEXT: { 263 // BAR-NEXT: "kind": "identifier", 264 // BAR-NEXT: "spelling": "Bar" 265 // BAR-NEXT: }, 266 // BAR-NEXT: { 267 // BAR-NEXT: "kind": "text", 268 // BAR-NEXT: "spelling": ";" 269 // BAR-NEXT: } 270 // BAR-NEXT: ] 271 272 // RUN: FileCheck %s --input-file %t/output.symbols.json --check-prefix VAR 273 NestedTemplateTemplateParamPack<Bar, Bar> var; 274 // VAR-LABEL: "!testLabel": "c:@var" 275 // VAR: "declarationFragments": [ 276 // VAR-NEXT: { 277 // VAR-NEXT: "kind": "typeIdentifier", 278 // VAR-NEXT: "preciseIdentifier": "c:@ST>1#pt>1#t>1#T@NestedTemplateTemplateParamPack", 279 // VAR-NEXT: "spelling": "NestedTemplateTemplateParamPack" 280 // VAR-NEXT: }, 281 // VAR-NEXT: { 282 // VAR-NEXT: "kind": "text", 283 // VAR-NEXT: "spelling": "<" 284 // VAR-NEXT: }, 285 // VAR-NEXT: { 286 // VAR-NEXT: "kind": "typeIdentifier", 287 // VAR-NEXT: "preciseIdentifier": "c:@ST>1#t>1#T@Bar", 288 // VAR-NEXT: "spelling": "Bar" 289 // VAR-NEXT: }, 290 // VAR-NEXT: { 291 // VAR-NEXT: "kind": "text", 292 // VAR-NEXT: "spelling": ", " 293 // VAR-NEXT: }, 294 // VAR-NEXT: { 295 // VAR-NEXT: "kind": "typeIdentifier", 296 // VAR-NEXT: "preciseIdentifier": "c:@ST>1#t>1#T@Bar", 297 // VAR-NEXT: "spelling": "Bar" 298 // VAR-NEXT: }, 299 // VAR-NEXT: { 300 // VAR-NEXT: "kind": "text", 301 // VAR-NEXT: "spelling": "> " 302 // VAR-NEXT: }, 303 // VAR-NEXT: { 304 // VAR-NEXT: "kind": "identifier", 305 // VAR-NEXT: "spelling": "var" 306 // VAR-NEXT: }, 307 // VAR-NEXT: { 308 // VAR-NEXT: "kind": "text", 309 // VAR-NEXT: "spelling": ";" 310 // VAR-NEXT: } 311 // VAR-NEXT: ] 312 313 template <typename T> 314 class TypeContainer { 315 public: 316 // RUN: FileCheck %s --input-file %t/output.symbols.json --check-prefix TYPE 317 typedef Foo<T> Type; 318 // TYPE-LABEL: "!testLabel": "c:non_type_template.cpp@ST>1#T@TypeContainer@T@Type", 319 // TYPE: "declarationFragments": [ 320 // TYPE-NEXT: { 321 // TYPE-NEXT: "kind": "keyword", 322 // TYPE-NEXT: "spelling": "typedef" 323 // TYPE-NEXT: }, 324 // TYPE-NEXT: { 325 // TYPE-NEXT: "kind": "text", 326 // TYPE-NEXT: "spelling": " " 327 // TYPE-NEXT: }, 328 // TYPE-NEXT: { 329 // TYPE-NEXT: "kind": "typeIdentifier", 330 // TYPE-NEXT: "preciseIdentifier": "c:@ST>2#T#NI@Foo", 331 // TYPE-NEXT: "spelling": "Foo" 332 // TYPE-NEXT: }, 333 // TYPE-NEXT: { 334 // TYPE-NEXT: "kind": "text", 335 // TYPE-NEXT: "spelling": "<" 336 // TYPE-NEXT: }, 337 // TYPE-NEXT: { 338 // TYPE-NEXT: "kind": "typeIdentifier", 339 // TYPE-NEXT: "preciseIdentifier": "c:t0.0", 340 // TYPE-NEXT: "spelling": "T" 341 // TYPE-NEXT: }, 342 // TYPE-NEXT: { 343 // TYPE-NEXT: "kind": "text", 344 // TYPE-NEXT: "spelling": "> " 345 // TYPE-NEXT: }, 346 // TYPE-NEXT: { 347 // TYPE-NEXT: "kind": "identifier", 348 // TYPE-NEXT: "spelling": "Type" 349 // TYPE-NEXT: }, 350 // TYPE-NEXT: { 351 // TYPE-NEXT: "kind": "text", 352 // TYPE-NEXT: "spelling": ";" 353 // TYPE-NEXT: } 354 // TYPE-NEXT: ] 355 }; 356 357 // expected-no-diagnostics 358