// Test without serialization: // RUN: %clang_cc1 -std=c++11 -triple x86_64-linux-gnu -fms-extensions \ // RUN: -ast-dump -ast-dump-filter Test %s \ // RUN: | FileCheck --strict-whitespace %s // // Test with serialization: FIXME: Find why the outputs differs and fix it! // : %clang_cc1 -std=c++11 -triple x86_64-linux-gnu -fms-extensions -emit-pch -o %t %s // : %clang_cc1 -x c++ -std=c++11 -triple x86_64-linux-gnu -fms-extensions -include-pch %t \ // : -ast-dump-all -ast-dump-filter Test /dev/null \ // : | sed -e "s/ //" -e "s/ imported//" \ // : | FileCheck --strict-whitespace %s class testEnumDecl { enum class TestEnumDeclScoped; enum TestEnumDeclFixed : int; }; // CHECK: EnumDecl{{.*}} class TestEnumDeclScoped 'int' // CHECK-NOT: instantiated_from // CHECK: EnumDecl{{.*}} TestEnumDeclFixed 'int' // CHECK-NOT: instantiated_from class testFieldDecl { int TestFieldDeclInit = 0; }; // CHECK: FieldDecl{{.*}} TestFieldDeclInit 'int' // CHECK-NEXT: IntegerLiteral namespace testVarDeclNRVO { class A { }; A TestFuncNRVO() { A TestVarDeclNRVO; return TestVarDeclNRVO; } } // CHECK: FunctionDecl{{.*}} TestFuncNRVO 'A ()' // CHECK-NEXT: `-CompoundStmt // CHECK-NEXT: |-DeclStmt // CHECK-NEXT: | `-VarDecl{{.*}} TestVarDeclNRVO 'A':'testVarDeclNRVO::A' nrvo callinit // CHECK-NEXT: | `-CXXConstructExpr // CHECK-NEXT: `-ReturnStmt{{.*}} nrvo_candidate(Var {{.*}} 'TestVarDeclNRVO' 'A':'testVarDeclNRVO::A') void testParmVarDeclInit(int TestParmVarDeclInit = 0); // CHECK: ParmVarDecl{{.*}} TestParmVarDeclInit 'int' // CHECK-NEXT: IntegerLiteral{{.*}} namespace TestNamespaceDecl { int i; } // CHECK: NamespaceDecl{{.*}} TestNamespaceDecl // CHECK-NEXT: VarDecl namespace TestNamespaceDecl { int j; } // CHECK: NamespaceDecl{{.*}} TestNamespaceDecl // CHECK-NEXT: original Namespace // CHECK-NEXT: VarDecl inline namespace TestNamespaceDeclInline { } // CHECK: NamespaceDecl{{.*}} TestNamespaceDeclInline inline namespace TestNestedNameSpace::Nested { } // CHECK: NamespaceDecl{{.*}} TestNestedNameSpace // CHECK: NamespaceDecl{{.*}} Nested nested{{\s*$}} namespace TestMultipleNested::SecondLevelNested::Nested { } // CHECK: NamespaceDecl{{.*}} TestMultipleNested // CHECK: NamespaceDecl{{.*}} SecondLevelNested nested // CHECK: NamespaceDecl{{.*}} Nested nested{{\s*$}} namespace TestInlineNested::inline SecondLevel::inline Nested { } // CHECK: NamespaceDecl{{.*}} TestInlineNested // CHECK: NamespaceDecl{{.*}} SecondLevel inline nested // CHECK: NamespaceDecl{{.*}} Nested inline nested{{\s*$}} namespace testUsingDirectiveDecl { namespace A { } } namespace TestUsingDirectiveDecl { using namespace testUsingDirectiveDecl::A; } // CHECK: NamespaceDecl{{.*}} TestUsingDirectiveDecl // CHECK-NEXT: UsingDirectiveDecl{{.*}} Namespace{{.*}} 'A' namespace testNamespaceAlias { namespace A { } } namespace TestNamespaceAlias = testNamespaceAlias::A; // CHECK: NamespaceAliasDecl{{.*}} TestNamespaceAlias // CHECK-NEXT: Namespace{{.*}} 'A' using TestTypeAliasDecl = int; // CHECK: TypeAliasDecl{{.*}} TestTypeAliasDecl 'int' namespace testTypeAliasTemplateDecl { template class A; template using TestTypeAliasTemplateDecl = A; } // CHECK: TypeAliasTemplateDecl{{.*}} TestTypeAliasTemplateDecl // CHECK-NEXT: TemplateTypeParmDecl // CHECK-NEXT: TypeAliasDecl{{.*}} TestTypeAliasTemplateDecl 'A' namespace testCXXRecordDecl { class TestEmpty {}; // CHECK: CXXRecordDecl{{.*}} class TestEmpty // 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 // CHECK-NEXT: DefaultConstructor exists trivial constexpr // CHECK-NEXT: CopyConstructor simple trivial has_const_param // CHECK-NEXT: MoveConstructor exists simple trivial // CHECK-NEXT: CopyAssignment simple trivial has_const_param // CHECK-NEXT: MoveAssignment exists simple trivial // CHECK-NEXT: Destructor simple irrelevant trivial class A { }; class B { }; class TestCXXRecordDecl : virtual A, public B { int i; }; } // CHECK: CXXRecordDecl{{.*}} class TestCXXRecordDecl // CHECK-NEXT: DefinitionData{{$}} // CHECK-NEXT: DefaultConstructor exists non_trivial // CHECK-NEXT: CopyConstructor simple non_trivial has_const_param // CHECK-NEXT: MoveConstructor exists simple non_trivial // CHECK-NEXT: CopyAssignment simple non_trivial has_const_param // CHECK-NEXT: MoveAssignment exists simple non_trivial // CHECK-NEXT: Destructor simple irrelevant trivial // CHECK-NEXT: virtual private 'A':'testCXXRecordDecl::A' // CHECK-NEXT: public 'B':'testCXXRecordDecl::B' // CHECK-NEXT: CXXRecordDecl{{.*}} class TestCXXRecordDecl // CHECK-NEXT: FieldDecl template class TestCXXRecordDeclPack : public T... { }; // CHECK: CXXRecordDecl{{.*}} class TestCXXRecordDeclPack // CHECK: public 'T'... // CHECK-NEXT: CXXRecordDecl{{.*}} class TestCXXRecordDeclPack thread_local int TestThreadLocalInt; // CHECK: TestThreadLocalInt {{.*}} tls_dynamic class testCXXMethodDecl { virtual void TestCXXMethodDeclPure() = 0; void TestCXXMethodDeclDelete() = delete; void TestCXXMethodDeclThrow() throw(); void TestCXXMethodDeclThrowType() throw(int); }; // CHECK: CXXMethodDecl{{.*}} TestCXXMethodDeclPure 'void ()' virtual pure // CHECK: CXXMethodDecl{{.*}} TestCXXMethodDeclDelete 'void ()' delete // CHECK: CXXMethodDecl{{.*}} TestCXXMethodDeclThrow 'void () throw()' // CHECK: CXXMethodDecl{{.*}} TestCXXMethodDeclThrowType 'void () throw(int)' namespace testCXXConstructorDecl { class A { }; class TestCXXConstructorDecl : public A { int I; TestCXXConstructorDecl(A &a, int i) : A(a), I(i) { } TestCXXConstructorDecl(A &a) : TestCXXConstructorDecl(a, 0) { } }; } // CHECK: CXXConstructorDecl{{.*}} TestCXXConstructorDecl 'void {{.*}}' // CHECK-NEXT: ParmVarDecl{{.*}} a // CHECK-NEXT: ParmVarDecl{{.*}} i // CHECK-NEXT: CXXCtorInitializer{{.*}}A // CHECK-NEXT: Expr // CHECK: CXXCtorInitializer{{.*}}I // CHECK-NEXT: Expr // CHECK: CompoundStmt // CHECK: CXXConstructorDecl{{.*}} TestCXXConstructorDecl 'void {{.*}}' // CHECK-NEXT: ParmVarDecl{{.*}} a // CHECK-NEXT: CXXCtorInitializer{{.*}}TestCXXConstructorDecl // CHECK-NEXT: CXXConstructExpr{{.*}}TestCXXConstructorDecl class TestCXXDestructorDecl { ~TestCXXDestructorDecl() { } }; // CHECK: CXXDestructorDecl{{.*}} ~TestCXXDestructorDecl 'void () noexcept' // CHECK-NEXT: CompoundStmt // Test that the range of a defaulted members is computed correctly. class TestMemberRanges { public: TestMemberRanges() = default; TestMemberRanges(const TestMemberRanges &Other) = default; TestMemberRanges(TestMemberRanges &&Other) = default; ~TestMemberRanges() = default; TestMemberRanges &operator=(const TestMemberRanges &Other) = default; TestMemberRanges &operator=(TestMemberRanges &&Other) = default; }; void SomeFunction() { TestMemberRanges A; TestMemberRanges B(A); B = A; A = static_cast(B); TestMemberRanges C(static_cast(A)); } // CHECK: CXXConstructorDecl{{.*}} // CHECK: CXXConstructorDecl{{.*}} // CHECK: CXXConstructorDecl{{.*}} // CHECK: CXXDestructorDecl{{.*}} // CHECK: CXXMethodDecl{{.*}} // CHECK: CXXMethodDecl{{.*}} class TestCXXConversionDecl { operator int() { return 0; } }; // CHECK: CXXConversionDecl{{.*}} operator int 'int ()' // CHECK-NEXT: CompoundStmt namespace TestStaticAssertDecl { static_assert(true, "msg"); } // CHECK: NamespaceDecl{{.*}} TestStaticAssertDecl // CHECK-NEXT: StaticAssertDecl{{.*> .*$}} // CHECK-NEXT: CXXBoolLiteralExpr // CHECK-NEXT: StringLiteral namespace testFunctionTemplateDecl { class A { }; class B { }; class C { }; class D { }; template void TestFunctionTemplate(T) { } // implicit instantiation void bar(A a) { TestFunctionTemplate(a); } // explicit specialization template<> void TestFunctionTemplate(B); // explicit instantiation declaration extern template void TestFunctionTemplate(C); // explicit instantiation definition template void TestFunctionTemplate(D); } // CHECK: FunctionTemplateDecl 0x{{.+}} <{{.+}}:[[@LINE-14]]:3, col:55> col:29 TestFunctionTemplate // CHECK-NEXT: |-TemplateTypeParmDecl 0x{{.+}} col:21 referenced typename depth 0 index 0 T // CHECK-NEXT: |-FunctionDecl 0x{{.+}} col:29 TestFunctionTemplate 'void (T)' // CHECK-NEXT: | |-ParmVarDecl 0x{{.+}} col:51 'T' // CHECK-NEXT: | `-CompoundStmt 0x{{.+}} // CHECK-NEXT: |-FunctionDecl 0x{{.+}} col:29 used TestFunctionTemplate 'void (testFunctionTemplateDecl::A)' // CHECK-NEXT: | |-TemplateArgument type 'testFunctionTemplateDecl::A' // CHECK-NEXT: | | `-RecordType 0{{.+}} 'testFunctionTemplateDecl::A' // CHECK-NEXT: | | `-CXXRecord 0x{{.+}} 'A' // CHECK-NEXT: | |-ParmVarDecl 0x{{.+}} col:51 'testFunctionTemplateDecl::A' // CHECK-NEXT: | `-CompoundStmt 0x{{.+}} // CHECK-NEXT: |-Function 0x{{.+}} 'TestFunctionTemplate' 'void (B)' // CHECK-NEXT: |-FunctionDecl 0x{{.+}} col:29 TestFunctionTemplate 'void (testFunctionTemplateDecl::C)' // CHECK-NEXT: | |-TemplateArgument type 'testFunctionTemplateDecl::C' // CHECK-NEXT: | | `-RecordType 0{{.+}} 'testFunctionTemplateDecl::C' // CHECK-NEXT: | | `-CXXRecord 0x{{.+}} 'C' // CHECK-NEXT: | `-ParmVarDecl 0x{{.+}} col:51 'testFunctionTemplateDecl::C' // CHECK-NEXT: `-FunctionDecl 0x{{.+}} col:29 TestFunctionTemplate 'void (testFunctionTemplateDecl::D)' // CHECK-NEXT: |-TemplateArgument type 'testFunctionTemplateDecl::D' // CHECK-NEXT: | `-RecordType 0{{.+}} 'testFunctionTemplateDecl::D' // CHECK-NEXT: | `-CXXRecord 0x{{.+}} 'D' // CHECK-NEXT: |-ParmVarDecl 0x{{.+}} col:51 'testFunctionTemplateDecl::D' // CHECK-NEXT: `-CompoundStmt 0x{{.+}} // CHECK: FunctionDecl 0x{{.+}} prev 0x{{.+}} <{{.+}}:[[@LINE-32]]:3, col:41> col:19 TestFunctionTemplate 'void (B)' // CHECK-NEXT: |-TemplateArgument type 'testFunctionTemplateDecl::B' // CHECK-NEXT: | `-RecordType 0{{.+}} 'testFunctionTemplateDecl::B' // CHECK-NEXT: | `-CXXRecord 0x{{.+}} 'B' // CHECK-NEXT: `-ParmVarDecl 0x{{.+}} col:41 'B':'testFunctionTemplateDecl::B' namespace testClassTemplateDecl { class A { }; class B { }; class C { }; class D { }; template class TestClassTemplate { public: TestClassTemplate(); ~TestClassTemplate(); int j(); int i; }; // implicit instantiation TestClassTemplate a; // explicit specialization template<> class TestClassTemplate { int j; }; // explicit instantiation declaration extern template class TestClassTemplate; // explicit instantiation definition template class TestClassTemplate; // partial explicit specialization template class TestClassTemplatePartial { int i; }; template class TestClassTemplatePartial { int j; }; template struct TestTemplateDefaultType; template struct TestTemplateDefaultType { }; template struct TestTemplateDefaultNonType; template struct TestTemplateDefaultNonType { }; template class TT = TestClassTemplate> struct TestTemplateTemplateDefaultType; template class TT> struct TestTemplateTemplateDefaultType { }; } // CHECK: ClassTemplateDecl 0x{{.+}} <{{.+}}:[[@LINE-40]]:3, line:[[@LINE-34]]:3> line:[[@LINE-40]]:30 TestClassTemplate{{$}} // CHECK-NEXT: |-TemplateTypeParmDecl 0x{{.+}} col:21 typename depth 0 index 0 T{{$}} // CHECK-NEXT: |-CXXRecordDecl 0x{{.+}} line:[[@LINE-42]]:30 class TestClassTemplate definition{{$}} // CHECK-NEXT: | |-DefinitionData standard_layout has_user_declared_ctor can_const_default_init{{$}} // CHECK-NEXT: | | |-DefaultConstructor exists non_trivial user_provided{{$}} // CHECK-NEXT: | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param{{$}} // CHECK-NEXT: | | |-MoveConstructor{{$}} // CHECK-NEXT: | | |-CopyAssignment simple trivial has_const_param needs_implicit implicit_has_const_param{{$}} // CHECK-NEXT: | | |-MoveAssignment{{$}} // CHECK-NEXT: | | `-Destructor irrelevant non_trivial user_declared{{$}} // CHECK-NEXT: | |-CXXRecordDecl 0x{{.+}} col:30 implicit referenced class TestClassTemplate{{$}} // CHECK-NEXT: | |-AccessSpecDecl 0x{{.+}} col:3 public{{$}} // CHECK-NEXT: | |-CXXConstructorDecl 0x[[#%x,TEMPLATE_CONSTRUCTOR_DECL:]] col:5 TestClassTemplate 'void ()'{{$}} // CHECK-NEXT: | |-CXXDestructorDecl 0x[[#%x,TEMPLATE_DESTRUCTOR_DECL:]] col:5 ~TestClassTemplate 'void ()' not_selected{{$}} // CHECK-NEXT: | |-CXXMethodDecl 0x[[#%x,TEMPLATE_METHOD_DECL:]] col:9 j 'int ()'{{$}} // CHECK-NEXT: | `-FieldDecl 0x{{.+}} col:9 i 'int'{{$}} // CHECK-NEXT: |-ClassTemplateSpecializationDecl 0x{{.+}} line:[[@LINE-56]]:30 class TestClassTemplate definition implicit_instantiation{{$}} // CHECK-NEXT: | |-DefinitionData standard_layout has_user_declared_ctor can_const_default_init{{$}} // CHECK-NEXT: | | |-DefaultConstructor exists non_trivial user_provided{{$}} // CHECK-NEXT: | | |-CopyConstructor simple trivial has_const_param implicit_has_const_param{{$}} // CHECK-NEXT: | | |-MoveConstructor{{$}} // CHECK-NEXT: | | |-CopyAssignment simple trivial has_const_param needs_implicit implicit_has_const_param{{$}} // CHECK-NEXT: | | |-MoveAssignment{{$}} // CHECK-NEXT: | | `-Destructor non_trivial user_declared{{$}} // CHECK-NEXT: | |-TemplateArgument type 'testClassTemplateDecl::A'{{$}} // CHECK-NEXT: | | `-RecordType 0{{.+}} 'testClassTemplateDecl::A'{{$}} // CHECK-NEXT: | | `-CXXRecord 0x{{.+}} 'A'{{$}} // CHECK-NEXT: | |-CXXRecordDecl 0x{{.+}} col:30 implicit class TestClassTemplate{{$}} // CHECK-NEXT: | |-AccessSpecDecl 0x{{.+}} col:3 public{{$}} // CHECK-NEXT: | |-CXXConstructorDecl 0x{{.+}} col:5 used TestClassTemplate 'void ()' implicit_instantiation instantiated_from 0x[[#TEMPLATE_CONSTRUCTOR_DECL]]{{$}} // CHECK-NEXT: | |-CXXDestructorDecl 0x{{.+}} col:5 used ~TestClassTemplate 'void () noexcept' implicit_instantiation instantiated_from 0x[[#TEMPLATE_DESTRUCTOR_DECL]]{{$}} // CHECK-NEXT: | |-CXXMethodDecl 0x{{.+}} col:9 j 'int ()' implicit_instantiation instantiated_from 0x[[#TEMPLATE_METHOD_DECL]]{{$}} // CHECK-NEXT: | |-FieldDecl 0x{{.+}} col:9 i 'int'{{$}} // CHECK-NEXT: | `-CXXConstructorDecl 0x{{.+}} col:30 implicit constexpr TestClassTemplate 'void (const TestClassTemplate &)' inline default trivial noexcept-unevaluated 0x{{.+}}{{$}} // CHECK-NEXT: | `-ParmVarDecl 0x{{.+}} col:30 'const TestClassTemplate &'{{$}} // CHECK-NEXT: |-ClassTemplateSpecialization 0x{{.+}} 'TestClassTemplate'{{$}} // CHECK-NEXT: |-ClassTemplateSpecialization 0x{{.+}} 'TestClassTemplate'{{$}} // CHECK-NEXT: `-ClassTemplateSpecialization 0x{{.+}} 'TestClassTemplate'{{$}} // CHECK: ClassTemplateSpecializationDecl 0x{{.+}} <{{.+}}:[[@LINE-67]]:3, line:[[@LINE-65]]:3> line:[[@LINE-67]]:20 class TestClassTemplate definition explicit_specialization{{$}} // CHECK-NEXT: |-DefinitionData pass_in_registers standard_layout trivially_copyable trivial literal{{$}} // CHECK-NEXT: | |-DefaultConstructor exists trivial needs_implicit{{$}} // CHECK-NEXT: | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param{{$}} // CHECK-NEXT: | |-MoveConstructor exists simple trivial needs_implicit{{$}} // CHECK-NEXT: | |-CopyAssignment simple trivial has_const_param needs_implicit implicit_has_const_param{{$}} // CHECK-NEXT: | |-MoveAssignment exists simple trivial needs_implicit{{$}} // CHECK-NEXT: | `-Destructor simple irrelevant trivial needs_implicit{{$}} // CHECK-NEXT: |-TemplateArgument type 'testClassTemplateDecl::B'{{$}} // CHECK-NEXT: | `-RecordType 0{{.+}} 'testClassTemplateDecl::B'{{$}} // CHECK-NEXT: | `-CXXRecord 0x{{.+}} 'B'{{$}} // CHECK-NEXT: |-CXXRecordDecl 0x{{.+}} col:20 implicit class TestClassTemplate{{$}} // CHECK-NEXT: `-FieldDecl 0x{{.+}} col:9 j 'int'{{$}} // CHECK: ClassTemplateSpecializationDecl 0x{{.+}} <{{.+}}:{{.*}}:3, col:44> col:25 class TestClassTemplate definition explicit_instantiation_declaration{{$}} // CHECK-NEXT: |-DefinitionData standard_layout has_user_declared_ctor can_const_default_init{{$}} // CHECK-NEXT: | |-DefaultConstructor exists non_trivial user_provided{{$}} // CHECK-NEXT: | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param{{$}} // CHECK-NEXT: | |-MoveConstructor{{$}} // CHECK-NEXT: | |-CopyAssignment simple trivial has_const_param needs_implicit implicit_has_const_param{{$}} // CHECK-NEXT: | |-MoveAssignment{{$}} // CHECK-NEXT: | `-Destructor non_trivial user_declared{{$}} // CHECK-NEXT: |-TemplateArgument type 'testClassTemplateDecl::C'{{$}} // CHECK-NEXT: | `-RecordType 0{{.+}} 'testClassTemplateDecl::C'{{$}} // CHECK-NEXT: | `-CXXRecord 0x{{.+}} 'C'{{$}} // CHECK-NEXT: |-CXXRecordDecl 0x{{.+}} col:30 implicit class TestClassTemplate{{$}} // CHECK-NEXT: |-AccessSpecDecl 0x{{.+}} col:3 public{{$}} // CHECK-NEXT: |-CXXConstructorDecl 0x{{.+}} col:5 TestClassTemplate 'void ()' explicit_instantiation_declaration instantiated_from {{0x[^ ]+}}{{$}} // CHECK-NEXT: |-CXXDestructorDecl 0x{{.+}} col:5 ~TestClassTemplate 'void ()' explicit_instantiation_declaration noexcept-unevaluated 0x{{[^ ]+}} instantiated_from {{0x[^ ]+}} // CHECK-NEXT: |-CXXMethodDecl 0x{{.+}} col:9 j 'int ()' explicit_instantiation_declaration instantiated_from {{0x[^ ]+}}{{$}} // CHECK-NEXT: `-FieldDecl 0x{{.+}} col:9 i 'int'{{$}} // CHECK: ClassTemplateSpecializationDecl 0x{{.+}} <{{.+}}:[[@LINE-91]]:3, col:37> col:18 class TestClassTemplate definition explicit_instantiation_definition{{$}} // CHECK-NEXT: |-DefinitionData standard_layout has_user_declared_ctor can_const_default_init{{$}} // CHECK-NEXT: | |-DefaultConstructor exists non_trivial user_provided{{$}} // CHECK-NEXT: | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param{{$}} // CHECK-NEXT: | |-MoveConstructor{{$}} // CHECK-NEXT: | |-CopyAssignment simple trivial has_const_param needs_implicit implicit_has_const_param{{$}} // CHECK-NEXT: | |-MoveAssignment{{$}} // CHECK-NEXT: | `-Destructor non_trivial user_declared{{$}} // CHECK-NEXT: |-TemplateArgument type 'testClassTemplateDecl::D'{{$}} // CHECK-NEXT: | `-RecordType 0{{.+}} 'testClassTemplateDecl::D'{{$}} // CHECK-NEXT: | `-CXXRecord 0x{{.+}} 'D'{{$}} // CHECK-NEXT: |-CXXRecordDecl 0x{{.+}} col:30 implicit class TestClassTemplate{{$}} // CHECK-NEXT: |-AccessSpecDecl 0x{{.+}} col:3 public{{$}} // CHECK-NEXT: |-CXXConstructorDecl 0x{{.+}} col:5 TestClassTemplate 'void ()' implicit_instantiation instantiated_from {{0x[^ ]+}}{{$}} // CHECK-NEXT: |-CXXDestructorDecl 0x{{.+}} col:5 ~TestClassTemplate 'void ()' implicit_instantiation noexcept-unevaluated 0x{{.+}} instantiated_from {{0x[^ ]+}}{{$}} // CHECK-NEXT: |-CXXMethodDecl 0x{{.+}} col:9 j 'int ()' implicit_instantiation instantiated_from {{0x[^ ]+}}{{$}} // CHECK-NEXT: `-FieldDecl 0x{{.+}} col:9 i 'int'{{$}} // CHECK: ClassTemplateDecl 0x{{.+}} <{{.+}}:[[@LINE-106]]:3, line:[[@LINE-104]]:3> line:[[@LINE-106]]:44 TestClassTemplatePartial{{$}} // CHECK-NEXT: |-TemplateTypeParmDecl 0x{{.+}} col:21 typename depth 0 index 0 T1{{$}} // CHECK-NEXT: |-TemplateTypeParmDecl 0x{{.+}} col:34 typename depth 0 index 1 T2{{$}} // CHECK-NEXT: `-CXXRecordDecl 0x{{.+}} line:[[@LINE-109]]:44 class TestClassTemplatePartial definition{{$}} // CHECK-NEXT: |-DefinitionData standard_layout trivially_copyable trivial literal{{$}} // CHECK-NEXT: | |-DefaultConstructor exists trivial needs_implicit{{$}} // CHECK-NEXT: | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param{{$}} // CHECK-NEXT: | |-MoveConstructor exists simple trivial needs_implicit{{$}} // CHECK-NEXT: | |-CopyAssignment simple trivial has_const_param needs_implicit implicit_has_const_param{{$}} // CHECK-NEXT: | |-MoveAssignment exists simple trivial needs_implicit{{$}} // CHECK-NEXT: | `-Destructor simple irrelevant trivial needs_implicit{{$}} // CHECK-NEXT: |-CXXRecordDecl 0x{{.+}} col:44 implicit class TestClassTemplatePartial{{$}} // CHECK-NEXT: `-FieldDecl 0x{{.+}} col:9 i 'int'{{$}} // CHECK: ClassTemplatePartialSpecializationDecl 0x{{.+}} <{{.+}}:[[@LINE-117]]:3, line:[[@LINE-115]]:3> line:[[@LINE-117]]:31 class TestClassTemplatePartial definition explicit_specialization{{$}} // CHECK-NEXT: |-DefinitionData standard_layout trivially_copyable trivial literal{{$}} // CHECK-NEXT: | |-DefaultConstructor exists trivial needs_implicit{{$}} // CHECK-NEXT: | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param{{$}} // CHECK-NEXT: | |-MoveConstructor exists simple trivial needs_implicit{{$}} // CHECK-NEXT: | |-CopyAssignment simple trivial has_const_param needs_implicit implicit_has_const_param{{$}} // CHECK-NEXT: | |-MoveAssignment exists simple trivial needs_implicit{{$}} // CHECK-NEXT: | `-Destructor simple irrelevant trivial needs_implicit{{$}} // CHECK-NEXT: |-TemplateArgument type 'type-parameter-0-0'{{$}} // CHECK-NEXT: | `-TemplateTypeParmType 0x{{.+}} 'type-parameter-0-0' dependent depth 0 index 0{{$}} // CHECK-NEXT: |-TemplateArgument type 'testClassTemplateDecl::A'{{$}} // CHECK-NEXT: | `-RecordType 0x{{.+}} 'testClassTemplateDecl::A'{{$}} // CHECK-NEXT: | `-CXXRecord 0x{{.+}} 'A'{{$}} // CHECK-NEXT: |-TemplateTypeParmDecl 0x{{.+}} col:21 referenced typename depth 0 index 0 T1{{$}} // CHECK-NEXT: |-CXXRecordDecl 0x{{.+}} col:31 implicit class TestClassTemplatePartial{{$}} // CHECK-NEXT: `-FieldDecl 0x{{.+}} col:9 j 'int'{{$}} // CHECK: ClassTemplateDecl 0x{{.+}} <{{.+}}:[[@LINE-130]]:3, col:37> col:37 TestTemplateDefaultType{{$}} // CHECK-NEXT: |-TemplateTypeParmDecl 0x{{.+}} col:21 typename depth 0 index 0 T{{$}} // CHECK-NEXT: | `-TemplateArgument type 'int'{{$}} // CHECK-NEXT: | `-BuiltinType 0x{{.+}} 'int'{{$}} // CHECK-NEXT: `-CXXRecordDecl 0x{{.+}} col:37 struct TestTemplateDefaultType{{$}} // CHECK: ClassTemplateDecl 0x{{.+}} prev 0x{{.+}} <{{.+}}:[[@LINE-135]]:3, col:57> col:31 TestTemplateDefaultType{{$}} // CHECK-NEXT: |-TemplateTypeParmDecl 0x{{.+}} col:21 typename depth 0 index 0 T{{$}} // CHECK-NEXT: | `-TemplateArgument type 'int'{{$}} // CHECK-NEXT: | |-inherited from TemplateTypeParm 0x{{.+}} 'T'{{$}} // CHECK-NEXT: | `-BuiltinType 0x{{.+}} 'int'{{$}} // CHECK-NEXT: `-CXXRecordDecl 0x{{.+}} prev 0x{{.+}} col:31 struct TestTemplateDefaultType definition{{$}} // CHECK-NEXT: |-DefinitionData empty aggregate standard_layout trivially_copyable pod trivial literal has_constexpr_non_copy_move_ctor can_const_default_init{{$}} // CHECK-NEXT: | |-DefaultConstructor exists trivial constexpr needs_implicit defaulted_is_constexpr{{$}} // CHECK-NEXT: | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param{{$}} // CHECK-NEXT: | |-MoveConstructor exists simple trivial needs_implicit{{$}} // CHECK-NEXT: | |-CopyAssignment simple trivial has_const_param needs_implicit implicit_has_const_param{{$}} // CHECK-NEXT: | |-MoveAssignment exists simple trivial needs_implicit{{$}} // CHECK-NEXT: | `-Destructor simple irrelevant trivial needs_implicit{{$}} // CHECK-NEXT: `-CXXRecordDecl 0x{{.+}} col:31 implicit struct TestTemplateDefaultType{{$}} // CHECK: ClassTemplateDecl 0x{{.+}} <{{.+}}:[[@LINE-148]]:3, col:31> col:31 TestTemplateDefaultNonType{{$}} // CHECK-NEXT: |-NonTypeTemplateParmDecl 0x{{.+}} col:16 'int' depth 0 index 0 I{{$}} // CHECK-NEXT: | `-TemplateArgument expr '42'{{$}} // CHECK-NEXT: | `-IntegerLiteral 0x{{.+}} 'int' 42{{$}} // CHECK-NEXT: `-CXXRecordDecl 0x{{.+}} col:31 struct TestTemplateDefaultNonType{{$}} // CHECK: ClassTemplateDecl 0x{{.+}} <{{.+}}:{{.*}}:3, col:68> col:68 TestTemplateTemplateDefaultType{{$}} // CHECK-NEXT: |-TemplateTemplateParmDecl 0x{{.+}} col:37 depth 0 index 0 TT{{$}} // CHECK-NEXT: | |-TemplateTypeParmDecl 0x{{.+}} col:29 typename depth 1 index 0{{$}} // CHECK-NEXT: | `-TemplateArgument template 'TestClassTemplate':'testClassTemplateDecl::TestClassTemplate' qualified{{$}} // CHECK-NEXT: | `-ClassTemplateDecl 0x{{.+}} line:{{.+}}:30 TestClassTemplate{{$}} // CHECK-NEXT: `-CXXRecordDecl 0x{{.+}} col:68 struct TestTemplateTemplateDefaultType{{$}} // CHECK: ClassTemplateDecl 0x{{.+}} prev 0x{{.+}} <{{.+}}:{{.*}}:3, col:82> col:48 TestTemplateTemplateDefaultType{{$}} // CHECK-NEXT: |-TemplateTemplateParmDecl 0x{{.+}} col:37 depth 0 index 0 TT{{$}} // CHECK-NEXT: | |-TemplateTypeParmDecl 0x{{.+}} col:29 typename depth 1 index 0{{$}} // CHECK-NEXT: | `-TemplateArgument template 'TestClassTemplate':'testClassTemplateDecl::TestClassTemplate' qualified{{$}} // CHECK-NEXT: | |-inherited from TemplateTemplateParm 0x{{.+}} 'TT'{{$}} // CHECK-NEXT: | `-ClassTemplateDecl 0x{{.+}} line:{{.+}}:30 TestClassTemplate // CHECK-NEXT: `-CXXRecordDecl 0x{{.+}} prev 0x{{.+}} col:48 struct TestTemplateTemplateDefaultType definition{{$}} // CHECK-NEXT: |-DefinitionData empty aggregate standard_layout trivially_copyable pod trivial literal has_constexpr_non_copy_move_ctor can_const_default_init{{$}} // CHECK-NEXT: | |-DefaultConstructor exists trivial constexpr needs_implicit defaulted_is_constexpr{{$}} // CHECK-NEXT: | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param{{$}} // CHECK-NEXT: | |-MoveConstructor exists simple trivial needs_implicit{{$}} // CHECK-NEXT: | |-CopyAssignment simple trivial has_const_param needs_implicit implicit_has_const_param{{$}} // CHECK-NEXT: | |-MoveAssignment exists simple trivial needs_implicit{{$}} // CHECK-NEXT: | `-Destructor simple irrelevant trivial needs_implicit{{$}} // CHECK-NEXT: `-CXXRecordDecl 0x{{.+}} col:48 implicit struct TestTemplateTemplateDefaultType{{$}} namespace testClassTemplateDecl { template struct TestClassTemplateWithScopedMemberEnum { enum class E1 : T { A, B, C, D }; enum class E2 : int { A, B, C, D }; enum class E3 : T; enum class E4 : int; }; template struct TestClassTemplateWithScopedMemberEnum; TestClassTemplateWithScopedMemberEnum TestClassTemplateWithScopedMemberEnumObject; } // CHECK: ClassTemplateDecl 0x{{.+}} <{{.+}}:[[@LINE-12]]:3, line:[[@LINE-7]]:3> line:[[@LINE-12]]:31 TestClassTemplateWithScopedMemberEnum // CHECK-NEXT: |-TemplateTypeParmDecl 0x{{.+}} col:21 referenced typename depth 0 index 0 T // CHECK-NEXT: |-CXXRecordDecl 0x{{.+}} line:[[@LINE-14]]:31 struct TestClassTemplateWithScopedMemberEnum definition // CHECK: | |-EnumDecl 0x[[#%x,SCOPED_MEMBER_ENUM_E1:]] col:16 class E1 'T' // CHECK-NEXT: | | |-EnumConstantDecl 0x{{.+}} col:25 A 'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum::E1' // CHECK-NEXT: | | |-EnumConstantDecl 0x{{.+}} col:28 B 'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum::E1' // CHECK-NEXT: | | |-EnumConstantDecl 0x{{.+}} col:31 C 'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum::E1' // CHECK-NEXT: | | `-EnumConstantDecl 0x{{.+}} col:34 D 'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum::E1' // CHECK-NEXT: | |-EnumDecl 0x[[#%x,SCOPED_MEMBER_ENUM_E2:]] col:16 class E2 'int' // CHECK-NEXT: | | |-EnumConstantDecl 0x{{.+}} col:27 A 'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum::E2' // CHECK-NEXT: | | |-EnumConstantDecl 0x{{.+}} col:30 B 'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum::E2' // CHECK-NEXT: | | |-EnumConstantDecl 0x{{.+}} col:33 C 'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum::E2' // CHECK-NEXT: | | `-EnumConstantDecl 0x{{.+}} col:36 D 'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum::E2' // CHECK-NEXT: | |-EnumDecl 0x[[#%x,SCOPED_MEMBER_ENUM_E3:]] col:16 class E3 'T' // CHECK-NEXT: | `-EnumDecl 0x[[#%x,SCOPED_MEMBER_ENUM_E4:]] col:16 class E4 'int' // CHECK-NEXT: |-ClassTemplateSpecialization 0x{{.+}} 'TestClassTemplateWithScopedMemberEnum' // CHECK-NEXT: `-ClassTemplateSpecializationDecl 0x{{.+}} line:[[@LINE-28]]:31 struct TestClassTemplateWithScopedMemberEnum definition implicit_instantiation // CHECK: |-TemplateArgument type 'int' // CHECK-NEXT: | `-BuiltinType 0x{{.+}} 'int' // CHECK: |-EnumDecl 0x{{.+}} col:16 class E1 'int' instantiated_from 0x[[#SCOPED_MEMBER_ENUM_E1]]{{$}} // CHECK-NEXT: |-EnumDecl 0x{{.+}} col:16 class E2 'int' instantiated_from 0x[[#SCOPED_MEMBER_ENUM_E2]]{{$}} // CHECK-NEXT: |-EnumDecl 0x{{.+}} col:16 class E3 'int' instantiated_from 0x[[#SCOPED_MEMBER_ENUM_E3]]{{$}} // CHECK-NEXT: |-EnumDecl 0x{{.+}} col:16 class E4 'int' instantiated_from 0x[[#SCOPED_MEMBER_ENUM_E4]]{{$}} // CHECK: ClassTemplateSpecializationDecl 0x{{.+}} <{{.+}}:[[@LINE-29]]:3, col:65> col:19 struct TestClassTemplateWithScopedMemberEnum definition explicit_instantiation_definition // CHECK: |-TemplateArgument type 'unsigned int' // CHECK-NEXT: | `-BuiltinType 0x{{.+}} 'unsigned int' // CHECK: |-EnumDecl 0x{{.+}} col:16 class E1 'unsigned int' instantiated_from 0x[[#SCOPED_MEMBER_ENUM_E1]]{{$}} // CHECK-NEXT: | |-EnumConstantDecl 0x{{.+}} col:25 A 'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum::E1' // CHECK-NEXT: | |-EnumConstantDecl 0x{{.+}} col:28 B 'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum::E1' // CHECK-NEXT: | |-EnumConstantDecl 0x{{.+}} col:31 C 'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum::E1' // CHECK-NEXT: | `-EnumConstantDecl 0x{{.+}} col:34 D 'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum::E1' // CHECK-NEXT: |-EnumDecl 0x{{.+}} col:16 class E2 'int' instantiated_from 0x[[#SCOPED_MEMBER_ENUM_E2]]{{$}} // CHECK-NEXT: | |-EnumConstantDecl 0x{{.+}} col:27 A 'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum::E2' // CHECK-NEXT: | |-EnumConstantDecl 0x{{.+}} col:30 B 'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum::E2' // CHECK-NEXT: | |-EnumConstantDecl 0x{{.+}} col:33 C 'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum::E2' // CHECK-NEXT: | `-EnumConstantDecl 0x{{.+}} col:36 D 'testClassTemplateDecl::TestClassTemplateWithScopedMemberEnum::E2' // CHECK-NEXT: |-EnumDecl 0x{{.+}} col:16 class E3 'unsigned int' instantiated_from 0x[[#SCOPED_MEMBER_ENUM_E3]]{{$}} // CHECK-NEXT: `-EnumDecl 0x{{.+}} col:16 class E4 'int' instantiated_from 0x[[#SCOPED_MEMBER_ENUM_E4]]{{$}} namespace testClassTemplateDecl { template struct TestClassTemplateWithUnscopedMemberEnum { enum E1 : T { E1_A, E1_B, E1_C, E1_D }; enum E2 : int { E2_A, E2_B, E2_C, E2_D }; enum E3 : T; enum E4 : int; }; template struct TestClassTemplateWithUnscopedMemberEnum; TestClassTemplateWithUnscopedMemberEnum TestClassTemplateWithUnscopedMemberEnumObject; } // CHECK: ClassTemplateDecl 0x{{.+}} <{{.+}}:[[@LINE-12]]:3, line:[[@LINE-7]]:3> line:[[@LINE-12]]:31 TestClassTemplateWithUnscopedMemberEnum // CHECK-NEXT: |-TemplateTypeParmDecl 0x{{.+}} col:21 referenced typename depth 0 index 0 T // CHECK-NEXT: |-CXXRecordDecl 0x{{.+}} line:[[@LINE-14]]:31 struct TestClassTemplateWithUnscopedMemberEnum definition // CHECK: | |-EnumDecl 0x[[#%x,UNSCOPED_MEMBER_ENUM_E1:]] col:10 E1 'T' // CHECK-NEXT: | | |-EnumConstantDecl 0x{{.+}} col:19 E1_A 'testClassTemplateDecl::TestClassTemplateWithUnscopedMemberEnum::E1' // CHECK-NEXT: | | |-EnumConstantDecl 0x{{.+}} col:25 E1_B 'testClassTemplateDecl::TestClassTemplateWithUnscopedMemberEnum::E1' // CHECK-NEXT: | | |-EnumConstantDecl 0x{{.+}} col:31 E1_C 'testClassTemplateDecl::TestClassTemplateWithUnscopedMemberEnum::E1' // CHECK-NEXT: | | `-EnumConstantDecl 0x{{.+}} col:37 E1_D 'testClassTemplateDecl::TestClassTemplateWithUnscopedMemberEnum::E1' // CHECK-NEXT: | |-EnumDecl 0x[[#%x,UNSCOPED_MEMBER_ENUM_E2:]] col:10 E2 'int' // CHECK-NEXT: | | |-EnumConstantDecl 0x{{.+}} col:21 E2_A 'testClassTemplateDecl::TestClassTemplateWithUnscopedMemberEnum::E2' // CHECK-NEXT: | | |-EnumConstantDecl 0x{{.+}} col:27 E2_B 'testClassTemplateDecl::TestClassTemplateWithUnscopedMemberEnum::E2' // CHECK-NEXT: | | |-EnumConstantDecl 0x{{.+}} col:33 E2_C 'testClassTemplateDecl::TestClassTemplateWithUnscopedMemberEnum::E2' // CHECK-NEXT: | | `-EnumConstantDecl 0x{{.+}} col:39 E2_D 'testClassTemplateDecl::TestClassTemplateWithUnscopedMemberEnum::E2' // CHECK-NEXT: | |-EnumDecl 0x[[#%x,UNSCOPED_MEMBER_ENUM_E3:]] col:10 E3 'T' // CHECK-NEXT: | `-EnumDecl 0x[[#%x,UNSCOPED_MEMBER_ENUM_E4:]] col:10 E4 'int' // CHECK-NEXT: `-ClassTemplateSpecialization {{.+}} 'TestClassTemplateWithUnscopedMemberEnum' // CHECK: ClassTemplateSpecializationDecl 0x{{.+}} <{{.+}}:[[@LINE-22]]:3, col:67> col:19 struct TestClassTemplateWithUnscopedMemberEnum definition explicit_instantiation_definition // CHECK: |-TemplateArgument type 'unsigned int' // CHECK-NEXT: | `-BuiltinType 0x{{.+}} 'unsigned int' // CHECK: |-EnumDecl 0x{{.+}} col:10 E1 'unsigned int' instantiated_from 0x[[#UNSCOPED_MEMBER_ENUM_E1]]{{$}} // CHECK-NEXT: | |-EnumConstantDecl 0x{{.+}} col:19 E1_A 'testClassTemplateDecl::TestClassTemplateWithUnscopedMemberEnum::E1' // CHECK-NEXT: | |-EnumConstantDecl 0x{{.+}} col:25 E1_B 'testClassTemplateDecl::TestClassTemplateWithUnscopedMemberEnum::E1' // CHECK-NEXT: | |-EnumConstantDecl 0x{{.+}} col:31 E1_C 'testClassTemplateDecl::TestClassTemplateWithUnscopedMemberEnum::E1' // CHECK-NEXT: | `-EnumConstantDecl 0x{{.+}} col:37 E1_D 'testClassTemplateDecl::TestClassTemplateWithUnscopedMemberEnum::E1' // CHECK-NEXT: |-EnumDecl 0x{{.+}} col:10 E2 'int' instantiated_from 0x[[#UNSCOPED_MEMBER_ENUM_E2]]{{$}} // CHECK-NEXT: | |-EnumConstantDecl 0x{{.+}} col:21 E2_A 'testClassTemplateDecl::TestClassTemplateWithUnscopedMemberEnum::E2' // CHECK-NEXT: | |-EnumConstantDecl 0x{{.+}} col:27 E2_B 'testClassTemplateDecl::TestClassTemplateWithUnscopedMemberEnum::E2' // CHECK-NEXT: | |-EnumConstantDecl 0x{{.+}} col:33 E2_C 'testClassTemplateDecl::TestClassTemplateWithUnscopedMemberEnum::E2' // CHECK-NEXT: | `-EnumConstantDecl 0x{{.+}} col:39 E2_D 'testClassTemplateDecl::TestClassTemplateWithUnscopedMemberEnum::E2' // CHECK-NEXT: |-EnumDecl 0x{{.+}} col:10 E3 'unsigned int' instantiated_from 0x[[#UNSCOPED_MEMBER_ENUM_E3]]{{$}} // CHECK-NEXT: |-EnumDecl 0x{{.+}} col:10 E4 'int' instantiated_from 0x[[#UNSCOPED_MEMBER_ENUM_E4]]{{$}} // PR15220 dump instantiation only once namespace testCanonicalTemplate { class A {}; template void TestFunctionTemplate(T); template void TestFunctionTemplate(T); void bar(A a) { TestFunctionTemplate(a); } // CHECK: FunctionTemplateDecl 0x{{.+}} <{{.+}}:[[@LINE-3]]:3, col:51> col:29 TestFunctionTemplate{{$}} // CHECK-NEXT: |-TemplateTypeParmDecl 0x{{.+}} col:21 referenced typename depth 0 index 0 T{{$}} // CHECK-NEXT: |-FunctionDecl 0x{{.*}} col:29 TestFunctionTemplate 'void (T)'{{$}} // CHECK-NEXT: | `-ParmVarDecl 0x{{.*}} col:51 'T'{{$}} // CHECK-NEXT: `-FunctionDecl 0x{{.*}} col:29 used TestFunctionTemplate 'void (testCanonicalTemplate::A)' implicit_instantiation{{$}} // CHECK-NEXT: |-TemplateArgument type 'testCanonicalTemplate::A'{{$}} // CHECK-NEXT: | `-RecordType 0x{{.+}} 'testCanonicalTemplate::A'{{$}} // CHECK-NEXT: | `-CXXRecord 0x{{.+}} 'A'{{$}} // CHECK-NEXT: `-ParmVarDecl 0x{{.*}} col:51 'testCanonicalTemplate::A'{{$}} // CHECK: FunctionTemplateDecl 0x{{.+}} prev 0x{{.+}} <{{.+}}:[[@LINE-12]]:3, col:51> col:29 TestFunctionTemplate{{$}} // CHECK-NEXT: |-TemplateTypeParmDecl 0x{{.+}} col:21 referenced typename depth 0 index 0 T{{$}} // CHECK-NEXT: |-FunctionDecl{{.*}} 0x{{.+}} prev 0x{{.+}} col:29 TestFunctionTemplate 'void (T)'{{$}} // CHECK-NEXT: | `-ParmVarDecl 0x{{.+}} col:51 'T'{{$}} // CHECK-NEXT: `-Function 0x{{.+}} 'TestFunctionTemplate' 'void (testCanonicalTemplate::A)'{{$}} // CHECK-NOT: TemplateArgument{{$}} template class TestClassTemplate { template friend class TestClassTemplate; }; TestClassTemplate a; // CHECK: ClassTemplateDecl 0x{{.+}} <{{.+}}:[[@LINE-4]]:3, line:[[@LINE-2]]:3> line:[[@LINE-4]]:31 TestClassTemplate{{$}} // CHECK-NEXT: |-TemplateTypeParmDecl 0x{{.+}} col:21 typename depth 0 index 0 T1{{$}} // CHECK-NEXT: |-CXXRecordDecl 0x{{.+}} line:[[@LINE-6]]:31 class TestClassTemplate definition{{$}} // CHECK-NEXT: | |-DefinitionData empty aggregate standard_layout trivially_copyable pod trivial literal has_constexpr_non_copy_move_ctor can_const_default_init{{$}} // CHECK-NEXT: | | |-DefaultConstructor exists trivial constexpr needs_implicit defaulted_is_constexpr{{$}} // CHECK-NEXT: | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param{{$}} // CHECK-NEXT: | | |-MoveConstructor exists simple trivial needs_implicit{{$}} // CHECK-NEXT: | | |-CopyAssignment simple trivial has_const_param needs_implicit implicit_has_const_param{{$}} // CHECK-NEXT: | | |-MoveAssignment exists simple trivial needs_implicit{{$}} // CHECK-NEXT: | | `-Destructor simple irrelevant trivial needs_implicit{{$}} // CHECK-NEXT: | |-CXXRecordDecl 0x{{.+}} col:31 implicit class TestClassTemplate{{$}} // CHECK-NEXT: | `-FriendDecl 0x{{.+}} col:40{{$}} // CHECK-NEXT: | `-ClassTemplateDecl 0x{{.+}} parent 0x{{.+}} col:40 friend_undeclared TestClassTemplate{{$}} // CHECK-NEXT: | |-TemplateTypeParmDecl 0x{{.+}} col:23 typename depth 1 index 0 T2{{$}} // CHECK-NEXT: | `-CXXRecordDecl 0x{{.+}} parent 0x{{.+}} col:40 class TestClassTemplate{{$}} // CHECK-NEXT: `-ClassTemplateSpecializationDecl 0x{{.+}} line:[[@LINE-19]]:31 class TestClassTemplate definition implicit_instantiation{{$}} // 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{{$}} // CHECK-NEXT: | |-DefaultConstructor exists trivial constexpr defaulted_is_constexpr{{$}} // CHECK-NEXT: | |-CopyConstructor simple trivial has_const_param implicit_has_const_param{{$}} // CHECK-NEXT: | |-MoveConstructor exists simple trivial{{$}} // CHECK-NEXT: | |-CopyAssignment simple trivial has_const_param needs_implicit implicit_has_const_param{{$}} // CHECK-NEXT: | |-MoveAssignment exists simple trivial needs_implicit{{$}} // CHECK-NEXT: | `-Destructor simple irrelevant trivial needs_implicit{{$}} // CHECK-NEXT: |-TemplateArgument type 'testCanonicalTemplate::A'{{$}} // CHECK-NEXT: | `-RecordType 0x{{.+}} 'testCanonicalTemplate::A'{{$}} // CHECK-NEXT: | `-CXXRecord 0x{{.+}} 'A'{{$}} // CHECK-NEXT: |-CXXRecordDecl 0x{{.+}} col:31 implicit class TestClassTemplate{{$}} // CHECK-NEXT: |-FriendDecl 0x{{.+}} col:40{{$}} // CHECK-NEXT: | `-ClassTemplateDecl 0x{{.+}} parent 0x{{.+}} prev 0x{{.+}} col:40 friend TestClassTemplate{{$}} // CHECK-NEXT: | |-TemplateTypeParmDecl 0x{{.+}} col:23 typename depth 0 index 0 T2{{$}} // CHECK-NEXT: | |-CXXRecordDecl 0x{{.+}} parent 0x{{.+}} prev 0x{{.+}} col:40 class TestClassTemplate{{$}} // CHECK-NEXT: | `-ClassTemplateSpecialization 0x{{.+}} 'TestClassTemplate'{{$}} // CHECK-NEXT: |-CXXConstructorDecl 0x{{.+}} col:31 implicit used constexpr TestClassTemplate 'void () noexcept' inline default trivial{{$}} // CHECK-NEXT: | `-CompoundStmt 0x{{.+}} {{$}} // CHECK-NEXT: |-CXXConstructorDecl 0x{{.+}} col:31 implicit constexpr TestClassTemplate 'void (const TestClassTemplate &)' inline default trivial noexcept-unevaluated 0x{{.+}}{{$}} // CHECK-NEXT: | `-ParmVarDecl 0x{{.+}} col:31 'const TestClassTemplate &'{{$}} // CHECK-NEXT: `-CXXConstructorDecl 0x{{.+}} col:31 implicit constexpr TestClassTemplate 'void (TestClassTemplate &&)' inline default trivial noexcept-unevaluated 0x{{.+}}{{$}} // CHECK-NEXT: `-ParmVarDecl 0x{{.+}} col:31 'TestClassTemplate &&'{{$}} template class TestClassTemplate2; template class TestClassTemplate2; template class TestClassTemplate2 { }; TestClassTemplate2 a2; // CHECK: ClassTemplateDecl 0x{{.+}} <{{.+}}:[[@LINE-5]]:3, col:31> col:31 TestClassTemplate2{{$}} // CHECK-NEXT: |-TemplateTypeParmDecl 0x{{.+}} col:21 typename depth 0 index 0 T1{{$}} // CHECK-NEXT: |-CXXRecordDecl 0x{{.+}} col:31 class TestClassTemplate2{{$}} // CHECK-NEXT: `-ClassTemplateSpecializationDecl 0x{{.+}} line:[[@LINE-6]]:31 class TestClassTemplate2 definition implicit_instantiation{{$}} // 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{{$}} // CHECK-NEXT: | |-DefaultConstructor exists trivial constexpr defaulted_is_constexpr{{$}} // CHECK-NEXT: | |-CopyConstructor simple trivial has_const_param implicit_has_const_param{{$}} // CHECK-NEXT: | |-MoveConstructor exists simple trivial{{$}} // CHECK-NEXT: | |-CopyAssignment simple trivial has_const_param needs_implicit implicit_has_const_param{{$}} // CHECK-NEXT: | |-MoveAssignment exists simple trivial needs_implicit{{$}} // CHECK-NEXT: | `-Destructor simple irrelevant trivial needs_implicit{{$}} // CHECK-NEXT: |-TemplateArgument type 'testCanonicalTemplate::A'{{$}} // CHECK-NEXT: | `-RecordType 0x{{.+}} 'testCanonicalTemplate::A'{{$}} // CHECK-NEXT: | `-CXXRecord 0x{{.+}} 'A'{{$}} // CHECK-NEXT: |-CXXRecordDecl 0x{{.+}} col:31 implicit class TestClassTemplate2{{$}} // CHECK-NEXT: |-CXXConstructorDecl 0x{{.+}} col:31 implicit used constexpr TestClassTemplate2 'void () noexcept' inline default trivial{{$}} // CHECK-NEXT: | `-CompoundStmt 0x{{.+}} {{$}} // CHECK-NEXT: |-CXXConstructorDecl 0x{{.+}} col:31 implicit constexpr TestClassTemplate2 'void (const TestClassTemplate2 &)' inline default trivial noexcept-unevaluated 0x{{.+}}{{$}} // CHECK-NEXT: | `-ParmVarDecl 0x{{.+}} col:31 'const TestClassTemplate2 &'{{$}} // CHECK-NEXT: `-CXXConstructorDecl 0x{{.+}} col:31 implicit constexpr TestClassTemplate2 'void (TestClassTemplate2 &&)' inline default trivial noexcept-unevaluated 0x{{.+}}{{$}} // CHECK-NEXT: `-ParmVarDecl 0x{{.+}} col:31 'TestClassTemplate2 &&'{{$}} // CHECK: ClassTemplateDecl 0x{{.+}} prev 0x{{.+}} <{{.+}}:[[@LINE-26]]:3, col:31> col:31 TestClassTemplate2{{$}} // CHECK-NEXT: |-TemplateTypeParmDecl 0x{{.+}} col:21 typename depth 0 index 0 T1{{$}} // CHECK-NEXT: |-CXXRecordDecl 0x{{.+}} prev 0x{{.+}} col:31 class TestClassTemplate2{{$}} // CHECK-NEXT: `-ClassTemplateSpecialization 0x{{.+}} 'TestClassTemplate2'{{$}} // CHECK: ClassTemplateDecl 0x{{.+}} prev 0x{{.+}} <{{.+}}:[[@LINE-30]]:3, line:[[@LINE-29]]:3> line:[[@LINE-30]]:31 TestClassTemplate2{{$}} // CHECK-NEXT: |-TemplateTypeParmDecl 0x{{.+}} col:21 typename depth 0 index 0 T1{{$}} // CHECK-NEXT: |-CXXRecordDecl 0x{{.+}} prev 0x{{.+}} line:[[@LINE-32]]:31 class TestClassTemplate2 definition{{$}} // CHECK-NEXT: | |-DefinitionData empty aggregate standard_layout trivially_copyable pod trivial literal has_constexpr_non_copy_move_ctor can_const_default_init{{$}} // CHECK-NEXT: | | |-DefaultConstructor exists trivial constexpr needs_implicit defaulted_is_constexpr{{$}} // CHECK-NEXT: | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param{{$}} // CHECK-NEXT: | | |-MoveConstructor exists simple trivial needs_implicit{{$}} // CHECK-NEXT: | | |-CopyAssignment simple trivial has_const_param needs_implicit implicit_has_const_param{{$}} // CHECK-NEXT: | | |-MoveAssignment exists simple trivial needs_implicit{{$}} // CHECK-NEXT: | | `-Destructor simple irrelevant trivial needs_implicit{{$}} // CHECK-NEXT: | `-CXXRecordDecl 0x{{.+}} col:31 implicit class TestClassTemplate2{{$}} // CHECK-NEXT: `-ClassTemplateSpecialization 0x{{.+}} 'TestClassTemplate2'{{$}} struct S { template static const T TestVarTemplate; // declaration of a static data member template }; template const T S::TestVarTemplate = { }; // definition of a static data member template void f() { int i = S::TestVarTemplate; int j = S::TestVarTemplate; } // CHECK: VarTemplateDecl 0x{{.+}} <{{.+}}:[[@LINE-11]]:7, col:43> col:43 TestVarTemplate{{$}} // CHECK-NEXT: |-TemplateTypeParmDecl 0x{{.+}} col:25 referenced typename depth 0 index 0 T{{$}} // CHECK-NEXT: |-VarDecl 0x{{.+}} col:43 TestVarTemplate 'const T' static{{$}} // CHECK-NEXT: |-VarTemplateSpecializationDecl 0x{{.+}} parent 0x{{.+}} prev 0x{{.+}} col:14 referenced TestVarTemplate 'const int' implicit_instantiation cinit{{$}} // CHECK-NEXT: | |-NestedNameSpecifier TypeSpec 'testCanonicalTemplate::S'{{$}} // CHECK-NEXT: | |-TemplateArgument type 'int'{{$}} // CHECK-NEXT: | | `-BuiltinType 0x{{.+}} 'int'{{$}} // CHECK-NEXT: | `-InitListExpr 0x{{.+}} 'int'{{$}} // CHECK-NEXT: `-VarTemplateSpecializationDecl 0x{{.+}} col:43 referenced TestVarTemplate 'const int' implicit_instantiation static{{$}} // CHECK-NEXT: `-TemplateArgument type 'int'{{$}} // CHECK: VarTemplateSpecializationDecl 0x{{.+}} <{{.+}}:[[@LINE-22]]:7, col:43> col:43 referenced TestVarTemplate 'const int' implicit_instantiation static{{$}} // CHECK-NEXT:`-TemplateArgument type 'int'{{$}} // CHECK-NEXT: `-BuiltinType 0x{{.+}} 'int'{{$}} // CHECK: VarTemplateDecl 0x{{.+}} parent 0x{{.+}} prev 0x{{.+}} <{{.+}}:[[@LINE-24]]:3, line:[[@LINE-23]]:34> col:14 TestVarTemplate{{$}} // CHECK-NEXT: |-TemplateTypeParmDecl 0x{{.+}} col:21 referenced typename depth 0 index 0 T{{$}} // CHECK-NEXT: |-VarDecl 0x{{.+}} parent 0x{{.+}} prev 0x{{.+}} col:14 TestVarTemplate 'const T' cinit{{$}} // CHECK-NEXT: | |-NestedNameSpecifier TypeSpec 'testCanonicalTemplate::S'{{$}} // CHECK-NEXT: | `-InitListExpr 0x{{.+}} 'void'{{$}} // CHECK-NEXT: |-VarTemplateSpecialization 0x{{.+}} 'TestVarTemplate' 'const int'{{$}} // CHECK-NEXT: `-VarTemplateSpecialization 0x{{.+}} 'TestVarTemplate' 'const int'{{$}} // CHECK: VarTemplateSpecializationDecl 0x{{.+}} parent 0x{{.+}} prev 0x{{.+}} <{{.+}}:[[@LINE-32]]:3, line:[[@LINE-31]]:34> col:14 referenced TestVarTemplate 'const int' implicit_instantiation cinit{{$}} // CHECK-NEXT: |-NestedNameSpecifier TypeSpec 'testCanonicalTemplate::S'{{$}} // CHECK-NEXT: |-TemplateArgument type 'int'{{$}} // CHECK-NEXT: | `-BuiltinType 0x{{.+}} 'int'{{$}} // CHECK-NEXT: `-InitListExpr 0x{{.+}} 'int'{{$}} } template class TestClassScopeFunctionSpecialization { template void foo(U a) { } template<> void foo(int a) { } }; // CHECK: FunctionTemplateDecl{{.*}} foo // CHECK-NEXT: TemplateTypeParmDecl{{.*}} referenced class depth 1 index 0 U // CHECK-NEXT: CXXMethodDecl{{.*}} foo 'void (U)' implicit-inline // CHECK-NEXT: ParmVarDecl // CHECK-NEXT: CompoundStmt // CHECK-NEXT: CXXMethodDecl{{.*}} foo 'void (int)' explicit_specialization implicit-inline // CHECK-NEXT: TemplateArgument{{.*}} 'int' // CHECK-NEXT: BuiltinType{{.*}} 'int' // CHECK-NEXT: ParmVarDecl // CHECK-NEXT: CompoundStmt namespace TestTemplateTypeParmDecl { template void foo(); } // CHECK: NamespaceDecl{{.*}} TestTemplateTypeParmDecl // CHECK-NEXT: FunctionTemplateDecl // CHECK-NEXT: TemplateTypeParmDecl{{.*}} typename depth 0 index 0 ... T // CHECK-NEXT: TemplateTypeParmDecl{{.*}} class depth 0 index 1 U // CHECK-NEXT: TemplateArgument type 'int' namespace TestNonTypeTemplateParmDecl { template void foo(); } // CHECK: NamespaceDecl{{.*}} TestNonTypeTemplateParmDecl // CHECK-NEXT: FunctionTemplateDecl // CHECK-NEXT: NonTypeTemplateParmDecl{{.*}} 'int' depth 0 index 0 I // CHECK-NEXT: TemplateArgument {{.*}} expr // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 1 // CHECK-NEXT: NonTypeTemplateParmDecl{{.*}} 'int' depth 0 index 1 ... J namespace TestTemplateTemplateParmDecl { template class A; template