1 // RUN: %clang_cc1 -std=c++11 -triple x86_64-linux-gnu -fms-extensions -ast-dump -ast-dump-filter Test %s | FileCheck -check-prefix CHECK -strict-whitespace %s
4 enum class TestEnumDeclScoped;
5 enum TestEnumDeclFixed : int;
7 // CHECK: EnumDecl{{.*}} class TestEnumDeclScoped 'int'
8 // CHECK: EnumDecl{{.*}} TestEnumDeclFixed 'int'
11 int TestFieldDeclInit = 0;
13 // CHECK: FieldDecl{{.*}} TestFieldDeclInit 'int'
14 // CHECK-NEXT: IntegerLiteral
16 namespace testVarDeclNRVO {
20 return TestVarDeclNRVO;
23 // CHECK: VarDecl{{.*}} TestVarDeclNRVO 'class testVarDeclNRVO::A' nrvo
25 void testParmVarDeclInit(int TestParmVarDeclInit = 0);
26 // CHECK: ParmVarDecl{{.*}} TestParmVarDeclInit 'int'
27 // CHECK-NEXT: IntegerLiteral{{.*}}
29 namespace TestNamespaceDecl {
32 // CHECK: NamespaceDecl{{.*}} TestNamespaceDecl
33 // CHECK-NEXT: VarDecl
35 namespace TestNamespaceDecl {
38 // CHECK: NamespaceDecl{{.*}} TestNamespaceDecl
39 // CHECK-NEXT: original Namespace
40 // CHECK-NEXT: VarDecl
42 inline namespace TestNamespaceDeclInline {
44 // CHECK: NamespaceDecl{{.*}} TestNamespaceDeclInline inline
46 namespace testUsingDirectiveDecl {
50 namespace TestUsingDirectiveDecl {
51 using namespace testUsingDirectiveDecl::A;
53 // CHECK: NamespaceDecl{{.*}} TestUsingDirectiveDecl
54 // CHECK-NEXT: UsingDirectiveDecl{{.*}} Namespace{{.*}} 'A'
56 namespace testNamespaceAlias {
60 namespace TestNamespaceAlias = testNamespaceAlias::A;
61 // CHECK: NamespaceAliasDecl{{.*}} TestNamespaceAlias
62 // CHECK-NEXT: Namespace{{.*}} 'A'
64 using TestTypeAliasDecl = int;
65 // CHECK: TypeAliasDecl{{.*}} TestTypeAliasDecl 'int'
67 namespace testTypeAliasTemplateDecl {
68 template<typename T> class A;
69 template<typename T> using TestTypeAliasTemplateDecl = A<T>;
71 // CHECK: TypeAliasTemplateDecl{{.*}} TestTypeAliasTemplateDecl
72 // CHECK-NEXT: TemplateTypeParmDecl
73 // CHECK-NEXT: TypeAliasDecl{{.*}} TestTypeAliasTemplateDecl 'A<T>'
75 namespace testCXXRecordDecl {
78 class TestCXXRecordDecl : virtual A, public B {
82 // CHECK: CXXRecordDecl{{.*}} class TestCXXRecordDecl
83 // CHECK-NEXT: virtual private 'class testCXXRecordDecl::A'
84 // CHECK-NEXT: public 'class testCXXRecordDecl::B'
85 // CHECK-NEXT: CXXRecordDecl{{.*}} class TestCXXRecordDecl
86 // CHECK-NEXT: FieldDecl
89 class TestCXXRecordDeclPack : public T... {
91 // CHECK: CXXRecordDecl{{.*}} class TestCXXRecordDeclPack
92 // CHECK-NEXT: public 'T'...
93 // CHECK-NEXT: CXXRecordDecl{{.*}} class TestCXXRecordDeclPack
95 thread_local int TestThreadLocalInt;
96 // CHECK: TestThreadLocalInt {{.*}} tls_dynamic
98 __module_private__ class TestCXXRecordDeclPrivate;
99 // CHECK: CXXRecordDecl{{.*}} class TestCXXRecordDeclPrivate __module_private__
101 class testCXXMethodDecl {
102 __module_private__ void TestCXXMethodDeclPrivate();
103 virtual void TestCXXMethodDeclPure() = 0;
104 void TestCXXMethodDeclDelete() = delete;
105 void TestCXXMethodDeclThrow() throw();
106 void TestCXXMethodDeclThrowType() throw(int);
108 // CHECK: CXXMethodDecl{{.*}} TestCXXMethodDeclPrivate 'void (void)' __module_private__
109 // CHECK: CXXMethodDecl{{.*}} TestCXXMethodDeclPure 'void (void)' virtual pure
110 // CHECK: CXXMethodDecl{{.*}} TestCXXMethodDeclDelete 'void (void)' delete
111 // CHECK: CXXMethodDecl{{.*}} TestCXXMethodDeclThrow 'void (void) throw()'
112 // CHECK: CXXMethodDecl{{.*}} TestCXXMethodDeclThrowType 'void (void) throw(int)'
114 namespace testCXXConstructorDecl {
116 class TestCXXConstructorDecl : public A {
118 TestCXXConstructorDecl(A &a, int i) : A(a), I(i) { }
119 TestCXXConstructorDecl(A &a) : TestCXXConstructorDecl(a, 0) { }
122 // CHECK: CXXConstructorDecl{{.*}} TestCXXConstructorDecl 'void {{.*}}'
123 // CHECK-NEXT: ParmVarDecl{{.*}} a
124 // CHECK-NEXT: ParmVarDecl{{.*}} i
125 // CHECK-NEXT: CXXCtorInitializer{{.*}}A
127 // CHECK: CXXCtorInitializer{{.*}}I
129 // CHECK: CompoundStmt
130 // CHECK: CXXConstructorDecl{{.*}} TestCXXConstructorDecl 'void {{.*}}'
131 // CHECK-NEXT: ParmVarDecl{{.*}} a
132 // CHECK-NEXT: CXXCtorInitializer{{.*}}TestCXXConstructorDecl
133 // CHECK-NEXT: CXXConstructExpr{{.*}}TestCXXConstructorDecl
135 class TestCXXDestructorDecl {
136 ~TestCXXDestructorDecl() { }
138 // CHECK: CXXDestructorDecl{{.*}} ~TestCXXDestructorDecl 'void (void) noexcept'
139 // CHECK-NEXT: CompoundStmt
141 // Test that the range of a defaulted members is computed correctly.
142 class TestMemberRanges {
144 TestMemberRanges() = default;
145 TestMemberRanges(const TestMemberRanges &Other) = default;
146 TestMemberRanges(TestMemberRanges &&Other) = default;
147 ~TestMemberRanges() = default;
148 TestMemberRanges &operator=(const TestMemberRanges &Other) = default;
149 TestMemberRanges &operator=(TestMemberRanges &&Other) = default;
151 void SomeFunction() {
153 TestMemberRanges B(A);
155 A = static_cast<TestMemberRanges &&>(B);
156 TestMemberRanges C(static_cast<TestMemberRanges &&>(A));
158 // CHECK: CXXConstructorDecl{{.*}} <line:{{.*}}:3, col:30>
159 // CHECK: CXXConstructorDecl{{.*}} <line:{{.*}}:3, col:59>
160 // CHECK: CXXConstructorDecl{{.*}} <line:{{.*}}:3, col:54>
161 // CHECK: CXXDestructorDecl{{.*}} <line:{{.*}}:3, col:31>
162 // CHECK: CXXMethodDecl{{.*}} <line:{{.*}}:3, col:70>
163 // CHECK: CXXMethodDecl{{.*}} <line:{{.*}}:3, col:65>
165 class TestCXXConversionDecl {
166 operator int() { return 0; }
168 // CHECK: CXXConversionDecl{{.*}} operator int 'int (void)'
169 // CHECK-NEXT: CompoundStmt
171 namespace TestStaticAssertDecl {
172 static_assert(true, "msg");
174 // CHECK: NamespaceDecl{{.*}} TestStaticAssertDecl
175 // CHECK-NEXT: StaticAssertDecl{{.*> .*$}}
176 // CHECK-NEXT: CXXBoolLiteralExpr
177 // CHECK-NEXT: StringLiteral
179 namespace testFunctionTemplateDecl {
184 template<typename T> void TestFunctionTemplate(T) { }
186 // implicit instantiation
187 void bar(A a) { TestFunctionTemplate(a); }
189 // explicit specialization
190 template<> void TestFunctionTemplate(B);
192 // explicit instantiation declaration
193 extern template void TestFunctionTemplate(C);
195 // explicit instantiation definition
196 template void TestFunctionTemplate(D);
198 // CHECK: FunctionTemplateDecl{{.*}} TestFunctionTemplate
199 // CHECK-NEXT: TemplateTypeParmDecl
200 // CHECK-NEXT: FunctionDecl{{.*}} TestFunctionTemplate 'void (T)'
201 // CHECK-NEXT: ParmVarDecl{{.*}} 'T'
202 // CHECK-NEXT: CompoundStmt
203 // CHECK-NEXT: FunctionDecl{{.*}} TestFunctionTemplate {{.*}}A
204 // CHECK-NEXT: TemplateArgument
205 // CHECK-NEXT: ParmVarDecl
206 // CHECK-NEXT: CompoundStmt
207 // CHECK-NEXT: Function{{.*}} 'TestFunctionTemplate' {{.*}}B
208 // CHECK-NEXT: FunctionDecl{{.*}} TestFunctionTemplate {{.*}}C
209 // CHECK-NEXT: TemplateArgument
210 // CHECK-NEXT: ParmVarDecl
211 // CHECK-NEXT: FunctionDecl{{.*}} TestFunctionTemplate {{.*}}D
212 // CHECK-NEXT: TemplateArgument
213 // CHECK-NEXT: ParmVarDecl
214 // CHECK-NEXT: CompoundStmt
215 // CHECK: FunctionDecl{{.*}} TestFunctionTemplate {{.*}}B
216 // CHECK-NEXT: TemplateArgument
217 // CHECK-NEXT: ParmVarDecl
219 namespace testClassTemplateDecl {
225 template<typename T> class TestClassTemplate {
228 ~TestClassTemplate();
233 // implicit instantiation
234 TestClassTemplate<A> a;
236 // explicit specialization
237 template<> class TestClassTemplate<B> {
241 // explicit instantiation declaration
242 extern template class TestClassTemplate<C>;
244 // explicit instantiation definition
245 template class TestClassTemplate<D>;
247 // partial explicit specialization
248 template<typename T1, typename T2> class TestClassTemplatePartial {
251 template<typename T1> class TestClassTemplatePartial<T1, A> {
255 // CHECK: ClassTemplateDecl{{.*}} TestClassTemplate
256 // CHECK-NEXT: TemplateTypeParmDecl
257 // CHECK-NEXT: CXXRecordDecl{{.*}} class TestClassTemplate
258 // CHECK-NEXT: CXXRecordDecl{{.*}} class TestClassTemplate
259 // CHECK-NEXT: AccessSpecDecl{{.*}} public
260 // CHECK-NEXT: CXXConstructorDecl{{.*}} <line:{{.*}}:5, col:23>
261 // CHECK-NEXT: CXXDestructorDecl{{.*}} <line:{{.*}}:5, col:24>
262 // CHECK-NEXT: CXXMethodDecl{{.*}} <line:{{.*}}:5, col:11>
263 // CHECK-NEXT: FieldDecl{{.*}} i
264 // CHECK-NEXT: ClassTemplateSpecializationDecl{{.*}} class TestClassTemplate
265 // CHECK-NEXT: TemplateArgument{{.*}}A
266 // CHECK-NEXT: CXXRecordDecl{{.*}} class TestClassTemplate
267 // CHECK-NEXT: AccessSpecDecl{{.*}} public
268 // CHECK-NEXT: CXXConstructorDecl{{.*}} <line:{{.*}}:5, col:23>
269 // CHECK-NEXT: CXXDestructorDecl{{.*}} <line:{{.*}}:5, col:24>
270 // CHECK-NEXT: CXXMethodDecl{{.*}} <line:{{.*}}:5, col:11>
271 // CHECK-NEXT: FieldDecl{{.*}} i
272 // CHECK: ClassTemplateSpecialization{{.*}} 'TestClassTemplate'
273 // CHECK-NEXT: ClassTemplateSpecialization{{.*}} 'TestClassTemplate'
274 // CHECK-NEXT: ClassTemplateSpecialization{{.*}} 'TestClassTemplate'
276 // CHECK: ClassTemplateSpecializationDecl{{.*}} class TestClassTemplate
277 // CHECK-NEXT: TemplateArgument{{.*}}B
278 // CHECK-NEXT: CXXRecordDecl{{.*}} class TestClassTemplate
279 // CHECK-NEXT: FieldDecl{{.*}} j
281 // CHECK: ClassTemplateSpecializationDecl{{.*}} class TestClassTemplate
282 // CHECK-NEXT: TemplateArgument{{.*}}C
283 // CHECK-NEXT: CXXRecordDecl{{.*}} class TestClassTemplate
284 // CHECK-NEXT: AccessSpecDecl{{.*}} public
285 // CHECK-NEXT: CXXConstructorDecl{{.*}} <line:{{.*}}:5, col:23>
286 // CHECK-NEXT: CXXDestructorDecl{{.*}} <line:{{.*}}:5, col:24>
287 // CHECK-NEXT: CXXMethodDecl{{.*}} <line:{{.*}}:5, col:11>
288 // CHECK-NEXT: FieldDecl{{.*}} i
290 // CHECK: ClassTemplateSpecializationDecl{{.*}} class TestClassTemplate
291 // CHECK-NEXT: TemplateArgument{{.*}}D
292 // CHECK-NEXT: CXXRecordDecl{{.*}} class TestClassTemplate
293 // CHECK-NEXT: AccessSpecDecl{{.*}} public
294 // CHECK-NEXT: CXXConstructorDecl{{.*}} <line:{{.*}}:5, col:23>
295 // CHECK-NEXT: CXXDestructorDecl{{.*}} <line:{{.*}}:5, col:24>
296 // CHECK-NEXT: CXXMethodDecl{{.*}} <line:{{.*}}:5, col:11>
297 // CHECK-NEXT: FieldDecl{{.*}} i
299 // CHECK: ClassTemplatePartialSpecializationDecl{{.*}} class TestClassTemplatePartial
300 // CHECK-NEXT: TemplateArgument
301 // CHECK-NEXT: TemplateArgument{{.*}}A
302 // CHECK-NEXT: TemplateTypeParmDecl
303 // CHECK-NEXT: CXXRecordDecl{{.*}} class TestClassTemplatePartial
304 // CHECK-NEXT: FieldDecl{{.*}} j
306 // PR15220 dump instantiation only once
307 namespace testCanonicalTemplate {
310 template<typename T> void TestFunctionTemplate(T);
311 template<typename T> void TestFunctionTemplate(T);
312 void bar(A a) { TestFunctionTemplate(a); }
313 // CHECK: FunctionTemplateDecl{{.*}} TestFunctionTemplate
314 // CHECK-NEXT: TemplateTypeParmDecl
315 // CHECK-NEXT: FunctionDecl{{.*}} TestFunctionTemplate 'void (T)'
316 // CHECK-NEXT: ParmVarDecl{{.*}} 'T'
317 // CHECK-NEXT: FunctionDecl{{.*}} TestFunctionTemplate {{.*}}A
318 // CHECK-NEXT: TemplateArgument
319 // CHECK-NEXT: ParmVarDecl
320 // CHECK: FunctionTemplateDecl{{.*}} TestFunctionTemplate
321 // CHECK-NEXT: TemplateTypeParmDecl
322 // CHECK-NEXT: FunctionDecl{{.*}} TestFunctionTemplate 'void (T)'
323 // CHECK-NEXT: ParmVarDecl{{.*}} 'T'
324 // CHECK-NEXT: Function{{.*}} 'TestFunctionTemplate'
325 // CHECK-NOT: TemplateArgument
327 template<typename T1> class TestClassTemplate {
328 template<typename T2> friend class TestClassTemplate;
330 TestClassTemplate<A> a;
331 // CHECK: ClassTemplateDecl{{.*}} TestClassTemplate
332 // CHECK-NEXT: TemplateTypeParmDecl
333 // CHECK-NEXT: CXXRecordDecl{{.*}} class TestClassTemplate
334 // CHECK-NEXT: CXXRecordDecl{{.*}} class TestClassTemplate
335 // CHECK-NEXT: FriendDecl
336 // CHECK-NEXT: ClassTemplateDecl{{.*}} TestClassTemplate
337 // CHECK-NEXT: TemplateTypeParmDecl
338 // CHECK-NEXT: CXXRecordDecl{{.*}} class TestClassTemplate
339 // CHECK-NEXT: ClassTemplateSpecialization{{.*}} 'TestClassTemplate'
340 // CHECK-NEXT: ClassTemplateSpecializationDecl{{.*}} class TestClassTemplate
341 // CHECK-NEXT: TemplateArgument{{.*}}A
342 // CHECK-NEXT: CXXRecordDecl{{.*}} class TestClassTemplate
346 class TestClassScopeFunctionSpecialization {
347 template<class U> void foo(U a) { }
348 template<> void foo<int>(int a) { }
350 // CHECK: ClassScopeFunctionSpecializationDecl
351 // CHECK-NEXT: CXXMethod{{.*}} 'foo' 'void (int)'
352 // CHECK-NEXT: TemplateArgument{{.*}} 'int'
354 namespace TestTemplateTypeParmDecl {
355 template<typename ... T, class U = int> void foo();
357 // CHECK: NamespaceDecl{{.*}} TestTemplateTypeParmDecl
358 // CHECK-NEXT: FunctionTemplateDecl
359 // CHECK-NEXT: TemplateTypeParmDecl{{.*}} typename ... T
360 // CHECK-NEXT: TemplateTypeParmDecl{{.*}} class U
361 // CHECK-NEXT: TemplateArgument type 'int'
363 namespace TestNonTypeTemplateParmDecl {
364 template<int I = 1, int ... J> void foo();
366 // CHECK: NamespaceDecl{{.*}} TestNonTypeTemplateParmDecl
367 // CHECK-NEXT: FunctionTemplateDecl
368 // CHECK-NEXT: NonTypeTemplateParmDecl{{.*}} 'int' I
369 // CHECK-NEXT: TemplateArgument expr
370 // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 1
371 // CHECK-NEXT: NonTypeTemplateParmDecl{{.*}} 'int' ... J
373 namespace TestTemplateTemplateParmDecl {
374 template<typename T> class A;
375 template <template <typename> class T = A, template <typename> class ... U> void foo();
377 // CHECK: NamespaceDecl{{.*}} TestTemplateTemplateParmDecl
378 // CHECK: FunctionTemplateDecl
379 // CHECK-NEXT: TemplateTemplateParmDecl{{.*}} T
380 // CHECK-NEXT: TemplateTypeParmDecl{{.*}} typename
381 // CHECK-NEXT: TemplateArgument{{.*}} template A
382 // CHECK-NEXT: TemplateTemplateParmDecl{{.*}} ... U
383 // CHECK-NEXT: TemplateTypeParmDecl{{.*}} typename
385 namespace TestTemplateArgument {
386 template<typename> class A { };
387 template<template<typename> class ...> class B { };
390 template<typename> class testType { };
391 template class testType<int>;
392 // CHECK: ClassTemplateSpecializationDecl{{.*}} class testType
393 // CHECK-NEXT: TemplateArgument{{.*}} type 'int'
395 template<int fp(void)> class testDecl { };
396 template class testDecl<foo>;
397 // CHECK: ClassTemplateSpecializationDecl{{.*}} class testDecl
398 // CHECK-NEXT: TemplateArgument{{.*}} decl
399 // CHECK-NEXT: Function{{.*}}foo
401 template class testDecl<nullptr>;
402 // CHECK: ClassTemplateSpecializationDecl{{.*}} class testDecl
403 // CHECK-NEXT: TemplateArgument{{.*}} nullptr
405 template<int> class testIntegral { };
406 template class testIntegral<1>;
407 // CHECK: ClassTemplateSpecializationDecl{{.*}} class testIntegral
408 // CHECK-NEXT: TemplateArgument{{.*}} integral 1
410 template<template<typename> class> class testTemplate { };
411 template class testTemplate<A>;
412 // CHECK: ClassTemplateSpecializationDecl{{.*}} class testTemplate
413 // CHECK-NEXT: TemplateArgument{{.*}} A
415 template<template<typename> class ...T> class C {
416 B<T...> testTemplateExpansion;
418 // FIXME: Need TemplateSpecializationType dumping to test TemplateExpansion.
420 template<int, int = 0> class testExpr;
421 template<int I> class testExpr<I> { };
422 // CHECK: ClassTemplatePartialSpecializationDecl{{.*}} class testExpr
423 // CHECK-NEXT: TemplateArgument{{.*}} expr
424 // CHECK-NEXT: DeclRefExpr{{.*}}I
426 template<int, int ...> class testPack { };
427 template class testPack<0, 1, 2>;
428 // CHECK: ClassTemplateSpecializationDecl{{.*}} class testPack
429 // CHECK-NEXT: TemplateArgument{{.*}} integral 0
430 // CHECK-NEXT: TemplateArgument{{.*}} pack
431 // CHECK-NEXT: TemplateArgument{{.*}} integral 1
432 // CHECK-NEXT: TemplateArgument{{.*}} integral 2
435 namespace testUsingDecl {
438 namespace TestUsingDecl {
439 using testUsingDecl::i;
441 // CHECK: NamespaceDecl{{.*}} TestUsingDecl
442 // CHECK-NEXT: UsingDecl{{.*}} testUsingDecl::i
443 // CHECK-NEXT: UsingShadowDecl{{.*}} Var{{.*}} 'i' 'int'
445 namespace testUnresolvedUsing {
447 template<class T> class B {
451 template<class T> class TestUnresolvedUsing : public B<T> {
452 using typename B<T>::a;
456 // CHECK: CXXRecordDecl{{.*}} TestUnresolvedUsing
457 // CHECK: UnresolvedUsingTypenameDecl{{.*}} B<T>::a
458 // CHECK: UnresolvedUsingValueDecl{{.*}} B<T>::a
460 namespace TestLinkageSpecDecl {
461 extern "C" void test1();
462 extern "C++" void test2();
464 // CHECK: NamespaceDecl{{.*}} TestLinkageSpecDecl
465 // CHECK-NEXT: LinkageSpecDecl{{.*}} C
466 // CHECK-NEXT: FunctionDecl
467 // CHECK-NEXT: LinkageSpecDecl{{.*}} C++
468 // CHECK-NEXT: FunctionDecl
470 class TestAccessSpecDecl {
475 // CHECK: CXXRecordDecl{{.*}} class TestAccessSpecDecl
476 // CHECK-NEXT: CXXRecordDecl{{.*}} class TestAccessSpecDecl
477 // CHECK-NEXT: AccessSpecDecl{{.*}} public
478 // CHECK-NEXT: AccessSpecDecl{{.*}} private
479 // CHECK-NEXT: AccessSpecDecl{{.*}} protected
481 template<typename T> class TestFriendDecl {
486 // CHECK: CXXRecord{{.*}} TestFriendDecl
487 // CHECK-NEXT: CXXRecord{{.*}} TestFriendDecl
488 // CHECK-NEXT: FriendDecl
489 // CHECK-NEXT: FunctionDecl{{.*}} foo
490 // CHECK-NEXT: FriendDecl{{.*}} 'class A':'class A'
491 // CHECK-NEXT: FriendDecl{{.*}} 'T'
493 namespace TestFileScopeAsmDecl {
496 // CHECK: NamespaceDecl{{.*}} TestFileScopeAsmDecl{{$}}
497 // CHECK: FileScopeAsmDecl{{.*> .*$}}
498 // CHECK-NEXT: StringLiteral
500 namespace TestFriendDecl2 {
506 // CHECK: NamespaceDecl [[TestFriendDecl2:0x.*]] <{{.*}}> {{.*}} TestFriendDecl2
507 // CHECK: |-FunctionDecl [[TestFriendDecl2_f:0x.*]] <{{.*}}> {{.*}} f 'void (void)'
508 // CHECK: `-CXXRecordDecl {{.*}} struct S
509 // CHECK: |-CXXRecordDecl {{.*}} struct S
510 // CHECK: `-FriendDecl
511 // CHECK: `-FunctionDecl {{.*}} parent [[TestFriendDecl2]] prev [[TestFriendDecl2_f]] <{{.*}}> {{.*}} f 'void (void)'
520 // CHECK: VarDecl {{.*}} Test 'int' extern
521 // CHECK-NOT: FullComment
522 // CHECK: VarDecl {{.*}} Test 'int' extern
523 // CHECK: `-FullComment
524 // CHECK: `-ParagraphComment
525 // CHECK: `-TextComment
526 // CHECK: VarDecl {{.*}} Test 'int' extern
527 // CHECK-NOT: FullComment