diff --git a/clang/lib/AST/TextNodeDumper.cpp b/clang/lib/AST/TextNodeDumper.cpp --- a/clang/lib/AST/TextNodeDumper.cpp +++ b/clang/lib/AST/TextNodeDumper.cpp @@ -1892,6 +1892,11 @@ // ParmVarDecls yet. if (!D->param_empty() && !D->param_begin()) OS << " <<getNumParams() << ">>>"; + + if (auto *Instance = D->getInstantiatedFromMemberFunction()) { + OS << " instantiated_from"; + dumpPointer(Instance); + } } void TextNodeDumper::VisitLifetimeExtendedTemporaryDecl( @@ -2107,6 +2112,10 @@ void TextNodeDumper::VisitCXXRecordDecl(const CXXRecordDecl *D) { VisitRecordDecl(D); + if (const auto *Instance = D->getInstantiatedFromMemberClass()) { + OS << " instantiated_from"; + dumpPointer(Instance); + } if (const auto *CTSD = dyn_cast(D)) dumpTemplateSpecializationKind(CTSD->getSpecializationKind()); diff --git a/clang/test/AST/ast-dump-decl.cpp b/clang/test/AST/ast-dump-decl.cpp --- a/clang/test/AST/ast-dump-decl.cpp +++ b/clang/test/AST/ast-dump-decl.cpp @@ -316,173 +316,173 @@ 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 -// CHECK-NEXT: | |-CXXRecordDecl 0x{{.+}} col:30 implicit referenced class TestClassTemplate -// CHECK-NEXT: | |-AccessSpecDecl 0x{{.+}} col:3 public -// CHECK-NEXT: | |-CXXConstructorDecl 0x{{.+}} col:5 TestClassTemplate 'void ()' -// CHECK-NEXT: | |-CXXDestructorDecl 0x{{.+}} col:5 ~TestClassTemplate 'void ()' -// CHECK-NEXT: | |-CXXMethodDecl 0x{{.+}} col:9 j 'int ()' -// CHECK-NEXT: | `-FieldDecl 0x{{.+}} col:9 i 'int' -// CHECK-NEXT: |-ClassTemplateSpecializationDecl 0x{{.+}} line:[[@LINE-56]]: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 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 ()' -// CHECK-NEXT: | |-CXXDestructorDecl 0x{{.+}} col:5 used ~TestClassTemplate 'void () noexcept' -// CHECK-NEXT: | |-CXXMethodDecl 0x{{.+}} col:9 j 'int ()' -// 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 -// 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 -// 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 -// CHECK-NEXT: |-CXXDestructorDecl 0x{{.+}} col:5 ~TestClassTemplate 'void ()' explicit_instantiation_declaration noexcept-unevaluated 0x{{.+}} -// CHECK-NEXT: |-CXXMethodDecl 0x{{.+}} col:9 j 'int ()' -// CHECK-NEXT: `-FieldDecl 0x{{.+}} col:9 i 'int' - -// CHECK: ClassTemplateSpecializationDecl 0x{{.+}} <{{.+}}:[[@LINE-91]]:3, col:37> col:18 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 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 -// CHECK-NEXT: |-CXXDestructorDecl 0x{{.+}} col:5 ~TestClassTemplate 'void ()' implicit_instantiation noexcept-unevaluated 0x{{.+}} -// CHECK-NEXT: |-CXXMethodDecl 0x{{.+}} col:9 j 'int ()' implicit_instantiation -// 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 -// 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 -// 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 -// 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 -// CHECK-NEXT: | `-inherited from TemplateTemplateParm 0x{{.+}} 'TT' -// 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 +// 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{{.+}} col:5 TestClassTemplate 'void ()'{{$}} +// CHECK-NEXT: | |-CXXDestructorDecl 0x{{.+}} col:5 ~TestClassTemplate 'void ()' not_selected{{$}} +// CHECK-NEXT: | |-CXXMethodDecl 0x{{.+}} 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[^ ]+}}{{$}} +// CHECK-NEXT: | |-CXXDestructorDecl 0x{{.+}} col:5 used ~TestClassTemplate 'void () noexcept' implicit_instantiation 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-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{{$}} +// 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{{$}} +// 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{{$}} +// CHECK-NEXT: | `-inherited from TemplateTemplateParm 0x{{.+}} 'TT'{{$}} +// 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{{$}} // PR15220 dump instantiation only once @@ -492,65 +492,65 @@ 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)' - // 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':'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 + // 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':'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 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 - // 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 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 &&' + // 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 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 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; @@ -558,45 +558,45 @@ 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 - // 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' + // 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 @@ -610,34 +610,34 @@ 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':'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':'int' - // CHECK-NEXT: `-VarTemplateSpecializationDecl 0x{{.+}} col:43 referenced TestVarTemplate 'const int':'const int' implicit_instantiation static - // CHECK-NEXT: `-TemplateArgument type 'int' - - // CHECK: VarTemplateSpecializationDecl 0x{{.+}} <{{.+}}:[[@LINE-22]]:28, col:43> col:43 referenced TestVarTemplate 'const int':'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':'const int' - // CHECK-NEXT: `-VarTemplateSpecialization 0x{{.+}} 'TestVarTemplate' 'const int':'const int' + // 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':'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':'int'{{$}} + // CHECK-NEXT: `-VarTemplateSpecializationDecl 0x{{.+}} col:43 referenced TestVarTemplate 'const int':'const int' implicit_instantiation static{{$}} + // CHECK-NEXT: `-TemplateArgument type 'int'{{$}} + + // CHECK: VarTemplateSpecializationDecl 0x{{.+}} <{{.+}}:[[@LINE-22]]:28, col:43> col:43 referenced TestVarTemplate 'const int':'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':'const int'{{$}} + // CHECK-NEXT: `-VarTemplateSpecialization 0x{{.+}} 'TestVarTemplate' 'const int':'const int'{{$}} - // CHECK: VarTemplateSpecializationDecl 0x{{.+}} parent 0x{{.+}} prev 0x{{.+}} <{{.+}}:[[@LINE-31]]:3, col:34> col:14 referenced TestVarTemplate 'const int':'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':'int' + // CHECK: VarTemplateSpecializationDecl 0x{{.+}} parent 0x{{.+}} prev 0x{{.+}} <{{.+}}:[[@LINE-31]]:3, col:34> col:14 referenced TestVarTemplate 'const int':'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':'int'{{$}} } template @@ -830,17 +830,17 @@ namespace TestConstexprVariableTemplateWithInitializer { template constexpr T foo{}; - // CHECK: VarTemplateDecl 0x{{.+}} <{{.+}}:[[@LINE-1]]:3, col:40> col:36 foo - // CHECK-NEXT: |-TemplateTypeParmDecl 0x{{.+}} col:21 referenced typename depth 0 index 0 T - // CHECK-NEXT: `-VarDecl 0x{{.+}} col:36 foo 'const T' constexpr listinit - // CHECK-NEXT: `-InitListExpr 0x{{.+}} 'void' + // CHECK: VarTemplateDecl 0x{{.+}} <{{.+}}:[[@LINE-1]]:3, col:40> col:36 foo{{$}} + // CHECK-NEXT: |-TemplateTypeParmDecl 0x{{.+}} col:21 referenced typename depth 0 index 0 T{{$}} + // CHECK-NEXT: `-VarDecl 0x{{.+}} col:36 foo 'const T' constexpr listinit{{$}} + // CHECK-NEXT: `-InitListExpr 0x{{.+}} 'void'{{$}} template constexpr int val{42}; - // CHECK: VarTemplateDecl 0x{{.+}} <{{.+}}:[[@LINE-1]]:3, col:44> col:38 val - // CHECK-NEXT: |-TemplateTypeParmDecl 0x{{.+}} col:21 typename depth 0 index 0 T - // CHECK-NEXT: `-VarDecl 0x{{.+}} col:38 val 'const int' constexpr listinit - // CHECK-NEXT: |-value: Int 42 - // CHECK-NEXT: `-InitListExpr 0x{{.+}} 'int' + // CHECK: VarTemplateDecl 0x{{.+}} <{{.+}}:[[@LINE-1]]:3, col:44> col:38 val{{$}} + // CHECK-NEXT: |-TemplateTypeParmDecl 0x{{.+}} col:21 typename depth 0 index 0 T{{$}} + // CHECK-NEXT: `-VarDecl 0x{{.+}} col:38 val 'const int' constexpr listinit{{$}} + // CHECK-NEXT: |-value: Int 42{{$}} + // CHECK-NEXT: `-InitListExpr 0x{{.+}} 'int'{{$}} template struct in_place_type_t { @@ -849,16 +849,16 @@ template inline constexpr in_place_type_t<_Tp> in_place_type{}; - // CHECK: -VarTemplateDecl 0x{{.+}} col:41 in_place_type - // CHECK-NEXT: |-TemplateTypeParmDecl 0x{{.+}} col:22 referenced typename depth 0 index 0 _Tp - // CHECK-NEXT: `-VarDecl 0x{{.+}} col:41 in_place_type 'const in_place_type_t<_Tp>':'const in_place_type_t<_Tp>' inline constexpr listinit - // CHECK-NEXT: `-InitListExpr 0x{{.+}} 'void' + // CHECK: -VarTemplateDecl 0x{{.+}} col:41 in_place_type{{$}} + // CHECK-NEXT: |-TemplateTypeParmDecl 0x{{.+}} col:22 referenced typename depth 0 index 0 _Tp{{$}} + // CHECK-NEXT: `-VarDecl 0x{{.+}} col:41 in_place_type 'const in_place_type_t<_Tp>':'const in_place_type_t<_Tp>' inline constexpr listinit{{$}} + // CHECK-NEXT: `-InitListExpr 0x{{.+}} 'void'{{$}} template constexpr T call_init(0); - // CHECK: -VarTemplateDecl 0x{{.+}} col:37 call_init - // CHECK-NEXT: |-TemplateTypeParmDecl 0x{{.+}} col:22 referenced typename depth 0 index 0 T - // CHECK-NEXT: `-VarDecl 0x{{.+}} col:37 call_init 'const T' constexpr callinit - // CHECK-NEXT: `-ParenListExpr 0x{{.+}} 'NULL TYPE' - // CHECK-NEXT: `-IntegerLiteral 0x{{.+}} 'int' 0 + // CHECK: -VarTemplateDecl 0x{{.+}} col:37 call_init{{$}} + // CHECK-NEXT: |-TemplateTypeParmDecl 0x{{.+}} col:22 referenced typename depth 0 index 0 T{{$}} + // CHECK-NEXT: `-VarDecl 0x{{.+}} col:37 call_init 'const T' constexpr callinit{{$}} + // CHECK-NEXT: `-ParenListExpr 0x{{.+}} 'NULL TYPE'{{$}} + // CHECK-NEXT: `-IntegerLiteral 0x{{.+}} 'int' 0{{$}} }