1 | // RUN: %clang_cc1 -std=c++11 -triple x86_64-linux-gnu -fms-extensions -ast-dump -ast-dump-filter Test %s | FileCheck -strict-whitespace %s
|
2 |
|
3 | class testEnumDecl {
|
4 | enum class TestEnumDeclScoped;
|
5 | enum TestEnumDeclFixed : int;
|
6 | };
|
7 | // CHECK: EnumDecl{{.*}} class TestEnumDeclScoped 'int'
|
8 | // CHECK: EnumDecl{{.*}} TestEnumDeclFixed 'int'
|
9 |
|
10 | class testFieldDecl {
|
11 | int TestFieldDeclInit = 0;
|
12 | };
|
13 | // CHECK: FieldDecl{{.*}} TestFieldDeclInit 'int'
|
14 | // CHECK-NEXT: IntegerLiteral
|
15 |
|
16 | namespace testVarDeclNRVO {
|
17 | class A { };
|
18 | A foo() {
|
19 | A TestVarDeclNRVO;
|
20 | return TestVarDeclNRVO;
|
21 | }
|
22 | }
|
23 | // CHECK: VarDecl{{.*}} TestVarDeclNRVO 'testVarDeclNRVO::A' nrvo
|
24 |
|
25 | void testParmVarDeclInit(int TestParmVarDeclInit = 0);
|
26 | // CHECK: ParmVarDecl{{.*}} TestParmVarDeclInit 'int'
|
27 | // CHECK-NEXT: IntegerLiteral{{.*}}
|
28 |
|
29 | namespace TestNamespaceDecl {
|
30 | int i;
|
31 | }
|
32 | // CHECK: NamespaceDecl{{.*}} TestNamespaceDecl
|
33 | // CHECK-NEXT: VarDecl
|
34 |
|
35 | namespace TestNamespaceDecl {
|
36 | int j;
|
37 | }
|
38 | // CHECK: NamespaceDecl{{.*}} TestNamespaceDecl
|
39 | // CHECK-NEXT: original Namespace
|
40 | // CHECK-NEXT: VarDecl
|
41 |
|
42 | inline namespace TestNamespaceDeclInline {
|
43 | }
|
44 | // CHECK: NamespaceDecl{{.*}} TestNamespaceDeclInline inline
|
45 |
|
46 | namespace testUsingDirectiveDecl {
|
47 | namespace A {
|
48 | }
|
49 | }
|
50 | namespace TestUsingDirectiveDecl {
|
51 | using namespace testUsingDirectiveDecl::A;
|
52 | }
|
53 | // CHECK: NamespaceDecl{{.*}} TestUsingDirectiveDecl
|
54 | // CHECK-NEXT: UsingDirectiveDecl{{.*}} Namespace{{.*}} 'A'
|
55 |
|
56 | namespace testNamespaceAlias {
|
57 | namespace A {
|
58 | }
|
59 | }
|
60 | namespace TestNamespaceAlias = testNamespaceAlias::A;
|
61 | // CHECK: NamespaceAliasDecl{{.*}} TestNamespaceAlias
|
62 | // CHECK-NEXT: Namespace{{.*}} 'A'
|
63 |
|
64 | using TestTypeAliasDecl = int;
|
65 | // CHECK: TypeAliasDecl{{.*}} TestTypeAliasDecl 'int'
|
66 |
|
67 | namespace testTypeAliasTemplateDecl {
|
68 | template<typename T> class A;
|
69 | template<typename T> using TestTypeAliasTemplateDecl = A<T>;
|
70 | }
|
71 | // CHECK: TypeAliasTemplateDecl{{.*}} TestTypeAliasTemplateDecl
|
72 | // CHECK-NEXT: TemplateTypeParmDecl
|
73 | // CHECK-NEXT: TypeAliasDecl{{.*}} TestTypeAliasTemplateDecl 'A<T>'
|
74 |
|
75 | namespace testCXXRecordDecl {
|
76 | class TestEmpty {};
|
77 | // CHECK: CXXRecordDecl{{.*}} class TestEmpty
|
78 | // CHECK-NEXT: DefinitionData pass_in_registers empty aggregate standard_layout trivially_copyable pod trivial literal has_constexpr_non_copy_move_ctor can_const_default_init
|
79 | // CHECK-NEXT: DefaultConstructor exists trivial constexpr
|
80 | // CHECK-NEXT: CopyConstructor simple trivial has_const_param
|
81 | // CHECK-NEXT: MoveConstructor exists simple trivial
|
82 | // CHECK-NEXT: CopyAssignment trivial has_const_param
|
83 | // CHECK-NEXT: MoveAssignment exists simple trivial
|
84 | // CHECK-NEXT: Destructor simple irrelevant trivial
|
85 |
|
86 | class A { };
|
87 | class B { };
|
88 | class TestCXXRecordDecl : virtual A, public B {
|
89 | int i;
|
90 | };
|
91 | }
|
92 | // CHECK: CXXRecordDecl{{.*}} class TestCXXRecordDecl
|
93 | // CHECK-NEXT: DefinitionData{{$}}
|
94 | // CHECK-NEXT: DefaultConstructor exists non_trivial
|
95 | // CHECK-NEXT: CopyConstructor simple non_trivial has_const_param
|
96 | // CHECK-NEXT: MoveConstructor exists simple non_trivial
|
97 | // CHECK-NEXT: CopyAssignment non_trivial has_const_param
|
98 | // CHECK-NEXT: MoveAssignment exists simple non_trivial
|
99 | // CHECK-NEXT: Destructor simple irrelevant trivial
|
100 | // CHECK-NEXT: virtual private 'testCXXRecordDecl::A'
|
101 | // CHECK-NEXT: public 'testCXXRecordDecl::B'
|
102 | // CHECK-NEXT: CXXRecordDecl{{.*}} class TestCXXRecordDecl
|
103 | // CHECK-NEXT: FieldDecl
|
104 |
|
105 | template<class...T>
|
106 | class TestCXXRecordDeclPack : public T... {
|
107 | };
|
108 | // CHECK: CXXRecordDecl{{.*}} class TestCXXRecordDeclPack
|
109 | // CHECK: public 'T'...
|
110 | // CHECK-NEXT: CXXRecordDecl{{.*}} class TestCXXRecordDeclPack
|
111 |
|
112 | thread_local int TestThreadLocalInt;
|
113 | // CHECK: TestThreadLocalInt {{.*}} tls_dynamic
|
114 |
|
115 | class testCXXMethodDecl {
|
116 | virtual void TestCXXMethodDeclPure() = 0;
|
117 | void TestCXXMethodDeclDelete() = delete;
|
118 | void TestCXXMethodDeclThrow() throw();
|
119 | void TestCXXMethodDeclThrowType() throw(int);
|
120 | };
|
121 | // CHECK: CXXMethodDecl{{.*}} TestCXXMethodDeclPure 'void ()' virtual pure
|
122 | // CHECK: CXXMethodDecl{{.*}} TestCXXMethodDeclDelete 'void ()' delete
|
123 | // CHECK: CXXMethodDecl{{.*}} TestCXXMethodDeclThrow 'void () throw()'
|
124 | // CHECK: CXXMethodDecl{{.*}} TestCXXMethodDeclThrowType 'void () throw(int)'
|
125 |
|
126 | namespace testCXXConstructorDecl {
|
127 | class A { };
|
128 | class TestCXXConstructorDecl : public A {
|
129 | int I;
|
130 | TestCXXConstructorDecl(A &a, int i) : A(a), I(i) { }
|
131 | TestCXXConstructorDecl(A &a) : TestCXXConstructorDecl(a, 0) { }
|
132 | };
|
133 | }
|
134 | // CHECK: CXXConstructorDecl{{.*}} TestCXXConstructorDecl 'void {{.*}}'
|
135 | // CHECK-NEXT: ParmVarDecl{{.*}} a
|
136 | // CHECK-NEXT: ParmVarDecl{{.*}} i
|
137 | // CHECK-NEXT: CXXCtorInitializer{{.*}}A
|
138 | // CHECK-NEXT: Expr
|
139 | // CHECK: CXXCtorInitializer{{.*}}I
|
140 | // CHECK-NEXT: Expr
|
141 | // CHECK: CompoundStmt
|
142 | // CHECK: CXXConstructorDecl{{.*}} TestCXXConstructorDecl 'void {{.*}}'
|
143 | // CHECK-NEXT: ParmVarDecl{{.*}} a
|
144 | // CHECK-NEXT: CXXCtorInitializer{{.*}}TestCXXConstructorDecl
|
145 | // CHECK-NEXT: CXXConstructExpr{{.*}}TestCXXConstructorDecl
|
146 |
|
147 | class TestCXXDestructorDecl {
|
148 | ~TestCXXDestructorDecl() { }
|
149 | };
|
150 | // CHECK: CXXDestructorDecl{{.*}} ~TestCXXDestructorDecl 'void () noexcept'
|
151 | // CHECK-NEXT: CompoundStmt
|
152 |
|
153 | // Test that the range of a defaulted members is computed correctly.
|
154 | class TestMemberRanges {
|
155 | public:
|
156 | TestMemberRanges() = default;
|
157 | TestMemberRanges(const TestMemberRanges &Other) = default;
|
158 | TestMemberRanges(TestMemberRanges &&Other) = default;
|
159 | ~TestMemberRanges() = default;
|
160 | TestMemberRanges &operator=(const TestMemberRanges &Other) = default;
|
161 | TestMemberRanges &operator=(TestMemberRanges &&Other) = default;
|
162 | };
|
163 | void SomeFunction() {
|
164 | TestMemberRanges A;
|
165 | TestMemberRanges B(A);
|
166 | B = A;
|
167 | A = static_cast<TestMemberRanges &&>(B);
|
168 | TestMemberRanges C(static_cast<TestMemberRanges &&>(A));
|
169 | }
|
170 | // CHECK: CXXConstructorDecl{{.*}} <line:{{.*}}:3, col:30>
|
171 | // CHECK: CXXConstructorDecl{{.*}} <line:{{.*}}:3, col:59>
|
172 | // CHECK: CXXConstructorDecl{{.*}} <line:{{.*}}:3, col:54>
|
173 | // CHECK: CXXDestructorDecl{{.*}} <line:{{.*}}:3, col:31>
|
174 | // CHECK: CXXMethodDecl{{.*}} <line:{{.*}}:3, col:70>
|
175 | // CHECK: CXXMethodDecl{{.*}} <line:{{.*}}:3, col:65>
|
176 |
|
177 | class TestCXXConversionDecl {
|
178 | operator int() { return 0; }
|
179 | };
|
180 | // CHECK: CXXConversionDecl{{.*}} operator int 'int ()'
|
181 | // CHECK-NEXT: CompoundStmt
|
182 |
|
183 | namespace TestStaticAssertDecl {
|
184 | static_assert(true, "msg");
|
185 | }
|
186 | // CHECK: NamespaceDecl{{.*}} TestStaticAssertDecl
|
187 | // CHECK-NEXT: StaticAssertDecl{{.*> .*$}}
|
188 | // CHECK-NEXT: CXXBoolLiteralExpr
|
189 | // CHECK-NEXT: StringLiteral
|
190 |
|
191 | namespace testFunctionTemplateDecl {
|
192 | class A { };
|
193 | class B { };
|
194 | class C { };
|
195 | class D { };
|
196 | template<typename T> void TestFunctionTemplate(T) { }
|
197 |
|
198 | // implicit instantiation
|
199 | void bar(A a) { TestFunctionTemplate(a); }
|
200 |
|
201 | // explicit specialization
|
202 | template<> void TestFunctionTemplate(B);
|
203 |
|
204 | // explicit instantiation declaration
|
205 | extern template void TestFunctionTemplate(C);
|
206 |
|
207 | // explicit instantiation definition
|
208 | template void TestFunctionTemplate(D);
|
209 | }
|
210 | // CHECK: FunctionTemplateDecl 0x{{.+}} <{{.+}}:[[@LINE-14]]:3, col:55> col:29 TestFunctionTemplate
|
211 | // CHECK-NEXT: |-TemplateTypeParmDecl 0x{{.+}} <col:12, col:21> col:21 referenced typename depth 0 index 0 T
|
212 | // CHECK-NEXT: |-FunctionDecl 0x{{.+}} <col:24, col:55> col:29 TestFunctionTemplate 'void (T)'
|
213 | // CHECK-NEXT: | |-ParmVarDecl 0x{{.+}} <col:50> col:51 'T'
|
214 | // CHECK-NEXT: | `-CompoundStmt 0x{{.+}} <col:53, col:55>
|
215 | // CHECK-NEXT: |-FunctionDecl 0x{{.+}} <col:24, col:55> col:29 used TestFunctionTemplate 'void (testFunctionTemplateDecl::A)'
|
216 | // CHECK-NEXT: | |-TemplateArgument type 'testFunctionTemplateDecl::A'
|
217 | // CHECK-NEXT: | |-ParmVarDecl 0x{{.+}} <col:50> col:51 'testFunctionTemplateDecl::A':'testFunctionTemplateDecl::A'
|
218 | // CHECK-NEXT: | `-CompoundStmt 0x{{.+}} <col:53, col:55>
|
219 | // CHECK-NEXT: |-Function 0x{{.+}} 'TestFunctionTemplate' 'void (testFunctionTemplateDecl::B)'
|
220 | // CHECK-NEXT: |-FunctionDecl 0x{{.+}} <col:24, col:55> col:29 TestFunctionTemplate 'void (testFunctionTemplateDecl::C)'
|
221 | // CHECK-NEXT: | |-TemplateArgument type 'testFunctionTemplateDecl::C'
|
222 | // CHECK-NEXT: | `-ParmVarDecl 0x{{.+}} <col:50> col:51 'testFunctionTemplateDecl::C':'testFunctionTemplateDecl::C'
|
223 | // CHECK-NEXT: `-FunctionDecl 0x{{.+}} <col:24, col:55> col:29 TestFunctionTemplate 'void (testFunctionTemplateDecl::D)'
|
224 | // CHECK-NEXT: |-TemplateArgument type 'testFunctionTemplateDecl::D'
|
225 | // CHECK-NEXT: |-ParmVarDecl 0x{{.+}} <col:50> col:51 'testFunctionTemplateDecl::D':'testFunctionTemplateDecl::D'
|
226 | // CHECK-NEXT: `-CompoundStmt 0x{{.+}} <col:53, col:55>
|
227 |
|
228 | // CHECK: FunctionDecl 0x{{.+}} prev 0x{{.+}} <{{.+}}:[[@LINE-26]]:3, col:41> col:19 TestFunctionTemplate 'void (testFunctionTemplateDecl::B)'
|
229 | // CHECK-NEXT: |-TemplateArgument type 'testFunctionTemplateDecl::B'
|
230 | // CHECK-NEXT: `-ParmVarDecl 0x{{.+}} <col:40> col:41 'testFunctionTemplateDecl::B'
|
231 |
|
232 |
|
233 | namespace testClassTemplateDecl {
|
234 | class A { };
|
235 | class B { };
|
236 | class C { };
|
237 | class D { };
|
238 |
|
239 | template<typename T> class TestClassTemplate {
|
240 | public:
|
241 | TestClassTemplate();
|
242 | ~TestClassTemplate();
|
243 | int j();
|
244 | int i;
|
245 | };
|
246 |
|
247 | // implicit instantiation
|
248 | TestClassTemplate<A> a;
|
249 |
|
250 | // explicit specialization
|
251 | template<> class TestClassTemplate<B> {
|
252 | int j;
|
253 | };
|
254 |
|
255 | // explicit instantiation declaration
|
256 | extern template class TestClassTemplate<C>;
|
257 |
|
258 | // explicit instantiation definition
|
259 | template class TestClassTemplate<D>;
|
260 |
|
261 | // partial explicit specialization
|
262 | template<typename T1, typename T2> class TestClassTemplatePartial {
|
263 | int i;
|
264 | };
|
265 | template<typename T1> class TestClassTemplatePartial<T1, A> {
|
266 | int j;
|
267 | };
|
268 |
|
269 | template<typename T = int> struct TestTemplateDefaultType;
|
270 | template<typename T> struct TestTemplateDefaultType { };
|
271 |
|
272 | template<int I = 42> struct TestTemplateDefaultNonType;
|
273 | template<int I> struct TestTemplateDefaultNonType { };
|
274 |
|
275 | template<template<typename> class TT = TestClassTemplate> struct TestTemplateTemplateDefaultType;
|
276 | template<template<typename> class TT> struct TestTemplateTemplateDefaultType { };
|
277 | }
|
278 |
|
279 | // CHECK: ClassTemplateDecl 0x{{.+}} <{{.+}}:[[@LINE-40]]:3, line:[[@LINE-34]]:3> line:[[@LINE-40]]:30 TestClassTemplate
|
280 | // CHECK-NEXT: |-TemplateTypeParmDecl 0x{{.+}} <col:12, col:21> col:21 typename depth 0 index 0 T
|
281 | // CHECK-NEXT: |-CXXRecordDecl 0x{{.+}} <col:24, line:[[@LINE-36]]:3> line:[[@LINE-42]]:30 class TestClassTemplate definition
|
282 | // CHECK-NEXT: | |-DefinitionData standard_layout has_user_declared_ctor can_const_default_init
|
283 | // CHECK-NEXT: | | |-DefaultConstructor exists non_trivial user_provided
|
284 | // CHECK-NEXT: | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
|
285 | // CHECK-NEXT: | | |-MoveConstructor
|
286 | // CHECK-NEXT: | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
|
287 | // CHECK-NEXT: | | |-MoveAssignment
|
288 | // CHECK-NEXT: | | `-Destructor non_trivial user_declared
|
289 | // CHECK-NEXT: | |-CXXRecordDecl 0x{{.+}} <col:24, col:30> col:30 implicit referenced class TestClassTemplate
|
290 | // CHECK-NEXT: | |-AccessSpecDecl 0x{{.+}} <line:[[@LINE-50]]:3, col:9> col:3 public
|
291 | // CHECK-NEXT: | |-CXXConstructorDecl 0x{{.+}} <line:[[@LINE-50]]:5, col:23> col:5 TestClassTemplate<T> 'void ()'
|
292 | // CHECK-NEXT: | |-CXXDestructorDecl 0x{{.+}} <line:[[@LINE-50]]:5, col:24> col:5 ~TestClassTemplate<T> 'void ()'
|
293 | // CHECK-NEXT: | |-CXXMethodDecl 0x{{.+}} <line:[[@LINE-50]]:5, col:11> col:9 j 'int ()'
|
294 | // CHECK-NEXT: | `-FieldDecl 0x{{.+}} <line:[[@LINE-50]]:5, col:9> col:9 i 'int'
|
295 | // CHECK-NEXT: |-ClassTemplateSpecializationDecl 0x{{.+}} <line:[[@LINE-56]]:3, line:[[@LINE-50]]:3> line:[[@LINE-56]]:30 class TestClassTemplate definition
|
296 | // CHECK-NEXT: | |-DefinitionData standard_layout has_user_declared_ctor can_const_default_init
|
297 | // CHECK-NEXT: | | |-DefaultConstructor exists non_trivial user_provided
|
298 | // CHECK-NEXT: | | |-CopyConstructor simple trivial has_const_param implicit_has_const_param
|
299 | // CHECK-NEXT: | | |-MoveConstructor
|
300 | // CHECK-NEXT: | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
|
301 | // CHECK-NEXT: | | |-MoveAssignment
|
302 | // CHECK-NEXT: | | `-Destructor non_trivial user_declared
|
303 | // CHECK-NEXT: | |-TemplateArgument type 'testClassTemplateDecl::A'
|
304 | // CHECK-NEXT: | |-CXXRecordDecl 0x{{.+}} prev 0x{{.+}} <col:24, col:30> col:30 implicit class TestClassTemplate
|
305 | // CHECK-NEXT: | |-AccessSpecDecl 0x{{.+}} <line:[[@LINE-65]]:3, col:9> col:3 public
|
306 | // CHECK-NEXT: | |-CXXConstructorDecl 0x{{.+}} <line:[[@LINE-65]]:5, col:23> col:5 used TestClassTemplate 'void ()'
|
307 | // CHECK-NEXT: | |-CXXDestructorDecl 0x{{.+}} <line:[[@LINE-65]]:5, col:24> col:5 used ~TestClassTemplate 'void () noexcept'
|
308 | // CHECK-NEXT: | |-CXXMethodDecl 0x{{.+}} <line:[[@LINE-65]]:5, col:11> col:9 j 'int ()'
|
309 | // CHECK-NEXT: | |-FieldDecl 0x{{.+}} <line:[[@LINE-65]]:5, col:9> col:9 i 'int'
|
310 | // CHECK-NEXT: | `-CXXConstructorDecl 0x{{.+}} <line:[[@LINE-71]]:30> col:30 implicit constexpr TestClassTemplate 'void (const testClassTemplateDecl::TestClassTemplate<testClassTemplateDecl::A> &)' inline default trivial noexcept-unevaluated 0x{{.+}}
|
311 | // CHECK-NEXT: | `-ParmVarDecl 0x{{.+}} <col:30> col:30 'const testClassTemplateDecl::TestClassTemplate<testClassTemplateDecl::A> &'
|
312 | // CHECK-NEXT: |-ClassTemplateSpecialization 0x{{.+}} 'TestClassTemplate'
|
313 | // CHECK-NEXT: |-ClassTemplateSpecialization 0x{{.+}} 'TestClassTemplate'
|
314 | // CHECK-NEXT: `-ClassTemplateSpecialization 0x{{.+}} 'TestClassTemplate'
|
315 |
|
316 | // CHECK: ClassTemplateSpecializationDecl 0x{{.+}} <{{.+}}:[[@LINE-65]]:3, line:[[@LINE-63]]:3> line:[[@LINE-65]]:20 class TestClassTemplate definition
|
317 | // CHECK-NEXT: |-DefinitionData pass_in_registers standard_layout trivially_copyable trivial literal
|
318 | // CHECK-NEXT: | |-DefaultConstructor exists trivial needs_implicit
|
319 | // CHECK-NEXT: | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
|
320 | // CHECK-NEXT: | |-MoveConstructor exists simple trivial needs_implicit
|
321 | // CHECK-NEXT: | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
|
322 | // CHECK-NEXT: | |-MoveAssignment exists simple trivial needs_implicit
|
323 | // CHECK-NEXT: | `-Destructor simple irrelevant trivial needs_implicit
|
324 | // CHECK-NEXT: |-TemplateArgument type 'testClassTemplateDecl::B'
|
325 | // CHECK-NEXT: |-CXXRecordDecl 0x{{.+}} <col:14, col:20> col:20 implicit class TestClassTemplate
|
326 | // CHECK-NEXT: `-FieldDecl 0x{{.+}} <line:[[@LINE-74]]:5, col:9> col:9 j 'int'
|
327 |
|
328 | // CHECK: ClassTemplateSpecializationDecl 0x{{.+}} <{{.+}}:256:3, col:44> col:25 class TestClassTemplate definition
|
329 | // CHECK-NEXT: |-DefinitionData standard_layout has_user_declared_ctor can_const_default_init
|
330 | // CHECK-NEXT: | |-DefaultConstructor exists non_trivial user_provided
|
331 | // CHECK-NEXT: | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
|
332 | // CHECK-NEXT: | |-MoveConstructor
|
333 | // CHECK-NEXT: | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
|
334 | // CHECK-NEXT: | |-MoveAssignment
|
335 | // CHECK-NEXT: | `-Destructor non_trivial user_declared
|
336 | // CHECK-NEXT: |-TemplateArgument type 'testClassTemplateDecl::C'
|
337 | // CHECK-NEXT: |-CXXRecordDecl 0x{{.+}} prev 0x{{.+}} <line:[[@LINE-98]]:24, col:30> col:30 implicit class TestClassTemplate
|
338 | // CHECK-NEXT: |-AccessSpecDecl 0x{{.+}} <line:[[@LINE-98]]:3, col:9> col:3 public
|
339 | // CHECK-NEXT: |-CXXConstructorDecl 0x{{.+}} <line:[[@LINE-98]]:5, col:23> col:5 TestClassTemplate 'void ()'
|
340 | // CHECK-NEXT: |-CXXDestructorDecl 0x{{.+}} <line:[[@LINE-98]]:5, col:24> col:5 ~TestClassTemplate 'void ()' noexcept-unevaluated 0x{{.+}}
|
341 | // CHECK-NEXT: |-CXXMethodDecl 0x{{.+}} <line:[[@LINE-98]]:5, col:11> col:9 j 'int ()'
|
342 | // CHECK-NEXT: `-FieldDecl 0x{{.+}} <line:[[@LINE-98]]:5, col:9> col:9 i 'int'
|
343 |
|
344 | // CHECK: ClassTemplateSpecializationDecl 0x{{.+}} <{{.+}}:[[@LINE-85]]:3, col:37> col:18 class TestClassTemplate definition
|
345 | // CHECK-NEXT: |-DefinitionData standard_layout has_user_declared_ctor can_const_default_init
|
346 | // CHECK-NEXT: | |-DefaultConstructor exists non_trivial user_provided
|
347 | // CHECK-NEXT: | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
|
348 | // CHECK-NEXT: | |-MoveConstructor
|
349 | // CHECK-NEXT: | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
|
350 | // CHECK-NEXT: | |-MoveAssignment
|
351 | // CHECK-NEXT: | `-Destructor non_trivial user_declared
|
352 | // CHECK-NEXT: |-TemplateArgument type 'testClassTemplateDecl::D'
|
353 | // CHECK-NEXT: |-CXXRecordDecl 0x{{.+}} prev 0x{{.+}} <line:[[@LINE-114]]:24, col:30> col:30 implicit class TestClassTemplate
|
354 | // CHECK-NEXT: |-AccessSpecDecl 0x{{.+}} <line:[[@LINE-114]]:3, col:9> col:3 public
|
355 | // CHECK-NEXT: |-CXXConstructorDecl 0x{{.+}} <line:[[@LINE-114]]:5, col:23> col:5 TestClassTemplate 'void ()'
|
356 | // CHECK-NEXT: |-CXXDestructorDecl 0x{{.+}} <line:[[@LINE-114]]:5, col:24> col:5 ~TestClassTemplate 'void ()' noexcept-unevaluated 0x{{.+}}
|
357 | // CHECK-NEXT: |-CXXMethodDecl 0x{{.+}} <line:[[@LINE-114]]:5, col:11> col:9 j 'int ()'
|
358 | // CHECK-NEXT: `-FieldDecl 0x{{.+}} <line:[[@LINE-114]]:5, col:9> col:9 i 'int'
|
359 |
|
360 | // CHECK: ClassTemplateDecl 0x{{.+}} <{{.+}}:[[@LINE-98]]:3, line:[[@LINE-96]]:3> line:[[@LINE-98]]:44 TestClassTemplatePartial
|
361 | // CHECK-NEXT: |-TemplateTypeParmDecl 0x{{.+}} <col:12, col:21> col:21 typename depth 0 index 0 T1
|
362 | // CHECK-NEXT: |-TemplateTypeParmDecl 0x{{.+}} <col:25, col:34> col:34 typename depth 0 index 1 T2
|
363 | // CHECK-NEXT: `-CXXRecordDecl 0x{{.+}} <col:38, line:[[@LINE-99]]:3> line:[[@LINE-101]]:44 class TestClassTemplatePartial definition
|
364 | // CHECK-NEXT: |-DefinitionData standard_layout trivially_copyable trivial literal
|
365 | // CHECK-NEXT: | |-DefaultConstructor exists trivial needs_implicit
|
366 | // CHECK-NEXT: | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
|
367 | // CHECK-NEXT: | |-MoveConstructor exists simple trivial needs_implicit
|
368 | // CHECK-NEXT: | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
|
369 | // CHECK-NEXT: | |-MoveAssignment exists simple trivial needs_implicit
|
370 | // CHECK-NEXT: | `-Destructor simple irrelevant trivial needs_implicit
|
371 | // CHECK-NEXT: |-CXXRecordDecl 0x{{.+}} <col:38, col:44> col:44 implicit class TestClassTemplatePartial
|
372 | // CHECK-NEXT: `-FieldDecl 0x{{.+}} <line:[[@LINE-109]]:5, col:9> col:9 i 'int'
|
373 |
|
374 | // CHECK: ClassTemplatePartialSpecializationDecl 0x{{.+}} <{{.+}}:[[@LINE-109]]:3, line:[[@LINE-107]]:3> line:[[@LINE-109]]:31 class TestClassTemplatePartial definition
|
375 | // CHECK-NEXT: |-DefinitionData standard_layout trivially_copyable trivial literal
|
376 | // CHECK-NEXT: | |-DefaultConstructor exists trivial needs_implicit
|
377 | // CHECK-NEXT: | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
|
378 | // CHECK-NEXT: | |-MoveConstructor exists simple trivial needs_implicit
|
379 | // CHECK-NEXT: | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
|
380 | // CHECK-NEXT: | |-MoveAssignment exists simple trivial needs_implicit
|
381 | // CHECK-NEXT: | `-Destructor simple irrelevant trivial needs_implicit
|
382 | // CHECK-NEXT: |-TemplateArgument type 'type-parameter-0-0'
|
383 | // CHECK-NEXT: |-TemplateArgument type 'testClassTemplateDecl::A'
|
384 | // CHECK-NEXT: |-TemplateTypeParmDecl 0x{{.+}} <col:12, col:21> col:21 referenced typename depth 0 index 0 T1
|
385 | // CHECK-NEXT: |-CXXRecordDecl 0x{{.+}} <col:25, col:31> col:31 implicit class TestClassTemplatePartial
|
386 | // CHECK-NEXT: `-FieldDecl 0x{{.+}} <line:[[@LINE-120]]:5, col:9> col:9 j 'int'
|
387 |
|
388 | // CHECK: ClassTemplateDecl 0x{{.+}} <{{.+}}:[[@LINE-119]]:3, col:37> col:37 TestTemplateDefaultType
|
389 | // CHECK-NEXT: |-TemplateTypeParmDecl 0x{{.+}} <col:12, col:25> col:21 typename depth 0 index 0 T
|
390 | // CHECK-NEXT: | `-TemplateArgument type 'int'
|
391 | // CHECK-NEXT: `-CXXRecordDecl 0x{{.+}} <col:30, col:37> col:37 struct TestTemplateDefaultType
|
392 |
|
393 | // CHECK: ClassTemplateDecl 0x{{.+}} prev 0x{{.+}} <{{.+}}:[[@LINE-123]]:3, col:57> col:31 TestTemplateDefaultType
|
394 | // CHECK-NEXT: |-TemplateTypeParmDecl 0x{{.+}} <col:12, col:21> col:21 typename depth 0 index 0 T
|
395 | // CHECK-NEXT: | `-TemplateArgument type 'int'
|
396 | // CHECK-NEXT: | `-inherited from TemplateTypeParm 0x{{.+}} 'T'
|
397 | // CHECK-NEXT: `-CXXRecordDecl 0x{{.+}} prev 0x{{.+}} <col:24, col:57> col:31 struct TestTemplateDefaultType definition
|
398 | // CHECK-NEXT: |-DefinitionData empty aggregate standard_layout trivially_copyable pod trivial literal has_constexpr_non_copy_move_ctor can_const_default_init
|
399 | // CHECK-NEXT: | |-DefaultConstructor exists trivial constexpr needs_implicit defaulted_is_constexpr
|
400 | // CHECK-NEXT: | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
|
401 | // CHECK-NEXT: | |-MoveConstructor exists simple trivial needs_implicit
|
402 | // CHECK-NEXT: | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
|
403 | // CHECK-NEXT: | |-MoveAssignment exists simple trivial needs_implicit
|
404 | // CHECK-NEXT: | `-Destructor simple irrelevant trivial needs_implicit
|
405 | // CHECK-NEXT: `-CXXRecordDecl 0x{{.+}} <col:24, col:31> col:31 implicit struct TestTemplateDefaultType
|
406 |
|
407 | // CHECK: ClassTemplateDecl 0x{{.+}} <{{.+}}:[[@LINE-135]]:3, col:31> col:31 TestTemplateDefaultNonType
|
408 | // CHECK-NEXT: |-NonTypeTemplateParmDecl 0x{{.+}} <col:12, col:20> col:16 'int' depth 0 index 0 I
|
409 | // CHECK-NEXT: | `-TemplateArgument expr
|
410 | // CHECK-NEXT: | `-ConstantExpr 0x{{.+}} <col:20> 'int'
|
411 | // CHECK-NEXT: | `-IntegerLiteral 0x{{.+}} <col:20> 'int' 42
|
412 | // CHECK-NEXT: `-CXXRecordDecl 0x{{.+}} <col:24, col:31> col:31 struct TestTemplateDefaultNonType
|
413 |
|
414 | // CHECK: ClassTemplateDecl 0x{{.+}} <{{.+}}:275:3, col:68> col:68 TestTemplateTemplateDefaultType
|
415 | // CHECK-NEXT: |-TemplateTemplateParmDecl 0x{{.+}} <col:12, col:42> col:37 depth 0 index 0 TT
|
416 | // CHECK-NEXT: | |-TemplateTypeParmDecl 0x{{.+}} <col:21> col:21 typename depth 1 index 0
|
417 | // CHECK-NEXT: | `-TemplateArgument <col:42> template TestClassTemplate
|
418 | // CHECK-NEXT: `-CXXRecordDecl 0x{{.+}} <col:61, col:68> col:68 struct TestTemplateTemplateDefaultType
|
419 |
|
420 | // CHECK: ClassTemplateDecl 0x{{.+}} prev 0x{{.+}} <{{.+}}:276:3, col:82> col:48 TestTemplateTemplateDefaultType
|
421 | // CHECK-NEXT: |-TemplateTemplateParmDecl 0x{{.+}} <col:12, col:37> col:37 depth 0 index 0 TT
|
422 | // CHECK-NEXT: | |-TemplateTypeParmDecl 0x{{.+}} <col:21> col:21 typename depth 1 index 0
|
423 | // CHECK-NEXT: | `-TemplateArgument <line:275:42> template TestClassTemplate
|
424 | // CHECK-NEXT: | `-inherited from TemplateTemplateParm 0x{{.+}} 'TT'
|
425 | // CHECK-NEXT: `-CXXRecordDecl 0x{{.+}} prev 0x{{.+}} <line:276:41, col:82> col:48 struct TestTemplateTemplateDefaultType definition
|
426 | // CHECK-NEXT: |-DefinitionData empty aggregate standard_layout trivially_copyable pod trivial literal has_constexpr_non_copy_move_ctor can_const_default_init
|
427 | // CHECK-NEXT: | |-DefaultConstructor exists trivial constexpr needs_implicit defaulted_is_constexpr
|
428 | // CHECK-NEXT: | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
|
429 | // CHECK-NEXT: | |-MoveConstructor exists simple trivial needs_implicit
|
430 | // CHECK-NEXT: | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
|
431 | // CHECK-NEXT: | |-MoveAssignment exists simple trivial needs_implicit
|
432 | // CHECK-NEXT: | `-Destructor simple irrelevant trivial needs_implicit
|
433 | // CHECK-NEXT: `-CXXRecordDecl 0x{{.+}} <col:41, col:48> col:48 implicit struct TestTemplateTemplateDefaultType
|
434 |
|
435 |
|
436 | // PR15220 dump instantiation only once
|
437 | namespace testCanonicalTemplate {
|
438 | class A {};
|
439 |
|
440 | template<typename T> void TestFunctionTemplate(T);
|
441 | template<typename T> void TestFunctionTemplate(T);
|
442 | void bar(A a) { TestFunctionTemplate(a); }
|
443 | // CHECK: FunctionTemplateDecl 0x{{.+}} <{{.+}}:[[@LINE-3]]:3, col:51> col:29 TestFunctionTemplate
|
444 | // CHECK-NEXT: |-TemplateTypeParmDecl 0x{{.+}} <col:12, col:21> col:21 referenced typename depth 0 index 0 T
|
445 | // CHECK-NEXT: |-FunctionDecl 0x{{.*}} <col:24, col:51> col:29 TestFunctionTemplate 'void (T)'
|
446 | // CHECK-NEXT: | `-ParmVarDecl 0x{{.*}} <col:50> col:51 'T'
|
447 | // CHECK-NEXT: `-FunctionDecl 0x{{.*}} <line:[[@LINE-6]]:24, col:51> col:29 used TestFunctionTemplate 'void (testCanonicalTemplate::A)'
|
448 | // CHECK-NEXT: |-TemplateArgument type 'testCanonicalTemplate::A'
|
449 | // CHECK-NEXT: `-ParmVarDecl 0x{{.*}} <col:50> col:51 'testCanonicalTemplate::A':'testCanonicalTemplate::A'
|
450 |
|
451 | // CHECK: FunctionTemplateDecl 0x{{.+}} prev 0x{{.+}} <{{.+}}:[[@LINE-10]]:3, col:51> col:29 TestFunctionTemplate
|
452 | // CHECK-NEXT: |-TemplateTypeParmDecl 0x{{.+}} <col:12, col:21> col:21 referenced typename depth 0 index 0 T
|
453 | // CHECK-NEXT: |-FunctionDecl{{.*}} 0x{{.+}} prev 0x{{.+}} <col:24, col:51> col:29 TestFunctionTemplate 'void (T)'
|
454 | // CHECK-NEXT: | `-ParmVarDecl 0x{{.+}} <col:50> col:51 'T'
|
455 | // CHECK-NEXT: `-Function 0x{{.+}} 'TestFunctionTemplate' 'void (testCanonicalTemplate::A)'
|
456 | // CHECK-NOT: TemplateArgument
|
457 |
|
458 | template<typename T1> class TestClassTemplate {
|
459 | template<typename T2> friend class TestClassTemplate;
|
460 | };
|
461 | TestClassTemplate<A> a;
|
462 | // CHECK: ClassTemplateDecl 0x{{.+}} <{{.+}}:[[@LINE-4]]:3, line:[[@LINE-2]]:3> line:[[@LINE-4]]:31 TestClassTemplate
|
463 | // CHECK-NEXT: |-TemplateTypeParmDecl 0x{{.+}} <col:12, col:21> col:21 typename depth 0 index 0 T1
|
464 | // CHECK-NEXT: |-CXXRecordDecl 0x{{.+}} <col:25, line:[[@LINE-4]]:3> line:[[@LINE-6]]:31 class TestClassTemplate definition
|
465 | // CHECK-NEXT: | |-DefinitionData empty aggregate standard_layout trivially_copyable pod trivial literal has_constexpr_non_copy_move_ctor can_const_default_init
|
466 | // CHECK-NEXT: | | |-DefaultConstructor exists trivial constexpr needs_implicit defaulted_is_constexpr
|
467 | // CHECK-NEXT: | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
|
468 | // CHECK-NEXT: | | |-MoveConstructor exists simple trivial needs_implicit
|
469 | // CHECK-NEXT: | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
|
470 | // CHECK-NEXT: | | |-MoveAssignment exists simple trivial needs_implicit
|
471 | // CHECK-NEXT: | | `-Destructor simple irrelevant trivial needs_implicit
|
472 | // CHECK-NEXT: | |-CXXRecordDecl 0x{{.+}} <col:25, col:31> col:31 implicit class TestClassTemplate
|
473 | // CHECK-NEXT: | `-FriendDecl 0x{{.+}} <line:[[@LINE-14]]:5, col:40> col:40
|
474 | // CHECK-NEXT: | `-ClassTemplateDecl 0x{{.+}} parent 0x{{.+}} <col:5, col:40> col:40 TestClassTemplate
|
475 | // CHECK-NEXT: | |-TemplateTypeParmDecl 0x{{.+}} <col:14, col:23> col:23 typename depth 1 index 0 T2
|
476 | // CHECK-NEXT: | `-CXXRecordDecl 0x{{.+}} parent 0x{{.+}} <col:34, col:40> col:40 class TestClassTemplate
|
477 | // CHECK-NEXT: `-ClassTemplateSpecializationDecl 0x{{.+}} <line:[[@LINE-19]]:3, line:[[@LINE-17]]:3> line:[[@LINE-19]]:31 class TestClassTemplate definition
|
478 | // CHECK-NEXT: |-DefinitionData pass_in_registers empty aggregate standard_layout trivially_copyable pod trivial literal has_constexpr_non_copy_move_ctor can_const_default_init
|
479 | // CHECK-NEXT: | |-DefaultConstructor exists trivial constexpr defaulted_is_constexpr
|
480 | // CHECK-NEXT: | |-CopyConstructor simple trivial has_const_param implicit_has_const_param
|
481 | // CHECK-NEXT: | |-MoveConstructor exists simple trivial
|
482 | // CHECK-NEXT: | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
|
483 | // CHECK-NEXT: | |-MoveAssignment exists simple trivial needs_implicit
|
484 | // CHECK-NEXT: | `-Destructor simple irrelevant trivial needs_implicit
|
485 | // CHECK-NEXT: |-TemplateArgument type 'testCanonicalTemplate::A'
|
486 | // CHECK-NEXT: |-CXXRecordDecl 0x{{.+}} prev 0x{{.+}} <col:25, col:31> col:31 implicit class TestClassTemplate
|
487 | // CHECK-NEXT: |-FriendDecl 0x{{.+}} <line:[[@LINE-28]]:5, col:40> col:40
|
488 | // CHECK-NEXT: | `-ClassTemplateDecl 0x{{.+}} parent 0x{{.+}} prev 0x{{.+}} <col:5, col:40> col:40 TestClassTemplate
|
489 | // CHECK-NEXT: | |-TemplateTypeParmDecl 0x{{.+}} <col:14, col:23> col:23 typename depth 0 index 0 T2
|
490 | // CHECK-NEXT: | |-CXXRecordDecl 0x{{.+}} parent 0x{{.+}} prev 0x{{.+}} <col:34, col:40> col:40 class TestClassTemplate
|
491 | // CHECK-NEXT: | `-ClassTemplateSpecialization 0x{{.+}} 'TestClassTemplate'
|
492 | // CHECK-NEXT: |-CXXConstructorDecl 0x{{.+}} <line:[[@LINE-34]]:31> col:31 implicit used constexpr TestClassTemplate 'void () noexcept' inline default trivial
|
493 | // CHECK-NEXT: | `-CompoundStmt 0x{{.+}} <col:31>
|
494 | // CHECK-NEXT: |-CXXConstructorDecl 0x{{.+}} <col:31> col:31 implicit constexpr TestClassTemplate 'void (const testCanonicalTemplate::TestClassTemplate<testCanonicalTemplate::A> &)' inline default trivial noexcept-unevaluated 0x{{.+}}
|
495 | // CHECK-NEXT: | `-ParmVarDecl 0x{{.+}} <col:31> col:31 'const testCanonicalTemplate::TestClassTemplate<testCanonicalTemplate::A> &'
|
496 | // CHECK-NEXT: `-CXXConstructorDecl 0x{{.+}} <col:31> col:31 implicit constexpr TestClassTemplate 'void (testCanonicalTemplate::TestClassTemplate<testCanonicalTemplate::A> &&)' inline default trivial noexcept-unevaluated 0x{{.+}}
|
497 | // CHECK-NEXT: `-ParmVarDecl 0x{{.+}} <col:31> col:31 'testCanonicalTemplate::TestClassTemplate<testCanonicalTemplate::A> &&'
|
498 |
|
499 |
|
500 | template<typename T1> class TestClassTemplate2;
|
501 | template<typename T1> class TestClassTemplate2;
|
502 | template<typename T1> class TestClassTemplate2 {
|
503 | };
|
504 | TestClassTemplate2<A> a2;
|
505 | // CHECK: ClassTemplateDecl 0x{{.+}} <{{.+}}:[[@LINE-5]]:3, col:31> col:31 TestClassTemplate2
|
506 | // CHECK-NEXT: |-TemplateTypeParmDecl 0x{{.+}} <col:12, col:21> col:21 typename depth 0 index 0 T1
|
507 | // CHECK-NEXT: |-CXXRecordDecl 0x{{.+}} <col:25, col:31> col:31 class TestClassTemplate2
|
508 | // CHECK-NEXT: `-ClassTemplateSpecializationDecl 0x{{.+}} <line:[[@LINE-6]]:3, line:[[@LINE-5]]:3> line:[[@LINE-6]]:31 class TestClassTemplate2 definition
|
509 | // CHECK-NEXT: |-DefinitionData pass_in_registers empty aggregate standard_layout trivially_copyable pod trivial literal has_constexpr_non_copy_move_ctor can_const_default_init
|
510 | // CHECK-NEXT: | |-DefaultConstructor exists trivial constexpr defaulted_is_constexpr
|
511 | // CHECK-NEXT: | |-CopyConstructor simple trivial has_const_param implicit_has_const_param
|
512 | // CHECK-NEXT: | |-MoveConstructor exists simple trivial
|
513 | // CHECK-NEXT: | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
|
514 | // CHECK-NEXT: | |-MoveAssignment exists simple trivial needs_implicit
|
515 | // CHECK-NEXT: | `-Destructor simple irrelevant trivial needs_implicit
|
516 | // CHECK-NEXT: |-TemplateArgument type 'testCanonicalTemplate::A'
|
517 | // CHECK-NEXT: |-CXXRecordDecl 0x{{.+}} prev 0x{{.+}} <col:25, col:31> col:31 implicit class TestClassTemplate2
|
518 | // CHECK-NEXT: |-CXXConstructorDecl 0x{{.+}} <col:31> col:31 implicit used constexpr TestClassTemplate2 'void () noexcept' inline default trivial
|
519 | // CHECK-NEXT: | `-CompoundStmt 0x{{.+}} <col:31>
|
520 | // CHECK-NEXT: |-CXXConstructorDecl 0x{{.+}} <col:31> col:31 implicit constexpr TestClassTemplate2 'void (const testCanonicalTemplate::TestClassTemplate2<testCanonicalTemplate::A> &)' inline default trivial noexcept-unevaluated 0x{{.+}}
|
521 | // CHECK-NEXT: | `-ParmVarDecl 0x{{.+}} <col:31> col:31 'const testCanonicalTemplate::TestClassTemplate2<testCanonicalTemplate::A> &'
|
522 | // CHECK-NEXT: `-CXXConstructorDecl 0x{{.+}} <col:31> col:31 implicit constexpr TestClassTemplate2 'void (testCanonicalTemplate::TestClassTemplate2<testCanonicalTemplate::A> &&)' inline default trivial noexcept-unevaluated 0x{{.+}}
|
523 | // CHECK-NEXT: `-ParmVarDecl 0x{{.+}} <col:31> col:31 'testCanonicalTemplate::TestClassTemplate2<testCanonicalTemplate::A> &&'
|
524 |
|
525 | // CHECK: ClassTemplateDecl 0x{{.+}} prev 0x{{.+}} <{{.+}}:[[@LINE-24]]:3, col:31> col:31 TestClassTemplate2
|
526 | // CHECK-NEXT: |-TemplateTypeParmDecl 0x{{.+}} <col:12, col:21> col:21 typename depth 0 index 0 T1
|
527 | // CHECK-NEXT: |-CXXRecordDecl 0x{{.+}} prev 0x{{.+}} <col:25, col:31> col:31 class TestClassTemplate2
|
528 | // CHECK-NEXT: `-ClassTemplateSpecialization 0x{{.+}} 'TestClassTemplate2'
|
529 |
|
530 | // CHECK: ClassTemplateDecl 0x{{.+}} prev 0x{{.+}} <{{.+}}:[[@LINE-28]]:3, line:[[@LINE-27]]:3> line:[[@LINE-28]]:31 TestClassTemplate2
|
531 | // CHECK-NEXT: |-TemplateTypeParmDecl 0x{{.+}} <col:12, col:21> col:21 typename depth 0 index 0 T1
|
532 | // CHECK-NEXT: |-CXXRecordDecl 0x{{.+}} prev 0x{{.+}} <col:25, line:[[@LINE-29]]:3> line:[[@LINE-30]]:31 class TestClassTemplate2 definition
|
533 | // CHECK-NEXT: | |-DefinitionData empty aggregate standard_layout trivially_copyable pod trivial literal has_constexpr_non_copy_move_ctor can_const_default_init
|
534 | // CHECK-NEXT: | | |-DefaultConstructor exists trivial constexpr needs_implicit defaulted_is_constexpr
|
535 | // CHECK-NEXT: | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param
|
536 | // CHECK-NEXT: | | |-MoveConstructor exists simple trivial needs_implicit
|
537 | // CHECK-NEXT: | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param
|
538 | // CHECK-NEXT: | | |-MoveAssignment exists simple trivial needs_implicit
|
539 | // CHECK-NEXT: | | `-Destructor simple irrelevant trivial needs_implicit
|
540 | // CHECK-NEXT: | `-CXXRecordDecl 0x{{.+}} <col:25, col:31> col:31 implicit class TestClassTemplate2
|
541 | // CHECK-NEXT: `-ClassTemplateSpecialization 0x{{.+}} 'TestClassTemplate2'
|
542 |
|
543 | struct S {
|
544 | template<typename T> static const T TestVarTemplate; // declaration of a static data member template
|
545 | };
|
546 | template<typename T>
|
547 | const T S::TestVarTemplate = { }; // definition of a static data member template
|
548 |
|
549 | void f()
|
550 | {
|
551 | int i = S::TestVarTemplate<int>;
|
552 | int j = S::TestVarTemplate<int>;
|
553 | }
|
554 |
|
555 | // CHECK: VarTemplateDecl 0x{{.+}} <{{.+}}:[[@LINE-11]]:7, col:43> col:43 TestVarTemplate
|
556 | // CHECK-NEXT: |-TemplateTypeParmDecl 0x{{.+}} <col:16, col:25> col:25 referenced typename depth 0 index 0 T
|
557 | // CHECK-NEXT: |-VarDecl 0x{{.+}} <col:28, col:43> col:43 TestVarTemplate 'const T' static
|
558 | // CHECK-NEXT: |-VarTemplateSpecializationDecl 0x{{.+}} parent 0x{{.+}} prev 0x{{.+}} <line:[[@LINE-11]]:3, col:34> col:14 referenced TestVarTemplate 'const int':'const int' cinit
|
559 | // CHECK-NEXT: | |-TemplateArgument type 'int'
|
560 | // CHECK-NEXT: | `-InitListExpr 0x{{.+}} <col:32, col:34> 'int':'int'
|
561 | // CHECK-NEXT: `-VarTemplateSpecializationDecl 0x{{.+}} <line:[[@LINE-17]]:28, col:43> col:43 referenced TestVarTemplate 'const int':'const int' static
|
562 | // CHECK-NEXT: `-TemplateArgument type 'int'
|
563 |
|
564 | // CHECK: VarTemplateSpecializationDecl 0x{{.+}} <{{.+}}:[[@LINE-20]]:28, col:43> col:43 referenced TestVarTemplate 'const int':'const int' static
|
565 | // CHECK-NEXT:`-TemplateArgument type 'int'
|
566 |
|
567 | // CHECK: VarTemplateDecl 0x{{.+}} parent 0x{{.+}} prev 0x{{.+}} <{{.+}}:[[@LINE-21]]:3, line:[[@LINE-20]]:34> col:14 TestVarTemplate
|
568 | // CHECK-NEXT: |-TemplateTypeParmDecl 0x{{.+}} <line:[[@LINE-22]]:12, col:21> col:21 referenced typename depth 0 index 0 T
|
569 | // CHECK-NEXT: |-VarDecl 0x{{.+}} parent 0x{{.+}} prev 0x{{.+}} <line:[[@LINE-22]]:3, col:34> col:14 TestVarTemplate 'const T' cinit
|
570 | // CHECK-NEXT: | `-InitListExpr 0x{{.+}} <col:32, col:34> 'void'
|
571 | // CHECK-NEXT: |-VarTemplateSpecialization 0x{{.+}} 'TestVarTemplate' 'const int':'const int'
|
572 | // CHECK-NEXT: `-VarTemplateSpecialization 0x{{.+}} 'TestVarTemplate' 'const int':'const int'
|
573 |
|
574 | // CHECK: VarTemplateSpecializationDecl 0x{{.+}} parent 0x{{.+}} prev 0x{{.+}} <{{.+}}:[[@LINE-27]]:3, col:34> col:14 referenced TestVarTemplate 'const int':'const int' cinit
|
575 | // CHECK-NEXT: |-TemplateArgument type 'int'
|
576 | // CHECK-NEXT: `-InitListExpr 0x{{.+}} <col:32, col:34> 'int':'int'
|
577 | }
|
578 |
|
579 | template <class T>
|
580 | class TestClassScopeFunctionSpecialization {
|
581 | template<class U> void foo(U a) { }
|
582 | template<> void foo<int>(int a) { }
|
583 | };
|
584 | // CHECK: ClassScopeFunctionSpecializationDecl
|
585 | // CHECK-NEXT: CXXMethod{{.*}} foo 'void (int)'
|
586 | // CHECK-NEXT: ParmVarDecl
|
587 | // CHECK-NEXT: CompoundStmt
|
588 | // CHECK-NEXT: TemplateArgument{{.*}} 'int'
|
589 |
|
590 | namespace TestTemplateTypeParmDecl {
|
591 | template<typename ... T, class U = int> void foo();
|
592 | }
|
593 | // CHECK: NamespaceDecl{{.*}} TestTemplateTypeParmDecl
|
594 | // CHECK-NEXT: FunctionTemplateDecl
|
595 | // CHECK-NEXT: TemplateTypeParmDecl{{.*}} typename depth 0 index 0 ... T
|
596 | // CHECK-NEXT: TemplateTypeParmDecl{{.*}} class depth 0 index 1 U
|
597 | // CHECK-NEXT: TemplateArgument type 'int'
|
598 |
|
599 | namespace TestNonTypeTemplateParmDecl {
|
600 | template<int I = 1, int ... J> void foo();
|
601 | }
|
602 | // CHECK: NamespaceDecl{{.*}} TestNonTypeTemplateParmDecl
|
603 | // CHECK-NEXT: FunctionTemplateDecl
|
604 | // CHECK-NEXT: NonTypeTemplateParmDecl{{.*}} 'int' depth 0 index 0 I
|
605 | // CHECK-NEXT: TemplateArgument expr
|
606 | // CHECK-NEXT: ConstantExpr{{.*}} 'int'
|
607 | // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 1
|
608 | // CHECK-NEXT: NonTypeTemplateParmDecl{{.*}} 'int' depth 0 index 1 ... J
|
609 |
|
610 | namespace TestTemplateTemplateParmDecl {
|
611 | template<typename T> class A;
|
612 | template <template <typename> class T = A, template <typename> class ... U> void foo();
|
613 | }
|
614 | // CHECK: NamespaceDecl{{.*}} TestTemplateTemplateParmDecl
|
615 | // CHECK: FunctionTemplateDecl
|
616 | // CHECK-NEXT: TemplateTemplateParmDecl{{.*}} T
|
617 | // CHECK-NEXT: TemplateTypeParmDecl{{.*}} typename
|
618 | // CHECK-NEXT: TemplateArgument{{.*}} template A
|
619 | // CHECK-NEXT: TemplateTemplateParmDecl{{.*}} ... U
|
620 | // CHECK-NEXT: TemplateTypeParmDecl{{.*}} typename
|
621 |
|
622 | namespace TestTemplateArgument {
|
623 | template<typename> class A { };
|
624 | template<template<typename> class ...> class B { };
|
625 | int foo();
|
626 |
|
627 | template<typename> class testType { };
|
628 | template class testType<int>;
|
629 | // CHECK: ClassTemplateSpecializationDecl{{.*}} class testType
|
630 | // CHECK: TemplateArgument{{.*}} type 'int'
|
631 |
|
632 | template<int fp(void)> class testDecl { };
|
633 | template class testDecl<foo>;
|
634 | // CHECK: ClassTemplateSpecializationDecl{{.*}} class testDecl
|
635 | // CHECK: TemplateArgument{{.*}} decl
|
636 | // CHECK-NEXT: Function{{.*}}foo
|
637 |
|
638 | template class testDecl<nullptr>;
|
639 | // CHECK: ClassTemplateSpecializationDecl{{.*}} class testDecl
|
640 | // CHECK: TemplateArgument{{.*}} nullptr
|
641 |
|
642 | template<int> class testIntegral { };
|
643 | template class testIntegral<1>;
|
644 | // CHECK: ClassTemplateSpecializationDecl{{.*}} class testIntegral
|
645 | // CHECK: TemplateArgument{{.*}} integral 1
|
646 |
|
647 | template<template<typename> class> class testTemplate { };
|
648 | template class testTemplate<A>;
|
649 | // CHECK: ClassTemplateSpecializationDecl{{.*}} class testTemplate
|
650 | // CHECK: TemplateArgument{{.*}} A
|
651 |
|
652 | template<template<typename> class ...T> class C {
|
653 | B<T...> testTemplateExpansion;
|
654 | };
|
655 | // FIXME: Need TemplateSpecializationType dumping to test TemplateExpansion.
|
656 |
|
657 | template<int, int = 0> class testExpr;
|
658 | template<int I> class testExpr<I> { };
|
659 | // CHECK: ClassTemplatePartialSpecializationDecl{{.*}} class testExpr
|
660 | // CHECK: TemplateArgument{{.*}} expr
|
661 | // CHECK-NEXT: DeclRefExpr{{.*}}I
|
662 |
|
663 | template<int, int ...> class testPack { };
|
664 | template class testPack<0, 1, 2>;
|
665 | // CHECK: ClassTemplateSpecializationDecl{{.*}} class testPack
|
666 | // CHECK: TemplateArgument{{.*}} integral 0
|
667 | // CHECK-NEXT: TemplateArgument{{.*}} pack
|
668 | // CHECK-NEXT: TemplateArgument{{.*}} integral 1
|
669 | // CHECK-NEXT: TemplateArgument{{.*}} integral 2
|
670 | }
|
671 |
|
672 | namespace testUsingDecl {
|
673 | int i;
|
674 | }
|
675 | namespace TestUsingDecl {
|
676 | using testUsingDecl::i;
|
677 | }
|
678 | // CHECK: NamespaceDecl{{.*}} TestUsingDecl
|
679 | // CHECK-NEXT: UsingDecl{{.*}} testUsingDecl::i
|
680 | // CHECK-NEXT: UsingShadowDecl{{.*}} Var{{.*}} 'i' 'int'
|
681 |
|
682 | namespace testUnresolvedUsing {
|
683 | class A { };
|
684 | template<class T> class B {
|
685 | public:
|
686 | A a;
|
687 | };
|
688 | template<class T> class TestUnresolvedUsing : public B<T> {
|
689 | using typename B<T>::a;
|
690 | using B<T>::a;
|
691 | };
|
692 | }
|
693 | // CHECK: CXXRecordDecl{{.*}} TestUnresolvedUsing
|
694 | // CHECK: UnresolvedUsingTypenameDecl{{.*}} B<T>::a
|
695 | // CHECK: UnresolvedUsingValueDecl{{.*}} B<T>::a
|
696 |
|
697 | namespace TestLinkageSpecDecl {
|
698 | extern "C" void test1();
|
699 | extern "C++" void test2();
|
700 | }
|
701 | // CHECK: NamespaceDecl{{.*}} TestLinkageSpecDecl
|
702 | // CHECK-NEXT: LinkageSpecDecl{{.*}} C
|
703 | // CHECK-NEXT: FunctionDecl
|
704 | // CHECK-NEXT: LinkageSpecDecl{{.*}} C++
|
705 | // CHECK-NEXT: FunctionDecl
|
706 |
|
707 | class TestAccessSpecDecl {
|
708 | public:
|
709 | private:
|
710 | protected:
|
711 | };
|
712 | // CHECK: CXXRecordDecl{{.*}} class TestAccessSpecDecl
|
713 | // CHECK: CXXRecordDecl{{.*}} class TestAccessSpecDecl
|
714 | // CHECK-NEXT: AccessSpecDecl{{.*}} public
|
715 | // CHECK-NEXT: AccessSpecDecl{{.*}} private
|
716 | // CHECK-NEXT: AccessSpecDecl{{.*}} protected
|
717 |
|
718 | template<typename T> class TestFriendDecl {
|
719 | friend int foo();
|
720 | friend class A;
|
721 | friend T;
|
722 | };
|
723 | // CHECK: CXXRecord{{.*}} TestFriendDecl
|
724 | // CHECK: CXXRecord{{.*}} TestFriendDecl
|
725 | // CHECK-NEXT: FriendDecl
|
726 | // CHECK-NEXT: FunctionDecl{{.*}} foo
|
727 | // CHECK-NEXT: FriendDecl{{.*}} 'class A':'A'
|
728 | // CHECK-NEXT: FriendDecl{{.*}} 'T'
|
729 |
|
730 | namespace TestFileScopeAsmDecl {
|
731 | asm("ret");
|
732 | }
|
733 | // CHECK: NamespaceDecl{{.*}} TestFileScopeAsmDecl{{$}}
|
734 | // CHECK: FileScopeAsmDecl{{.*> .*$}}
|
735 | // CHECK-NEXT: StringLiteral
|
736 |
|
737 | namespace TestFriendDecl2 {
|
738 | void f();
|
739 | struct S {
|
740 | friend void f();
|
741 | };
|
742 | }
|
743 | // CHECK: NamespaceDecl [[TestFriendDecl2:0x.*]] <{{.*}}> {{.*}} TestFriendDecl2
|
744 | // CHECK: |-FunctionDecl [[TestFriendDecl2_f:0x.*]] <{{.*}}> {{.*}} f 'void ()'
|
745 | // CHECK: `-CXXRecordDecl {{.*}} struct S
|
746 | // CHECK: |-CXXRecordDecl {{.*}} struct S
|
747 | // CHECK: `-FriendDecl
|
748 | // CHECK: `-FunctionDecl {{.*}} parent [[TestFriendDecl2]] prev [[TestFriendDecl2_f]] <{{.*}}> {{.*}} f 'void ()'
|
749 |
|
750 | namespace Comment {
|
751 | extern int Test;
|
752 | /// Something here.
|
753 | extern int Test;
|
754 | extern int Test;
|
755 | }
|
756 |
|
757 | // CHECK: VarDecl {{.*}} Test 'int' extern
|
758 | // CHECK-NOT: FullComment
|
759 | // CHECK: VarDecl {{.*}} Test 'int' extern
|
760 | // CHECK: `-FullComment
|
761 | // CHECK: `-ParagraphComment
|
762 | // CHECK: `-TextComment
|
763 | // CHECK: VarDecl {{.*}} Test 'int' extern
|
764 | // CHECK-NOT: FullComment
|
765 | |