1 // RUN: %clang_cc1 -triple x86_64-unknown-unknown -fsyntax-only -ast-dump=json -ast-dump-filter Test %s | FileCheck %s 2 3 namespace NS { 4 struct S {}; 5 } 6 7 struct T { 8 int I; 9 void F(); 10 }; 11 12 typedef struct T TestElaboratedType1; 13 typedef NS::S TestElaboratedType2; 14 15 #define CDECL __attribute__((cdecl)) 16 typedef void (CDECL *TestMacroQualifiedType)(); 17 18 typedef void (T::* TestMemberFunctionPointerType)(); 19 typedef int T::*TestMemberDataPointerType; 20 21 typedef int TestQualTypePrinting(const char* c); 22 23 // NOTE: CHECK lines have been autogenerated by gen_ast_dump_json_test.py 24 25 26 // CHECK: "kind": "TypedefDecl", 27 // CHECK-NEXT: "loc": { 28 // CHECK-NEXT: "file": "{{.*}}", 29 // CHECK-NEXT: "line": 12, 30 // CHECK-NEXT: "col": 18, 31 // CHECK-NEXT: "tokLen": 19 32 // CHECK-NEXT: }, 33 // CHECK-NEXT: "range": { 34 // CHECK-NEXT: "begin": { 35 // CHECK-NEXT: "col": 1, 36 // CHECK-NEXT: "tokLen": 7 37 // CHECK-NEXT: }, 38 // CHECK-NEXT: "end": { 39 // CHECK-NEXT: "col": 18, 40 // CHECK-NEXT: "tokLen": 19 41 // CHECK-NEXT: } 42 // CHECK-NEXT: }, 43 // CHECK-NEXT: "name": "TestElaboratedType1", 44 // CHECK-NEXT: "type": { 45 // CHECK-NEXT: "desugaredQualType": "T", 46 // CHECK-NEXT: "qualType": "struct T" 47 // CHECK-NEXT: }, 48 // CHECK-NEXT: "inner": [ 49 // CHECK-NEXT: { 50 // CHECK-NEXT: "id": "0x{{.*}}", 51 // CHECK-NEXT: "kind": "ElaboratedType", 52 // CHECK-NEXT: "type": { 53 // CHECK-NEXT: "qualType": "struct T" 54 // CHECK-NEXT: }, 55 // CHECK-NEXT: "inner": [ 56 // CHECK-NEXT: { 57 // CHECK-NEXT: "id": "0x{{.*}}", 58 // CHECK-NEXT: "kind": "RecordType", 59 // CHECK-NEXT: "type": { 60 // CHECK-NEXT: "qualType": "T" 61 // CHECK-NEXT: }, 62 // CHECK-NEXT: "decl": { 63 // CHECK-NEXT: "id": "0x{{.*}}", 64 // CHECK-NEXT: "kind": "CXXRecordDecl", 65 // CHECK-NEXT: "name": "T" 66 // CHECK-NEXT: } 67 // CHECK-NEXT: } 68 // CHECK-NEXT: ] 69 // CHECK-NEXT: } 70 // CHECK-NEXT: ] 71 // CHECK-NEXT: } 72 73 74 // CHECK: "kind": "TypedefDecl", 75 // CHECK-NEXT: "loc": { 76 // CHECK-NEXT: "file": "{{.*}}", 77 // CHECK-NEXT: "line": 13, 78 // CHECK-NEXT: "col": 15, 79 // CHECK-NEXT: "tokLen": 19 80 // CHECK-NEXT: }, 81 // CHECK-NEXT: "range": { 82 // CHECK-NEXT: "begin": { 83 // CHECK-NEXT: "col": 1, 84 // CHECK-NEXT: "tokLen": 7 85 // CHECK-NEXT: }, 86 // CHECK-NEXT: "end": { 87 // CHECK-NEXT: "col": 15, 88 // CHECK-NEXT: "tokLen": 19 89 // CHECK-NEXT: } 90 // CHECK-NEXT: }, 91 // CHECK-NEXT: "name": "TestElaboratedType2", 92 // CHECK-NEXT: "type": { 93 // CHECK-NEXT: "desugaredQualType": "NS::S", 94 // CHECK-NEXT: "qualType": "NS::S" 95 // CHECK-NEXT: }, 96 // CHECK-NEXT: "inner": [ 97 // CHECK-NEXT: { 98 // CHECK-NEXT: "id": "0x{{.*}}", 99 // CHECK-NEXT: "kind": "ElaboratedType", 100 // CHECK-NEXT: "type": { 101 // CHECK-NEXT: "qualType": "NS::S" 102 // CHECK-NEXT: }, 103 // CHECK-NEXT: "qualifier": "NS::", 104 // CHECK-NEXT: "inner": [ 105 // CHECK-NEXT: { 106 // CHECK-NEXT: "id": "0x{{.*}}", 107 // CHECK-NEXT: "kind": "RecordType", 108 // CHECK-NEXT: "type": { 109 // CHECK-NEXT: "qualType": "NS::S" 110 // CHECK-NEXT: }, 111 // CHECK-NEXT: "decl": { 112 // CHECK-NEXT: "id": "0x{{.*}}", 113 // CHECK-NEXT: "kind": "CXXRecordDecl", 114 // CHECK-NEXT: "name": "S" 115 // CHECK-NEXT: } 116 // CHECK-NEXT: } 117 // CHECK-NEXT: ] 118 // CHECK-NEXT: } 119 // CHECK-NEXT: ] 120 // CHECK-NEXT: } 121 122 123 // CHECK: "kind": "TypedefDecl", 124 // CHECK-NEXT: "loc": { 125 // CHECK-NEXT: "file": "{{.*}}", 126 // CHECK-NEXT: "line": 16, 127 // CHECK-NEXT: "col": 22, 128 // CHECK-NEXT: "tokLen": 22 129 // CHECK-NEXT: }, 130 // CHECK-NEXT: "range": { 131 // CHECK-NEXT: "begin": { 132 // CHECK-NEXT: "col": 1, 133 // CHECK-NEXT: "tokLen": 7 134 // CHECK-NEXT: }, 135 // CHECK-NEXT: "end": { 136 // CHECK-NEXT: "col": 22, 137 // CHECK-NEXT: "tokLen": 22 138 // CHECK-NEXT: } 139 // CHECK-NEXT: }, 140 // CHECK-NEXT: "name": "TestMacroQualifiedType", 141 // CHECK-NEXT: "type": { 142 // CHECK-NEXT: "qualType": "CDECL void (*)()" 143 // CHECK-NEXT: }, 144 // CHECK-NEXT: "inner": [ 145 // CHECK-NEXT: { 146 // CHECK-NEXT: "id": "0x{{.*}}", 147 // CHECK-NEXT: "kind": "PointerType", 148 // CHECK-NEXT: "type": { 149 // CHECK-NEXT: "qualType": "CDECL void (*)()" 150 // CHECK-NEXT: }, 151 // CHECK-NEXT: "inner": [ 152 // CHECK-NEXT: { 153 // CHECK-NEXT: "id": "0x{{.*}}", 154 // CHECK-NEXT: "kind": "MacroQualifiedType", 155 // CHECK-NEXT: "type": { 156 // CHECK-NEXT: "qualType": "CDECL void ()" 157 // CHECK-NEXT: }, 158 // CHECK-NEXT: "macroName": "CDECL", 159 // CHECK-NEXT: "inner": [ 160 // CHECK-NEXT: { 161 // CHECK-NEXT: "id": "0x{{.*}}", 162 // CHECK-NEXT: "kind": "AttributedType", 163 // CHECK-NEXT: "type": { 164 // CHECK-NEXT: "qualType": "void () __attribute__((cdecl))" 165 // CHECK-NEXT: }, 166 // CHECK-NEXT: "inner": [ 167 // CHECK-NEXT: { 168 // CHECK-NEXT: "id": "0x{{.*}}", 169 // CHECK-NEXT: "kind": "ParenType", 170 // CHECK-NEXT: "type": { 171 // CHECK-NEXT: "qualType": "void ()" 172 // CHECK-NEXT: }, 173 // CHECK-NEXT: "inner": [ 174 // CHECK-NEXT: { 175 // CHECK-NEXT: "id": "0x{{.*}}", 176 // CHECK-NEXT: "kind": "FunctionProtoType", 177 // CHECK-NEXT: "type": { 178 // CHECK-NEXT: "qualType": "void ()" 179 // CHECK-NEXT: }, 180 // CHECK-NEXT: "cc": "cdecl", 181 // CHECK-NEXT: "inner": [ 182 // CHECK-NEXT: { 183 // CHECK-NEXT: "id": "0x{{.*}}", 184 // CHECK-NEXT: "kind": "BuiltinType", 185 // CHECK-NEXT: "type": { 186 // CHECK-NEXT: "qualType": "void" 187 // CHECK-NEXT: } 188 // CHECK-NEXT: } 189 // CHECK-NEXT: ] 190 // CHECK-NEXT: } 191 // CHECK-NEXT: ] 192 // CHECK-NEXT: }, 193 // CHECK-NEXT: { 194 // CHECK-NEXT: "id": "0x{{.*}}", 195 // CHECK-NEXT: "kind": "ParenType", 196 // CHECK-NEXT: "type": { 197 // CHECK-NEXT: "qualType": "void ()" 198 // CHECK-NEXT: }, 199 // CHECK-NEXT: "inner": [ 200 // CHECK-NEXT: { 201 // CHECK-NEXT: "id": "0x{{.*}}", 202 // CHECK-NEXT: "kind": "FunctionProtoType", 203 // CHECK-NEXT: "type": { 204 // CHECK-NEXT: "qualType": "void ()" 205 // CHECK-NEXT: }, 206 // CHECK-NEXT: "cc": "cdecl", 207 // CHECK-NEXT: "inner": [ 208 // CHECK-NEXT: { 209 // CHECK-NEXT: "id": "0x{{.*}}", 210 // CHECK-NEXT: "kind": "BuiltinType", 211 // CHECK-NEXT: "type": { 212 // CHECK-NEXT: "qualType": "void" 213 // CHECK-NEXT: } 214 // CHECK-NEXT: } 215 // CHECK-NEXT: ] 216 // CHECK-NEXT: } 217 // CHECK-NEXT: ] 218 // CHECK-NEXT: } 219 // CHECK-NEXT: ] 220 // CHECK-NEXT: } 221 // CHECK-NEXT: ] 222 // CHECK-NEXT: } 223 // CHECK-NEXT: ] 224 // CHECK-NEXT: } 225 // CHECK-NEXT: ] 226 // CHECK-NEXT: } 227 228 229 // CHECK: "kind": "TypedefDecl", 230 // CHECK-NEXT: "loc": { 231 // CHECK-NEXT: "file": "{{.*}}", 232 // CHECK-NEXT: "line": 18, 233 // CHECK-NEXT: "col": 20, 234 // CHECK-NEXT: "tokLen": 29 235 // CHECK-NEXT: }, 236 // CHECK-NEXT: "range": { 237 // CHECK-NEXT: "begin": { 238 // CHECK-NEXT: "col": 1, 239 // CHECK-NEXT: "tokLen": 7 240 // CHECK-NEXT: }, 241 // CHECK-NEXT: "end": { 242 // CHECK-NEXT: "col": 51, 243 // CHECK-NEXT: "tokLen": 1 244 // CHECK-NEXT: } 245 // CHECK-NEXT: }, 246 // CHECK-NEXT: "name": "TestMemberFunctionPointerType", 247 // CHECK-NEXT: "type": { 248 // CHECK-NEXT: "qualType": "void (T::*)()" 249 // CHECK-NEXT: }, 250 // CHECK-NEXT: "inner": [ 251 // CHECK-NEXT: { 252 // CHECK-NEXT: "id": "0x{{.*}}", 253 // CHECK-NEXT: "kind": "MemberPointerType", 254 // CHECK-NEXT: "type": { 255 // CHECK-NEXT: "qualType": "void (T::*)()" 256 // CHECK-NEXT: }, 257 // CHECK-NEXT: "isFunction": true, 258 // CHECK-NEXT: "inner": [ 259 // CHECK-NEXT: { 260 // CHECK-NEXT: "id": "0x{{.*}}", 261 // CHECK-NEXT: "kind": "RecordType", 262 // CHECK-NEXT: "type": { 263 // CHECK-NEXT: "qualType": "T" 264 // CHECK-NEXT: }, 265 // CHECK-NEXT: "decl": { 266 // CHECK-NEXT: "id": "0x{{.*}}", 267 // CHECK-NEXT: "kind": "CXXRecordDecl", 268 // CHECK-NEXT: "name": "T" 269 // CHECK-NEXT: } 270 // CHECK-NEXT: }, 271 // CHECK-NEXT: { 272 // CHECK-NEXT: "id": "0x{{.*}}", 273 // CHECK-NEXT: "kind": "ParenType", 274 // CHECK-NEXT: "type": { 275 // CHECK-NEXT: "qualType": "void ()" 276 // CHECK-NEXT: }, 277 // CHECK-NEXT: "inner": [ 278 // CHECK-NEXT: { 279 // CHECK-NEXT: "id": "0x{{.*}}", 280 // CHECK-NEXT: "kind": "FunctionProtoType", 281 // CHECK-NEXT: "type": { 282 // CHECK-NEXT: "qualType": "void ()" 283 // CHECK-NEXT: }, 284 // CHECK-NEXT: "cc": "cdecl", 285 // CHECK-NEXT: "inner": [ 286 // CHECK-NEXT: { 287 // CHECK-NEXT: "id": "0x{{.*}}", 288 // CHECK-NEXT: "kind": "BuiltinType", 289 // CHECK-NEXT: "type": { 290 // CHECK-NEXT: "qualType": "void" 291 // CHECK-NEXT: } 292 // CHECK-NEXT: } 293 // CHECK-NEXT: ] 294 // CHECK-NEXT: } 295 // CHECK-NEXT: ] 296 // CHECK-NEXT: } 297 // CHECK-NEXT: ] 298 // CHECK-NEXT: } 299 // CHECK-NEXT: ] 300 // CHECK-NEXT: } 301 302 303 // CHECK: "kind": "TypedefDecl", 304 // CHECK-NEXT: "loc": { 305 // CHECK-NEXT: "file": "{{.*}}", 306 // CHECK-NEXT: "line": 19, 307 // CHECK-NEXT: "col": 17, 308 // CHECK-NEXT: "tokLen": 25 309 // CHECK-NEXT: }, 310 // CHECK-NEXT: "range": { 311 // CHECK-NEXT: "begin": { 312 // CHECK-NEXT: "col": 1, 313 // CHECK-NEXT: "tokLen": 7 314 // CHECK-NEXT: }, 315 // CHECK-NEXT: "end": { 316 // CHECK-NEXT: "col": 17, 317 // CHECK-NEXT: "tokLen": 25 318 // CHECK-NEXT: } 319 // CHECK-NEXT: }, 320 // CHECK-NEXT: "name": "TestMemberDataPointerType", 321 // CHECK-NEXT: "type": { 322 // CHECK-NEXT: "qualType": "int T::*" 323 // CHECK-NEXT: }, 324 // CHECK-NEXT: "inner": [ 325 // CHECK-NEXT: { 326 // CHECK-NEXT: "id": "0x{{.*}}", 327 // CHECK-NEXT: "kind": "MemberPointerType", 328 // CHECK-NEXT: "type": { 329 // CHECK-NEXT: "qualType": "int T::*" 330 // CHECK-NEXT: }, 331 // CHECK-NEXT: "isData": true, 332 // CHECK-NEXT: "inner": [ 333 // CHECK-NEXT: { 334 // CHECK-NEXT: "id": "0x{{.*}}", 335 // CHECK-NEXT: "kind": "RecordType", 336 // CHECK-NEXT: "type": { 337 // CHECK-NEXT: "qualType": "T" 338 // CHECK-NEXT: }, 339 // CHECK-NEXT: "decl": { 340 // CHECK-NEXT: "id": "0x{{.*}}", 341 // CHECK-NEXT: "kind": "CXXRecordDecl", 342 // CHECK-NEXT: "name": "T" 343 // CHECK-NEXT: } 344 // CHECK-NEXT: }, 345 // CHECK-NEXT: { 346 // CHECK-NEXT: "id": "0x{{.*}}", 347 // CHECK-NEXT: "kind": "BuiltinType", 348 // CHECK-NEXT: "type": { 349 // CHECK-NEXT: "qualType": "int" 350 // CHECK-NEXT: } 351 // CHECK-NEXT: } 352 // CHECK-NEXT: ] 353 // CHECK-NEXT: } 354 // CHECK-NEXT: ] 355 // CHECK-NEXT: } 356 357 358 // CHECK: "kind": "TypedefDecl", 359 // CHECK-NEXT: "loc": { 360 // CHECK-NEXT: "file": "{{.*}}", 361 // CHECK-NEXT: "line": 21, 362 // CHECK-NEXT: "col": 13, 363 // CHECK-NEXT: "tokLen": 20 364 // CHECK-NEXT: }, 365 // CHECK-NEXT: "range": { 366 // CHECK-NEXT: "begin": { 367 // CHECK-NEXT: "col": 1, 368 // CHECK-NEXT: "tokLen": 7 369 // CHECK-NEXT: }, 370 // CHECK-NEXT: "end": { 371 // CHECK-NEXT: "col": 47, 372 // CHECK-NEXT: "tokLen": 1 373 // CHECK-NEXT: } 374 // CHECK-NEXT: }, 375 // CHECK-NEXT: "name": "TestQualTypePrinting", 376 // CHECK-NEXT: "type": { 377 // CHECK-NEXT: "qualType": "int (const char *)" 378 // CHECK-NEXT: }, 379 // CHECK-NEXT: "inner": [ 380 // CHECK-NEXT: { 381 // CHECK-NEXT: "id": "0x{{.*}}", 382 // CHECK-NEXT: "kind": "FunctionProtoType", 383 // CHECK-NEXT: "type": { 384 // CHECK-NEXT: "qualType": "int (const char *)" 385 // CHECK-NEXT: }, 386 // CHECK-NEXT: "cc": "cdecl", 387 // CHECK-NEXT: "inner": [ 388 // CHECK-NEXT: { 389 // CHECK-NEXT: "id": "0x{{.*}}", 390 // CHECK-NEXT: "kind": "BuiltinType", 391 // CHECK-NEXT: "type": { 392 // CHECK-NEXT: "qualType": "int" 393 // CHECK-NEXT: } 394 // CHECK-NEXT: }, 395 // CHECK-NEXT: { 396 // CHECK-NEXT: "id": "0x{{.*}}", 397 // CHECK-NEXT: "kind": "PointerType", 398 // CHECK-NEXT: "type": { 399 // CHECK-NEXT: "qualType": "const char *" 400 // CHECK-NEXT: }, 401 // CHECK-NEXT: "inner": [ 402 // CHECK-NEXT: { 403 // CHECK-NEXT: "id": "0x{{.*}}", 404 // CHECK-NEXT: "kind": "QualType", 405 // CHECK-NEXT: "type": { 406 // CHECK-NEXT: "qualType": "const char" 407 // CHECK-NEXT: }, 408 // CHECK-NEXT: "qualifiers": "const", 409 // CHECK-NEXT: "inner": [ 410 // CHECK-NEXT: { 411 // CHECK-NEXT: "id": "0x{{.*}}", 412 // CHECK-NEXT: "kind": "BuiltinType", 413 // CHECK-NEXT: "type": { 414 // CHECK-NEXT: "qualType": "char" 415 // CHECK-NEXT: } 416 // CHECK-NEXT: } 417 // CHECK-NEXT: ] 418 // CHECK-NEXT: } 419 // CHECK-NEXT: ] 420 // CHECK-NEXT: } 421 // CHECK-NEXT: ] 422 // CHECK-NEXT: } 423 // CHECK-NEXT: ] 424 // CHECK-NEXT: } 425