xref: /llvm-project/clang/test/ExtractAPI/non_type_template.cpp (revision ab7e6b66fdd768f566e76972755de3578f1d0f4a)
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