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