]> granicus.if.org Git - clang/commitdiff
[ASTDump] Make template specialization tests more exact
authorStephen Kelly <steveire@gmail.com>
Thu, 31 Jan 2019 22:28:38 +0000 (22:28 +0000)
committerStephen Kelly <steveire@gmail.com>
Thu, 31 Jan 2019 22:28:38 +0000 (22:28 +0000)
Reviewers: aaron.ballman

Subscribers: cfe-commits

Differential Revision: https://reviews.llvm.org/D57502

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@352804 91177308-0d34-0410-b5e6-96231b3b80d8

test/AST/ast-dump-decl.cpp

index 6386d340eb791b8bd05e54ae74d8f2a67998b43a..0d8fadc01eda10cb134d9552d45a9cf433931a7d 100644 (file)
@@ -207,26 +207,28 @@ namespace testFunctionTemplateDecl {
   // explicit instantiation definition\r
   template void TestFunctionTemplate(D);\r
 }\r
-// CHECK:      FunctionTemplateDecl{{.*}} TestFunctionTemplate\r
-// CHECK-NEXT:   TemplateTypeParmDecl\r
-// CHECK-NEXT:   FunctionDecl{{.*}} TestFunctionTemplate 'void (T)'\r
-// CHECK-NEXT:     ParmVarDecl{{.*}} 'T'\r
-// CHECK-NEXT:     CompoundStmt\r
-// CHECK-NEXT:   FunctionDecl{{.*}} TestFunctionTemplate {{.*}}A\r
-// CHECK-NEXT:     TemplateArgument\r
-// CHECK-NEXT:     ParmVarDecl\r
-// CHECK-NEXT:     CompoundStmt\r
-// CHECK-NEXT:   Function{{.*}} 'TestFunctionTemplate' {{.*}}B\r
-// CHECK-NEXT:   FunctionDecl{{.*}} TestFunctionTemplate {{.*}}C\r
-// CHECK-NEXT:     TemplateArgument\r
-// CHECK-NEXT:     ParmVarDecl\r
-// CHECK-NEXT:   FunctionDecl{{.*}} TestFunctionTemplate {{.*}}D\r
-// CHECK-NEXT:     TemplateArgument\r
-// CHECK-NEXT:     ParmVarDecl\r
-// CHECK-NEXT:     CompoundStmt\r
-// CHECK:      FunctionDecl{{.*}} TestFunctionTemplate {{.*}}B\r
-// CHECK-NEXT:   TemplateArgument\r
-// CHECK-NEXT:   ParmVarDecl\r
+  // CHECK:       FunctionTemplateDecl 0x{{.+}} <{{.+}}:[[@LINE-14]]:3, col:55> col:29 TestFunctionTemplate\r
+  // CHECK-NEXT:  |-TemplateTypeParmDecl 0x{{.+}} <col:12, col:21> col:21 referenced typename depth 0 index 0 T\r
+  // CHECK-NEXT:  |-FunctionDecl 0x{{.+}} <col:24, col:55> col:29 TestFunctionTemplate 'void (T)'\r
+  // CHECK-NEXT:  | |-ParmVarDecl 0x{{.+}} <col:50> col:51 'T'\r
+  // CHECK-NEXT:  | `-CompoundStmt 0x{{.+}} <col:53, col:55>\r
+  // CHECK-NEXT:  |-FunctionDecl 0x{{.+}} <col:24, col:55> col:29 used TestFunctionTemplate 'void (testFunctionTemplateDecl::A)'\r
+  // CHECK-NEXT:  | |-TemplateArgument type 'testFunctionTemplateDecl::A'\r
+  // CHECK-NEXT:  | |-ParmVarDecl 0x{{.+}} <col:50> col:51 'testFunctionTemplateDecl::A':'testFunctionTemplateDecl::A'\r
+  // CHECK-NEXT:  | `-CompoundStmt 0x{{.+}} <col:53, col:55>\r
+  // CHECK-NEXT:  |-Function 0x{{.+}} 'TestFunctionTemplate' 'void (testFunctionTemplateDecl::B)'\r
+  // CHECK-NEXT:  |-FunctionDecl 0x{{.+}} <col:24, col:55> col:29 TestFunctionTemplate 'void (testFunctionTemplateDecl::C)'\r
+  // CHECK-NEXT:  | |-TemplateArgument type 'testFunctionTemplateDecl::C'\r
+  // CHECK-NEXT:  | `-ParmVarDecl 0x{{.+}} <col:50> col:51 'testFunctionTemplateDecl::C':'testFunctionTemplateDecl::C'\r
+  // CHECK-NEXT:  `-FunctionDecl 0x{{.+}} <col:24, col:55> col:29 TestFunctionTemplate 'void (testFunctionTemplateDecl::D)'\r
+  // CHECK-NEXT:    |-TemplateArgument type 'testFunctionTemplateDecl::D'\r
+  // CHECK-NEXT:    |-ParmVarDecl 0x{{.+}} <col:50> col:51 'testFunctionTemplateDecl::D':'testFunctionTemplateDecl::D'\r
+  // CHECK-NEXT:    `-CompoundStmt 0x{{.+}} <col:53, col:55>\r
+\r
+  // CHECK:       FunctionDecl 0x{{.+}} prev 0x{{.+}} <{{.+}}:[[@LINE-26]]:3, col:41> col:19 TestFunctionTemplate 'void (testFunctionTemplateDecl::B)'\r
+  // CHECK-NEXT:  |-TemplateArgument type 'testFunctionTemplateDecl::B'\r
+  // CHECK-NEXT:  `-ParmVarDecl 0x{{.+}} <col:40> col:41 'testFunctionTemplateDecl::B'\r
+\r
 \r
 namespace testClassTemplateDecl {\r
   class A { };\r
@@ -273,75 +275,163 @@ namespace testClassTemplateDecl {
   template<template<typename> class TT = TestClassTemplate> struct TestTemplateTemplateDefaultType;\r
   template<template<typename> class TT> struct TestTemplateTemplateDefaultType { };\r
 }\r
-// CHECK:      ClassTemplateDecl{{.*}} TestClassTemplate\r
-// CHECK-NEXT:   TemplateTypeParmDecl\r
-// CHECK-NEXT:   CXXRecordDecl{{.*}} class TestClassTemplate\r
-// CHECK:          CXXRecordDecl{{.*}} class TestClassTemplate\r
-// CHECK-NEXT:     AccessSpecDecl{{.*}} public\r
-// CHECK-NEXT:     CXXConstructorDecl{{.*}} <line:{{.*}}:5, col:23>\r
-// CHECK-NEXT:     CXXDestructorDecl{{.*}} <line:{{.*}}:5, col:24>\r
-// CHECK-NEXT:     CXXMethodDecl{{.*}} <line:{{.*}}:5, col:11>\r
-// CHECK-NEXT:     FieldDecl{{.*}} i\r
-// CHECK-NEXT:   ClassTemplateSpecializationDecl{{.*}} class TestClassTemplate\r
-// CHECK:          TemplateArgument{{.*}}A\r
-// CHECK-NEXT:     CXXRecordDecl{{.*}} class TestClassTemplate\r
-// CHECK-NEXT:     AccessSpecDecl{{.*}} public\r
-// CHECK-NEXT:     CXXConstructorDecl{{.*}} <line:{{.*}}:5, col:23>\r
-// CHECK-NEXT:     CXXDestructorDecl{{.*}} <line:{{.*}}:5, col:24>\r
-// CHECK-NEXT:     CXXMethodDecl{{.*}} <line:{{.*}}:5, col:11>\r
-// CHECK-NEXT:     FieldDecl{{.*}} i\r
-// CHECK:        ClassTemplateSpecialization{{.*}} 'TestClassTemplate'\r
-// CHECK-NEXT:   ClassTemplateSpecialization{{.*}} 'TestClassTemplate'\r
-// CHECK-NEXT:   ClassTemplateSpecialization{{.*}} 'TestClassTemplate'\r
-\r
-// CHECK:      ClassTemplateSpecializationDecl{{.*}} class TestClassTemplate\r
-// CHECK-NEXT:   DefinitionData\r
-// CHECK:        TemplateArgument{{.*}}B\r
-// CHECK-NEXT:   CXXRecordDecl{{.*}} class TestClassTemplate\r
-// CHECK-NEXT:   FieldDecl{{.*}} j\r
-\r
-// CHECK:      ClassTemplateSpecializationDecl{{.*}} class TestClassTemplate\r
-// CHECK:        TemplateArgument{{.*}}C\r
-// CHECK-NEXT:   CXXRecordDecl{{.*}} class TestClassTemplate\r
-// CHECK-NEXT:   AccessSpecDecl{{.*}} public\r
-// CHECK-NEXT:   CXXConstructorDecl{{.*}} <line:{{.*}}:5, col:23>\r
-// CHECK-NEXT:   CXXDestructorDecl{{.*}} <line:{{.*}}:5, col:24>\r
-// CHECK-NEXT:   CXXMethodDecl{{.*}} <line:{{.*}}:5, col:11>\r
-// CHECK-NEXT:   FieldDecl{{.*}} i\r
-\r
-// CHECK:      ClassTemplateSpecializationDecl{{.*}} class TestClassTemplate\r
-// CHECK:        TemplateArgument{{.*}}D\r
-// CHECK-NEXT:   CXXRecordDecl{{.*}} class TestClassTemplate\r
-// CHECK-NEXT:   AccessSpecDecl{{.*}} public\r
-// CHECK-NEXT:   CXXConstructorDecl{{.*}} <line:{{.*}}:5, col:23>\r
-// CHECK-NEXT:   CXXDestructorDecl{{.*}} <line:{{.*}}:5, col:24>\r
-// CHECK-NEXT:   CXXMethodDecl{{.*}} <line:{{.*}}:5, col:11>\r
-// CHECK-NEXT:   FieldDecl{{.*}} i\r
-\r
-// CHECK:      ClassTemplatePartialSpecializationDecl{{.*}} class TestClassTemplatePartial\r
-// CHECK:        TemplateArgument\r
-// CHECK-NEXT:   TemplateArgument{{.*}}A\r
-// CHECK-NEXT:   TemplateTypeParmDecl\r
-// CHECK-NEXT:   CXXRecordDecl{{.*}} class TestClassTemplatePartial\r
-// CHECK-NEXT:   FieldDecl{{.*}} j\r
 \r
-// CHECK:      ClassTemplateDecl 0x{{[^ ]*}} prev 0x{{[^ ]*}} {{.*}} TestTemplateDefaultType\r
-// CHECK-NEXT:   TemplateTypeParmDecl\r
-// CHECK-NEXT:     TemplateArgument type 'int'\r
-// CHECK-NEXT:       inherited from TemplateTypeParm 0x{{[^ ]*}} 'T'\r
-\r
-// CHECK:      ClassTemplateDecl 0x{{[^ ]*}} prev 0x{{[^ ]*}} {{.*}} TestTemplateDefaultNonType\r
-// CHECK-NEXT:   NonTypeTemplateParmDecl\r
-// CHECK-NEXT:     TemplateArgument expr\r
-// CHECK-NEXT:       inherited from NonTypeTemplateParm 0x{{[^ ]*}} 'I' 'int'\r
-// CHECK-NEXT:       ConstantExpr\r
-// CHECK-NEXT:         IntegerLiteral\r
-\r
-// CHECK:      ClassTemplateDecl 0x{{[^ ]*}} prev 0x{{[^ ]*}} {{.*}} TestTemplateTemplateDefaultType\r
-// CHECK-NEXT:   TemplateTemplateParmDecl\r
-// CHECK-NEXT:     TemplateTypeParmDecl\r
-// CHECK-NEXT:     TemplateArgument\r
-// CHECK-NEXT:       inherited from TemplateTemplateParm 0x{{[^ ]*}} 'TT'\r
+// CHECK:       ClassTemplateDecl 0x{{.+}} <{{.+}}:[[@LINE-40]]:3, line:[[@LINE-34]]:3> line:[[@LINE-40]]:30 TestClassTemplate\r
+// CHECK-NEXT:  |-TemplateTypeParmDecl 0x{{.+}} <col:12, col:21> col:21 typename depth 0 index 0 T\r
+// CHECK-NEXT:  |-CXXRecordDecl 0x{{.+}} <col:24, line:[[@LINE-36]]:3> line:[[@LINE-42]]:30 class TestClassTemplate definition\r
+// CHECK-NEXT:  | |-DefinitionData standard_layout has_user_declared_ctor can_const_default_init\r
+// CHECK-NEXT:  | | |-DefaultConstructor exists non_trivial user_provided\r
+// CHECK-NEXT:  | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param\r
+// CHECK-NEXT:  | | |-MoveConstructor\r
+// CHECK-NEXT:  | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param\r
+// CHECK-NEXT:  | | |-MoveAssignment\r
+// CHECK-NEXT:  | | `-Destructor non_trivial user_declared\r
+// CHECK-NEXT:  | |-CXXRecordDecl 0x{{.+}} <col:24, col:30> col:30 implicit referenced class TestClassTemplate\r
+// CHECK-NEXT:  | |-AccessSpecDecl 0x{{.+}} <line:[[@LINE-50]]:3, col:9> col:3 public\r
+// CHECK-NEXT:  | |-CXXConstructorDecl 0x{{.+}} <line:[[@LINE-50]]:5, col:23> col:5 TestClassTemplate<T> 'void ()'\r
+// CHECK-NEXT:  | |-CXXDestructorDecl 0x{{.+}} <line:[[@LINE-50]]:5, col:24> col:5 ~TestClassTemplate<T> 'void ()'\r
+// CHECK-NEXT:  | |-CXXMethodDecl 0x{{.+}} <line:[[@LINE-50]]:5, col:11> col:9 j 'int ()'\r
+// CHECK-NEXT:  | `-FieldDecl 0x{{.+}} <line:[[@LINE-50]]:5, col:9> col:9 i 'int'\r
+// CHECK-NEXT:  |-ClassTemplateSpecializationDecl 0x{{.+}} <line:[[@LINE-56]]:3, line:[[@LINE-50]]:3> line:[[@LINE-56]]:30 class TestClassTemplate definition\r
+// CHECK-NEXT:  | |-DefinitionData standard_layout has_user_declared_ctor can_const_default_init\r
+// CHECK-NEXT:  | | |-DefaultConstructor exists non_trivial user_provided\r
+// CHECK-NEXT:  | | |-CopyConstructor simple trivial has_const_param implicit_has_const_param\r
+// CHECK-NEXT:  | | |-MoveConstructor\r
+// CHECK-NEXT:  | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param\r
+// CHECK-NEXT:  | | |-MoveAssignment\r
+// CHECK-NEXT:  | | `-Destructor non_trivial user_declared\r
+// CHECK-NEXT:  | |-TemplateArgument type 'testClassTemplateDecl::A'\r
+// CHECK-NEXT:  | |-CXXRecordDecl 0x{{.+}} prev 0x{{.+}} <col:24, col:30> col:30 implicit class TestClassTemplate\r
+// CHECK-NEXT:  | |-AccessSpecDecl 0x{{.+}} <line:[[@LINE-65]]:3, col:9> col:3 public\r
+// CHECK-NEXT:  | |-CXXConstructorDecl 0x{{.+}} <line:[[@LINE-65]]:5, col:23> col:5 used TestClassTemplate 'void ()'\r
+// CHECK-NEXT:  | |-CXXDestructorDecl 0x{{.+}} <line:[[@LINE-65]]:5, col:24> col:5 used ~TestClassTemplate 'void () noexcept'\r
+// CHECK-NEXT:  | |-CXXMethodDecl 0x{{.+}} <line:[[@LINE-65]]:5, col:11> col:9 j 'int ()'\r
+// CHECK-NEXT:  | |-FieldDecl 0x{{.+}} <line:[[@LINE-65]]:5, col:9> col:9 i 'int'\r
+// CHECK-NEXT:  | `-CXXConstructorDecl 0x{{.+}} <line:[[@LINE-71]]:30> col:30 implicit constexpr TestClassTemplate 'void (const testClassTemplateDecl::TestClassTemplate<testClassTemplateDecl::A> &)' inline default trivial noexcept-unevaluated 0x{{.+}}\r
+// CHECK-NEXT:  |   `-ParmVarDecl 0x{{.+}} <col:30> col:30 'const testClassTemplateDecl::TestClassTemplate<testClassTemplateDecl::A> &'\r
+// CHECK-NEXT:  |-ClassTemplateSpecialization 0x{{.+}} 'TestClassTemplate'\r
+// CHECK-NEXT:  |-ClassTemplateSpecialization 0x{{.+}} 'TestClassTemplate'\r
+// CHECK-NEXT:  `-ClassTemplateSpecialization 0x{{.+}} 'TestClassTemplate'\r
+\r
+// CHECK:       ClassTemplateSpecializationDecl 0x{{.+}} <{{.+}}:[[@LINE-65]]:3, line:[[@LINE-63]]:3> line:[[@LINE-65]]:20 class TestClassTemplate definition\r
+// CHECK-NEXT:  |-DefinitionData pass_in_registers standard_layout trivially_copyable trivial literal\r
+// CHECK-NEXT:  | |-DefaultConstructor exists trivial needs_implicit\r
+// CHECK-NEXT:  | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param\r
+// CHECK-NEXT:  | |-MoveConstructor exists simple trivial needs_implicit\r
+// CHECK-NEXT:  | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param\r
+// CHECK-NEXT:  | |-MoveAssignment exists simple trivial needs_implicit\r
+// CHECK-NEXT:  | `-Destructor simple irrelevant trivial needs_implicit\r
+// CHECK-NEXT:  |-TemplateArgument type 'testClassTemplateDecl::B'\r
+// CHECK-NEXT:  |-CXXRecordDecl 0x{{.+}} <col:14, col:20> col:20 implicit class TestClassTemplate\r
+// CHECK-NEXT:  `-FieldDecl 0x{{.+}} <line:[[@LINE-74]]:5, col:9> col:9 j 'int'\r
+\r
+// CHECK:       ClassTemplateSpecializationDecl 0x{{.+}} <{{.+}}:256:3, col:44> col:25 class TestClassTemplate definition\r
+// CHECK-NEXT:  |-DefinitionData standard_layout has_user_declared_ctor can_const_default_init\r
+// CHECK-NEXT:  | |-DefaultConstructor exists non_trivial user_provided\r
+// CHECK-NEXT:  | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param\r
+// CHECK-NEXT:  | |-MoveConstructor\r
+// CHECK-NEXT:  | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param\r
+// CHECK-NEXT:  | |-MoveAssignment\r
+// CHECK-NEXT:  | `-Destructor non_trivial user_declared\r
+// CHECK-NEXT:  |-TemplateArgument type 'testClassTemplateDecl::C'\r
+// CHECK-NEXT:  |-CXXRecordDecl 0x{{.+}} prev 0x{{.+}} <line:[[@LINE-98]]:24, col:30> col:30 implicit class TestClassTemplate\r
+// CHECK-NEXT:  |-AccessSpecDecl 0x{{.+}} <line:[[@LINE-98]]:3, col:9> col:3 public\r
+// CHECK-NEXT:  |-CXXConstructorDecl 0x{{.+}} <line:[[@LINE-98]]:5, col:23> col:5 TestClassTemplate 'void ()'\r
+// CHECK-NEXT:  |-CXXDestructorDecl 0x{{.+}} <line:[[@LINE-98]]:5, col:24> col:5 ~TestClassTemplate 'void ()' noexcept-unevaluated 0x{{.+}}\r
+// CHECK-NEXT:  |-CXXMethodDecl 0x{{.+}} <line:[[@LINE-98]]:5, col:11> col:9 j 'int ()'\r
+// CHECK-NEXT:  `-FieldDecl 0x{{.+}} <line:[[@LINE-98]]:5, col:9> col:9 i 'int'\r
+\r
+// CHECK:       ClassTemplateSpecializationDecl 0x{{.+}} <{{.+}}:[[@LINE-85]]:3, col:37> col:18 class TestClassTemplate definition\r
+// CHECK-NEXT:  |-DefinitionData standard_layout has_user_declared_ctor can_const_default_init\r
+// CHECK-NEXT:  | |-DefaultConstructor exists non_trivial user_provided\r
+// CHECK-NEXT:  | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param\r
+// CHECK-NEXT:  | |-MoveConstructor\r
+// CHECK-NEXT:  | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param\r
+// CHECK-NEXT:  | |-MoveAssignment\r
+// CHECK-NEXT:  | `-Destructor non_trivial user_declared\r
+// CHECK-NEXT:  |-TemplateArgument type 'testClassTemplateDecl::D'\r
+// CHECK-NEXT:  |-CXXRecordDecl 0x{{.+}} prev 0x{{.+}} <line:[[@LINE-114]]:24, col:30> col:30 implicit class TestClassTemplate\r
+// CHECK-NEXT:  |-AccessSpecDecl 0x{{.+}} <line:[[@LINE-114]]:3, col:9> col:3 public\r
+// CHECK-NEXT:  |-CXXConstructorDecl 0x{{.+}} <line:[[@LINE-114]]:5, col:23> col:5 TestClassTemplate 'void ()'\r
+// CHECK-NEXT:  |-CXXDestructorDecl 0x{{.+}} <line:[[@LINE-114]]:5, col:24> col:5 ~TestClassTemplate 'void ()' noexcept-unevaluated 0x{{.+}}\r
+// CHECK-NEXT:  |-CXXMethodDecl 0x{{.+}} <line:[[@LINE-114]]:5, col:11> col:9 j 'int ()'\r
+// CHECK-NEXT:  `-FieldDecl 0x{{.+}} <line:[[@LINE-114]]:5, col:9> col:9 i 'int'\r
+\r
+// CHECK:      ClassTemplateDecl 0x{{.+}} <{{.+}}:[[@LINE-98]]:3, line:[[@LINE-96]]:3> line:[[@LINE-98]]:44 TestClassTemplatePartial\r
+// CHECK-NEXT:  |-TemplateTypeParmDecl 0x{{.+}} <col:12, col:21> col:21 typename depth 0 index 0 T1\r
+// CHECK-NEXT:  |-TemplateTypeParmDecl 0x{{.+}} <col:25, col:34> col:34 typename depth 0 index 1 T2\r
+// CHECK-NEXT:  `-CXXRecordDecl 0x{{.+}} <col:38, line:[[@LINE-99]]:3> line:[[@LINE-101]]:44 class TestClassTemplatePartial definition\r
+// CHECK-NEXT:    |-DefinitionData standard_layout trivially_copyable trivial literal\r
+// CHECK-NEXT:    | |-DefaultConstructor exists trivial needs_implicit\r
+// CHECK-NEXT:    | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param\r
+// CHECK-NEXT:    | |-MoveConstructor exists simple trivial needs_implicit\r
+// CHECK-NEXT:    | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param\r
+// CHECK-NEXT:    | |-MoveAssignment exists simple trivial needs_implicit\r
+// CHECK-NEXT:    | `-Destructor simple irrelevant trivial needs_implicit\r
+// CHECK-NEXT:    |-CXXRecordDecl 0x{{.+}} <col:38, col:44> col:44 implicit class TestClassTemplatePartial\r
+// CHECK-NEXT:    `-FieldDecl 0x{{.+}} <line:[[@LINE-109]]:5, col:9> col:9 i 'int'\r
+\r
+// CHECK:       ClassTemplatePartialSpecializationDecl 0x{{.+}} <{{.+}}:[[@LINE-109]]:3, line:[[@LINE-107]]:3> line:[[@LINE-109]]:31 class TestClassTemplatePartial definition\r
+// CHECK-NEXT:  |-DefinitionData standard_layout trivially_copyable trivial literal\r
+// CHECK-NEXT:  | |-DefaultConstructor exists trivial needs_implicit\r
+// CHECK-NEXT:  | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param\r
+// CHECK-NEXT:  | |-MoveConstructor exists simple trivial needs_implicit\r
+// CHECK-NEXT:  | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param\r
+// CHECK-NEXT:  | |-MoveAssignment exists simple trivial needs_implicit\r
+// CHECK-NEXT:  | `-Destructor simple irrelevant trivial needs_implicit\r
+// CHECK-NEXT:  |-TemplateArgument type 'type-parameter-0-0'\r
+// CHECK-NEXT:  |-TemplateArgument type 'testClassTemplateDecl::A'\r
+// CHECK-NEXT:  |-TemplateTypeParmDecl 0x{{.+}} <col:12, col:21> col:21 referenced typename depth 0 index 0 T1\r
+// CHECK-NEXT:  |-CXXRecordDecl 0x{{.+}} <col:25, col:31> col:31 implicit class TestClassTemplatePartial\r
+// CHECK-NEXT:  `-FieldDecl 0x{{.+}} <line:[[@LINE-120]]:5, col:9> col:9 j 'int'\r
+\r
+// CHECK:       ClassTemplateDecl 0x{{.+}} <{{.+}}:[[@LINE-119]]:3, col:37> col:37 TestTemplateDefaultType\r
+// CHECK-NEXT:  |-TemplateTypeParmDecl 0x{{.+}} <col:12, col:25> col:21 typename depth 0 index 0 T\r
+// CHECK-NEXT:  | `-TemplateArgument type 'int'\r
+// CHECK-NEXT:  `-CXXRecordDecl 0x{{.+}} <col:30, col:37> col:37 struct TestTemplateDefaultType\r
+\r
+// CHECK:       ClassTemplateDecl 0x{{.+}} prev 0x{{.+}} <{{.+}}:[[@LINE-123]]:3, col:57> col:31 TestTemplateDefaultType\r
+// CHECK-NEXT:  |-TemplateTypeParmDecl 0x{{.+}} <col:12, col:21> col:21 typename depth 0 index 0 T\r
+// CHECK-NEXT:  | `-TemplateArgument type 'int'\r
+// CHECK-NEXT:  |   `-inherited from TemplateTypeParm 0x{{.+}} 'T'\r
+// CHECK-NEXT:  `-CXXRecordDecl 0x{{.+}} prev 0x{{.+}} <col:24, col:57> col:31 struct TestTemplateDefaultType definition\r
+// CHECK-NEXT:    |-DefinitionData empty aggregate standard_layout trivially_copyable pod trivial literal has_constexpr_non_copy_move_ctor can_const_default_init\r
+// CHECK-NEXT:    | |-DefaultConstructor exists trivial constexpr needs_implicit defaulted_is_constexpr\r
+// CHECK-NEXT:    | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param\r
+// CHECK-NEXT:    | |-MoveConstructor exists simple trivial needs_implicit\r
+// CHECK-NEXT:    | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param\r
+// CHECK-NEXT:    | |-MoveAssignment exists simple trivial needs_implicit\r
+// CHECK-NEXT:    | `-Destructor simple irrelevant trivial needs_implicit\r
+// CHECK-NEXT:    `-CXXRecordDecl 0x{{.+}} <col:24, col:31> col:31 implicit struct TestTemplateDefaultType\r
+\r
+// CHECK:       ClassTemplateDecl 0x{{.+}} <{{.+}}:[[@LINE-135]]:3, col:31> col:31 TestTemplateDefaultNonType\r
+// CHECK-NEXT:  |-NonTypeTemplateParmDecl 0x{{.+}} <col:12, col:20> col:16 'int' depth 0 index 0 I\r
+// CHECK-NEXT:  | `-TemplateArgument expr\r
+// CHECK-NEXT:  |   `-ConstantExpr 0x{{.+}} <col:20> 'int'\r
+// CHECK-NEXT:  |     `-IntegerLiteral 0x{{.+}} <col:20> 'int' 42\r
+// CHECK-NEXT:  `-CXXRecordDecl 0x{{.+}} <col:24, col:31> col:31 struct TestTemplateDefaultNonType\r
+\r
+// CHECK:       ClassTemplateDecl 0x{{.+}} <{{.+}}:275:3, col:68> col:68 TestTemplateTemplateDefaultType\r
+// CHECK-NEXT:  |-TemplateTemplateParmDecl 0x{{.+}} <col:12, col:42> col:37 depth 0 index 0 TT\r
+// CHECK-NEXT:  | |-TemplateTypeParmDecl 0x{{.+}} <col:21> col:21 typename depth 1 index 0\r
+// CHECK-NEXT:  | `-TemplateArgument <col:42> template TestClassTemplate\r
+// CHECK-NEXT:  `-CXXRecordDecl 0x{{.+}} <col:61, col:68> col:68 struct TestTemplateTemplateDefaultType\r
+\r
+// CHECK:       ClassTemplateDecl 0x{{.+}} prev 0x{{.+}} <{{.+}}:276:3, col:82> col:48 TestTemplateTemplateDefaultType\r
+// CHECK-NEXT:  |-TemplateTemplateParmDecl 0x{{.+}} <col:12, col:37> col:37 depth 0 index 0 TT\r
+// CHECK-NEXT:  | |-TemplateTypeParmDecl 0x{{.+}} <col:21> col:21 typename depth 1 index 0\r
+// CHECK-NEXT:  | `-TemplateArgument <line:275:42> template TestClassTemplate\r
+// CHECK-NEXT:  |   `-inherited from TemplateTemplateParm 0x{{.+}} 'TT'\r
+// CHECK-NEXT:  `-CXXRecordDecl 0x{{.+}} prev 0x{{.+}} <line:276:41, col:82> col:48 struct TestTemplateTemplateDefaultType definition\r
+// CHECK-NEXT:    |-DefinitionData empty aggregate standard_layout trivially_copyable pod trivial literal has_constexpr_non_copy_move_ctor can_const_default_init\r
+// CHECK-NEXT:    | |-DefaultConstructor exists trivial constexpr needs_implicit defaulted_is_constexpr\r
+// CHECK-NEXT:    | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param\r
+// CHECK-NEXT:    | |-MoveConstructor exists simple trivial needs_implicit\r
+// CHECK-NEXT:    | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param\r
+// CHECK-NEXT:    | |-MoveAssignment exists simple trivial needs_implicit\r
+// CHECK-NEXT:    | `-Destructor simple irrelevant trivial needs_implicit\r
+// CHECK-NEXT:    `-CXXRecordDecl 0x{{.+}} <col:41, col:48> col:48 implicit struct TestTemplateTemplateDefaultType\r
+\r
 \r
 // PR15220 dump instantiation only once\r
 namespace testCanonicalTemplate {\r
@@ -350,36 +440,141 @@ namespace testCanonicalTemplate {
   template<typename T> void TestFunctionTemplate(T);\r
   template<typename T> void TestFunctionTemplate(T);\r
   void bar(A a) { TestFunctionTemplate(a); }\r
-  // CHECK:      FunctionTemplateDecl{{.*}} TestFunctionTemplate\r
-  // CHECK-NEXT:   TemplateTypeParmDecl\r
-  // CHECK-NEXT:   FunctionDecl{{.*}} TestFunctionTemplate 'void (T)'\r
-  // CHECK-NEXT:     ParmVarDecl{{.*}} 'T'\r
-  // CHECK-NEXT:   FunctionDecl{{.*}} TestFunctionTemplate {{.*}}A\r
-  // CHECK-NEXT:     TemplateArgument\r
-  // CHECK-NEXT:     ParmVarDecl\r
-  // CHECK:      FunctionTemplateDecl{{.*}} TestFunctionTemplate\r
-  // CHECK-NEXT:   TemplateTypeParmDecl\r
-  // CHECK-NEXT:   FunctionDecl{{.*}} TestFunctionTemplate 'void (T)'\r
-  // CHECK-NEXT:     ParmVarDecl{{.*}} 'T'\r
-  // CHECK-NEXT:   Function{{.*}} 'TestFunctionTemplate'\r
+  // CHECK:      FunctionTemplateDecl 0x{{.+}} <{{.+}}:[[@LINE-3]]:3, col:51> col:29 TestFunctionTemplate\r
+  // CHECK-NEXT:   |-TemplateTypeParmDecl 0x{{.+}} <col:12, col:21> col:21 referenced typename depth 0 index 0 T\r
+  // CHECK-NEXT:   |-FunctionDecl 0x{{.*}} <col:24, col:51> col:29 TestFunctionTemplate 'void (T)'\r
+  // CHECK-NEXT:   | `-ParmVarDecl 0x{{.*}} <col:50> col:51 'T'\r
+  // CHECK-NEXT:   `-FunctionDecl 0x{{.*}} <line:[[@LINE-6]]:24, col:51> col:29 used TestFunctionTemplate 'void (testCanonicalTemplate::A)'\r
+  // CHECK-NEXT:     |-TemplateArgument type 'testCanonicalTemplate::A'\r
+  // CHECK-NEXT:     `-ParmVarDecl 0x{{.*}} <col:50> col:51 'testCanonicalTemplate::A':'testCanonicalTemplate::A'\r
+\r
+  // CHECK:      FunctionTemplateDecl 0x{{.+}} prev 0x{{.+}} <{{.+}}:[[@LINE-10]]:3, col:51> col:29 TestFunctionTemplate\r
+  // CHECK-NEXT:   |-TemplateTypeParmDecl 0x{{.+}} <col:12, col:21> col:21 referenced typename depth 0 index 0 T\r
+  // CHECK-NEXT:   |-FunctionDecl{{.*}} 0x{{.+}} prev 0x{{.+}} <col:24, col:51> col:29 TestFunctionTemplate 'void (T)'\r
+  // CHECK-NEXT:   | `-ParmVarDecl 0x{{.+}} <col:50> col:51 'T'\r
+  // CHECK-NEXT:   `-Function 0x{{.+}} 'TestFunctionTemplate' 'void (testCanonicalTemplate::A)'\r
   // CHECK-NOT:      TemplateArgument\r
 \r
   template<typename T1> class TestClassTemplate {\r
     template<typename T2> friend class TestClassTemplate;\r
   };\r
   TestClassTemplate<A> a;\r
-  // CHECK:      ClassTemplateDecl{{.*}} TestClassTemplate\r
-  // CHECK-NEXT:   TemplateTypeParmDecl\r
-  // CHECK-NEXT:   CXXRecordDecl{{.*}} class TestClassTemplate\r
-  // CHECK:          CXXRecordDecl{{.*}} class TestClassTemplate\r
-  // CHECK-NEXT:     FriendDecl\r
-  // CHECK-NEXT:       ClassTemplateDecl{{.*}} TestClassTemplate\r
-  // CHECK-NEXT:         TemplateTypeParmDecl\r
-  // CHECK-NEXT:         CXXRecordDecl{{.*}} class TestClassTemplate\r
-  // CHECK-NEXT:   ClassTemplateSpecializationDecl{{.*}} class TestClassTemplate\r
-  // CHECK:          TemplateArgument{{.*}}A\r
-  // CHECK-NEXT:     CXXRecordDecl{{.*}} class TestClassTemplate\r
-}\r
+  // CHECK:      ClassTemplateDecl 0x{{.+}} <{{.+}}:[[@LINE-4]]:3, line:[[@LINE-2]]:3> line:[[@LINE-4]]:31 TestClassTemplate\r
+  // CHECK-NEXT: |-TemplateTypeParmDecl 0x{{.+}} <col:12, col:21> col:21 typename depth 0 index 0 T1\r
+  // CHECK-NEXT: |-CXXRecordDecl 0x{{.+}} <col:25, line:[[@LINE-4]]:3> line:[[@LINE-6]]:31 class TestClassTemplate definition\r
+  // CHECK-NEXT: | |-DefinitionData empty aggregate standard_layout trivially_copyable pod trivial literal has_constexpr_non_copy_move_ctor can_const_default_init\r
+  // CHECK-NEXT: | | |-DefaultConstructor exists trivial constexpr needs_implicit defaulted_is_constexpr\r
+  // CHECK-NEXT: | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param\r
+  // CHECK-NEXT: | | |-MoveConstructor exists simple trivial needs_implicit\r
+  // CHECK-NEXT: | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param\r
+  // CHECK-NEXT: | | |-MoveAssignment exists simple trivial needs_implicit\r
+  // CHECK-NEXT: | | `-Destructor simple irrelevant trivial needs_implicit\r
+  // CHECK-NEXT: | |-CXXRecordDecl 0x{{.+}} <col:25, col:31> col:31 implicit class TestClassTemplate\r
+  // CHECK-NEXT: | `-FriendDecl 0x{{.+}} <line:[[@LINE-14]]:5, col:40> col:40\r
+  // CHECK-NEXT: |   `-ClassTemplateDecl 0x{{.+}} parent 0x{{.+}} <col:5, col:40> col:40 TestClassTemplate\r
+  // CHECK-NEXT: |     |-TemplateTypeParmDecl 0x{{.+}} <col:14, col:23> col:23 typename depth 1 index 0 T2\r
+  // CHECK-NEXT: |     `-CXXRecordDecl 0x{{.+}} parent 0x{{.+}} <col:34, col:40> col:40 class TestClassTemplate\r
+  // CHECK-NEXT: `-ClassTemplateSpecializationDecl 0x{{.+}} <line:[[@LINE-19]]:3, line:[[@LINE-17]]:3> line:[[@LINE-19]]:31 class TestClassTemplate definition\r
+  // 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\r
+  // CHECK-NEXT:   | |-DefaultConstructor exists trivial constexpr defaulted_is_constexpr\r
+  // CHECK-NEXT:   | |-CopyConstructor simple trivial has_const_param implicit_has_const_param\r
+  // CHECK-NEXT:   | |-MoveConstructor exists simple trivial\r
+  // CHECK-NEXT:   | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param\r
+  // CHECK-NEXT:   | |-MoveAssignment exists simple trivial needs_implicit\r
+  // CHECK-NEXT:   | `-Destructor simple irrelevant trivial needs_implicit\r
+  // CHECK-NEXT:   |-TemplateArgument type 'testCanonicalTemplate::A'\r
+  // CHECK-NEXT:   |-CXXRecordDecl 0x{{.+}} prev 0x{{.+}} <col:25, col:31> col:31 implicit class TestClassTemplate\r
+  // CHECK-NEXT:   |-FriendDecl 0x{{.+}} <line:[[@LINE-28]]:5, col:40> col:40\r
+  // CHECK-NEXT:   | `-ClassTemplateDecl 0x{{.+}} parent 0x{{.+}} prev 0x{{.+}} <col:5, col:40> col:40 TestClassTemplate\r
+  // CHECK-NEXT:   |   |-TemplateTypeParmDecl 0x{{.+}} <col:14, col:23> col:23 typename depth 0 index 0 T2\r
+  // CHECK-NEXT:   |   |-CXXRecordDecl 0x{{.+}} parent 0x{{.+}} prev 0x{{.+}} <col:34, col:40> col:40 class TestClassTemplate\r
+  // CHECK-NEXT:   |   `-ClassTemplateSpecialization 0x{{.+}} 'TestClassTemplate'\r
+  // CHECK-NEXT:   |-CXXConstructorDecl 0x{{.+}} <line:[[@LINE-34]]:31> col:31 implicit used constexpr TestClassTemplate 'void () noexcept' inline default trivial\r
+  // CHECK-NEXT:   | `-CompoundStmt 0x{{.+}} <col:31>\r
+  // CHECK-NEXT:   |-CXXConstructorDecl 0x{{.+}} <col:31> col:31 implicit constexpr TestClassTemplate 'void (const testCanonicalTemplate::TestClassTemplate<testCanonicalTemplate::A> &)' inline default trivial noexcept-unevaluated 0x{{.+}}\r
+  // CHECK-NEXT:   | `-ParmVarDecl 0x{{.+}} <col:31> col:31 'const testCanonicalTemplate::TestClassTemplate<testCanonicalTemplate::A> &'\r
+  // CHECK-NEXT:   `-CXXConstructorDecl 0x{{.+}} <col:31> col:31 implicit constexpr TestClassTemplate 'void (testCanonicalTemplate::TestClassTemplate<testCanonicalTemplate::A> &&)' inline default trivial noexcept-unevaluated 0x{{.+}}\r
+  // CHECK-NEXT:     `-ParmVarDecl 0x{{.+}} <col:31> col:31 'testCanonicalTemplate::TestClassTemplate<testCanonicalTemplate::A> &&'\r
+\r
+\r
+  template<typename T1> class TestClassTemplate2;\r
+  template<typename T1> class TestClassTemplate2;\r
+  template<typename T1> class TestClassTemplate2 {\r
+  };\r
+  TestClassTemplate2<A> a2;\r
+  // CHECK:      ClassTemplateDecl 0x{{.+}} <{{.+}}:[[@LINE-5]]:3, col:31> col:31 TestClassTemplate2\r
+  // CHECK-NEXT: |-TemplateTypeParmDecl 0x{{.+}} <col:12, col:21> col:21 typename depth 0 index 0 T1\r
+  // CHECK-NEXT: |-CXXRecordDecl 0x{{.+}} <col:25, col:31> col:31 class TestClassTemplate2\r
+  // CHECK-NEXT: `-ClassTemplateSpecializationDecl 0x{{.+}} <line:[[@LINE-6]]:3, line:[[@LINE-5]]:3> line:[[@LINE-6]]:31 class TestClassTemplate2 definition\r
+  // 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\r
+  // CHECK-NEXT:   | |-DefaultConstructor exists trivial constexpr defaulted_is_constexpr\r
+  // CHECK-NEXT:   | |-CopyConstructor simple trivial has_const_param implicit_has_const_param\r
+  // CHECK-NEXT:   | |-MoveConstructor exists simple trivial\r
+  // CHECK-NEXT:   | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param\r
+  // CHECK-NEXT:   | |-MoveAssignment exists simple trivial needs_implicit\r
+  // CHECK-NEXT:   | `-Destructor simple irrelevant trivial needs_implicit\r
+  // CHECK-NEXT:   |-TemplateArgument type 'testCanonicalTemplate::A'\r
+  // CHECK-NEXT:   |-CXXRecordDecl 0x{{.+}} prev 0x{{.+}} <col:25, col:31> col:31 implicit class TestClassTemplate2\r
+  // CHECK-NEXT:   |-CXXConstructorDecl 0x{{.+}} <col:31> col:31 implicit used constexpr TestClassTemplate2 'void () noexcept' inline default trivial\r
+  // CHECK-NEXT:   | `-CompoundStmt 0x{{.+}} <col:31>\r
+  // CHECK-NEXT:   |-CXXConstructorDecl 0x{{.+}} <col:31> col:31 implicit constexpr TestClassTemplate2 'void (const testCanonicalTemplate::TestClassTemplate2<testCanonicalTemplate::A> &)' inline default trivial noexcept-unevaluated 0x{{.+}}\r
+  // CHECK-NEXT:   | `-ParmVarDecl 0x{{.+}} <col:31> col:31 'const testCanonicalTemplate::TestClassTemplate2<testCanonicalTemplate::A> &'\r
+  // CHECK-NEXT:   `-CXXConstructorDecl 0x{{.+}} <col:31> col:31 implicit constexpr TestClassTemplate2 'void (testCanonicalTemplate::TestClassTemplate2<testCanonicalTemplate::A> &&)' inline default trivial noexcept-unevaluated 0x{{.+}}\r
+  // CHECK-NEXT:     `-ParmVarDecl 0x{{.+}} <col:31> col:31 'testCanonicalTemplate::TestClassTemplate2<testCanonicalTemplate::A> &&'\r
+\r
+  // CHECK:      ClassTemplateDecl 0x{{.+}} prev 0x{{.+}} <{{.+}}:[[@LINE-24]]:3, col:31> col:31 TestClassTemplate2\r
+  // CHECK-NEXT: |-TemplateTypeParmDecl 0x{{.+}} <col:12, col:21> col:21 typename depth 0 index 0 T1\r
+  // CHECK-NEXT: |-CXXRecordDecl 0x{{.+}} prev 0x{{.+}} <col:25, col:31> col:31 class TestClassTemplate2\r
+  // CHECK-NEXT: `-ClassTemplateSpecialization 0x{{.+}} 'TestClassTemplate2'\r
+\r
+  // CHECK:      ClassTemplateDecl 0x{{.+}} prev 0x{{.+}} <{{.+}}:[[@LINE-28]]:3, line:[[@LINE-27]]:3> line:[[@LINE-28]]:31 TestClassTemplate2\r
+  // CHECK-NEXT: |-TemplateTypeParmDecl 0x{{.+}} <col:12, col:21> col:21 typename depth 0 index 0 T1\r
+  // CHECK-NEXT: |-CXXRecordDecl 0x{{.+}} prev 0x{{.+}} <col:25, line:[[@LINE-29]]:3> line:[[@LINE-30]]:31 class TestClassTemplate2 definition\r
+  // CHECK-NEXT: | |-DefinitionData empty aggregate standard_layout trivially_copyable pod trivial literal has_constexpr_non_copy_move_ctor can_const_default_init\r
+  // CHECK-NEXT: | | |-DefaultConstructor exists trivial constexpr needs_implicit defaulted_is_constexpr\r
+  // CHECK-NEXT: | | |-CopyConstructor simple trivial has_const_param needs_implicit implicit_has_const_param\r
+  // CHECK-NEXT: | | |-MoveConstructor exists simple trivial needs_implicit\r
+  // CHECK-NEXT: | | |-CopyAssignment trivial has_const_param needs_implicit implicit_has_const_param\r
+  // CHECK-NEXT: | | |-MoveAssignment exists simple trivial needs_implicit\r
+  // CHECK-NEXT: | | `-Destructor simple irrelevant trivial needs_implicit\r
+  // CHECK-NEXT: | `-CXXRecordDecl 0x{{.+}} <col:25, col:31> col:31 implicit class TestClassTemplate2\r
+  // CHECK-NEXT: `-ClassTemplateSpecialization 0x{{.+}} 'TestClassTemplate2'\r
+\r
+  struct S {\r
+      template<typename T> static const T TestVarTemplate; // declaration of a static data member template\r
+  };\r
+  template<typename T>\r
+  const T S::TestVarTemplate = { }; // definition of a static data member template\r
+\r
+  void f()\r
+  {\r
+    int i = S::TestVarTemplate<int>;\r
+    int j = S::TestVarTemplate<int>;\r
+  }\r
+\r
+  // CHECK:      VarTemplateDecl 0x{{.+}} <{{.+}}:[[@LINE-11]]:7, col:43> col:43 TestVarTemplate\r
+  // CHECK-NEXT: |-TemplateTypeParmDecl 0x{{.+}} <col:16, col:25> col:25 referenced typename depth 0 index 0 T\r
+  // CHECK-NEXT: |-VarDecl 0x{{.+}} <col:28, col:43> col:43 TestVarTemplate 'const T' static\r
+  // CHECK-NEXT: |-VarTemplateSpecializationDecl 0x{{.+}} parent 0x{{.+}} prev 0x{{.+}} <line:[[@LINE-11]]:3, col:34> col:14 referenced TestVarTemplate 'const int':'const int' cinit\r
+  // CHECK-NEXT: | |-TemplateArgument type 'int'\r
+  // CHECK-NEXT: | `-InitListExpr 0x{{.+}} <col:32, col:34> 'int':'int'\r
+  // CHECK-NEXT: `-VarTemplateSpecializationDecl 0x{{.+}} <line:[[@LINE-17]]:28, col:43> col:43 referenced TestVarTemplate 'const int':'const int' static\r
+  // CHECK-NEXT:   `-TemplateArgument type 'int'\r
+\r
+  // CHECK:     VarTemplateSpecializationDecl 0x{{.+}} <{{.+}}:[[@LINE-20]]:28, col:43> col:43 referenced TestVarTemplate 'const int':'const int' static\r
+  // CHECK-NEXT:`-TemplateArgument type 'int'\r
+\r
+  // CHECK:      VarTemplateDecl 0x{{.+}} parent 0x{{.+}} prev 0x{{.+}} <{{.+}}:[[@LINE-21]]:3, line:[[@LINE-20]]:34> col:14 TestVarTemplate\r
+  // CHECK-NEXT: |-TemplateTypeParmDecl 0x{{.+}} <line:[[@LINE-22]]:12, col:21> col:21 referenced typename depth 0 index 0 T\r
+  // CHECK-NEXT: |-VarDecl 0x{{.+}} parent 0x{{.+}} prev 0x{{.+}} <line:[[@LINE-22]]:3, col:34> col:14 TestVarTemplate 'const T' cinit\r
+  // CHECK-NEXT: | `-InitListExpr 0x{{.+}} <col:32, col:34> 'void'\r
+  // CHECK-NEXT: |-VarTemplateSpecialization 0x{{.+}} 'TestVarTemplate' 'const int':'const int'\r
+  // CHECK-NEXT: `-VarTemplateSpecialization 0x{{.+}} 'TestVarTemplate' 'const int':'const int'\r
+    \r
+  // CHECK:      VarTemplateSpecializationDecl 0x{{.+}} parent 0x{{.+}} prev 0x{{.+}} <{{.+}}:[[@LINE-27]]:3, col:34> col:14 referenced TestVarTemplate 'const int':'const int' cinit\r
+  // CHECK-NEXT: |-TemplateArgument type 'int'\r
+  // CHECK-NEXT: `-InitListExpr 0x{{.+}} <col:32, col:34> 'int':'int'\r
+} \r
 \r
 template <class T>\r
 class TestClassScopeFunctionSpecialization {\r