[clang] [clang-tools-extra] [clang][AST] Fix source range of class template implicit instantiations. (PR #156011)
Fred Tingaud via cfe-commits
cfe-commits at lists.llvm.org
Fri Aug 29 11:21:20 PDT 2025
https://github.com/frederic-tingaud-sonarsource updated https://github.com/llvm/llvm-project/pull/156011
>From e4389f14d926afccc4214de52ee14573b2ac38b0 Mon Sep 17 00:00:00 2001
From: Fred Tingaud <frederic.tingaud at sonarsource.com>
Date: Mon, 25 Aug 2025 20:07:04 +0200
Subject: [PATCH] [clang][AST] Fix source range of class template implicit
instantiations.
---
.../checkers/hicpp/exception-baseclass.cpp | 4 +-
clang/lib/AST/DeclTemplate.cpp | 7 +-
clang/test/AST/ast-dump-decl.cpp | 8 +-
...penmp-begin-declare-variant_template_3.cpp | 4 +-
.../test/AST/ast-dump-template-decls-json.cpp | 4 +-
clang/test/AST/ast-dump-template-redecl.cpp | 88 +++++++++++++++++++
.../ParserHLSL/hlsl_resource_class_attr.hlsl | 2 +-
7 files changed, 105 insertions(+), 12 deletions(-)
create mode 100644 clang/test/AST/ast-dump-template-redecl.cpp
diff --git a/clang-tools-extra/test/clang-tidy/checkers/hicpp/exception-baseclass.cpp b/clang-tools-extra/test/clang-tidy/checkers/hicpp/exception-baseclass.cpp
index b5e405a691848..bd54cb5174db9 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/hicpp/exception-baseclass.cpp
+++ b/clang-tools-extra/test/clang-tidy/checkers/hicpp/exception-baseclass.cpp
@@ -113,11 +113,11 @@ void ThrowException() { throw T(); }
// CHECK-NOTES: [[@LINE-5]]:31: warning: throwing an exception whose type 'bad_generic_exception<std::exception>' is not derived from 'std::exception'
// CHECK-NOTES: [[@LINE-6]]:31: note: type 'bad_generic_exception<std::exception>' is a template instantiation of 'T'
-// CHECK-NOTES: [[@LINE+21]]:1: note: type defined here
+// CHECK-NOTES: [[@LINE+22]]:1: note: type defined here
// CHECK-NOTES: [[@LINE-9]]:31: warning: throwing an exception whose type 'exotic_exception<non_derived_exception>' is not derived from 'std::exception'
// CHECK-NOTES: [[@LINE-10]]:31: note: type 'exotic_exception<non_derived_exception>' is a template instantiation of 'T'
-// CHECK-NOTES: [[@LINE+20]]:1: note: type defined here
+// CHECK-NOTES: [[@LINE+21]]:1: note: type defined here
// CHECK-NOTES: [[@LINE-13]]:31: warning: throwing an exception whose type 'int' is not derived from 'std::exception'
// CHECK-NOTES: [[@LINE-14]]:31: note: type 'int' is a template instantiation of 'T'
diff --git a/clang/lib/AST/DeclTemplate.cpp b/clang/lib/AST/DeclTemplate.cpp
index 3162857aac5d0..01cc33b795308 100644
--- a/clang/lib/AST/DeclTemplate.cpp
+++ b/clang/lib/AST/DeclTemplate.cpp
@@ -1050,7 +1050,12 @@ ClassTemplateSpecializationDecl::getSourceRange() const {
if (const auto *CTPSD =
dyn_cast<ClassTemplatePartialSpecializationDecl *>(Pattern))
return CTPSD->getSourceRange();
- return cast<ClassTemplateDecl *>(Pattern)->getSourceRange();
+
+ const auto *CTD = cast<ClassTemplateDecl *>(Pattern);
+ if (CTD->getTemplatedDecl()->hasDefinition())
+ return CTD->getTemplatedDecl()->getDefinition()->getSourceRange();
+
+ return CTD->getSourceRange();
}
case TSK_ExplicitSpecialization: {
SourceRange Range = CXXRecordDecl::getSourceRange();
diff --git a/clang/test/AST/ast-dump-decl.cpp b/clang/test/AST/ast-dump-decl.cpp
index afb507833d869..54723b01d5a95 100644
--- a/clang/test/AST/ast-dump-decl.cpp
+++ b/clang/test/AST/ast-dump-decl.cpp
@@ -334,7 +334,7 @@ namespace testClassTemplateDecl {
// CHECK-NEXT: | |-CXXDestructorDecl 0x[[#%x,TEMPLATE_DESTRUCTOR_DECL:]] <line:[[@LINE-50]]:5, col:24> col:5 ~TestClassTemplate<T> 'void ()' not_selected{{$}}
// CHECK-NEXT: | |-CXXMethodDecl 0x[[#%x,TEMPLATE_METHOD_DECL:]] <line:[[@LINE-50]]:5, col:11> col:9 j 'int ()'{{$}}
// CHECK-NEXT: | `-FieldDecl 0x{{.+}} <line:[[@LINE-50]]:5, col:9> col:9 i 'int'{{$}}
-// CHECK-NEXT: |-ClassTemplateSpecializationDecl 0x{{.+}} <line:[[@LINE-56]]:3, line:[[@LINE-50]]:3> line:[[@LINE-56]]:30 class TestClassTemplate definition implicit_instantiation{{$}}
+// CHECK-NEXT: |-ClassTemplateSpecializationDecl 0x{{.+}} <line:[[@LINE-56]]:24, line:[[@LINE-50]]:3> 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{{$}}
@@ -518,7 +518,7 @@ namespace testClassTemplateDecl {
// CHECK-NEXT: | |-EnumDecl 0x[[#%x,SCOPED_MEMBER_ENUM_E3:]] <line:[[@LINE-22]]:5, col:21> col:16 class E3 'T'
// CHECK-NEXT: | `-EnumDecl 0x[[#%x,SCOPED_MEMBER_ENUM_E4:]] <line:[[@LINE-22]]:5, col:21> col:16 class E4 'int'
// CHECK-NEXT: |-ClassTemplateSpecialization 0x{{.+}} 'TestClassTemplateWithScopedMemberEnum'
-// CHECK-NEXT: `-ClassTemplateSpecializationDecl 0x{{.+}} <line:[[@LINE-28]]:3, line:[[@LINE-23]]:3> line:[[@LINE-28]]:31 struct TestClassTemplateWithScopedMemberEnum definition implicit_instantiation
+// CHECK-NEXT: `-ClassTemplateSpecializationDecl 0x{{.+}} <line:[[@LINE-28]]:24, line:[[@LINE-23]]:3> line:[[@LINE-28]]:31 struct TestClassTemplateWithScopedMemberEnum definition implicit_instantiation
// CHECK: |-TemplateArgument type 'int'
// CHECK-NEXT: | `-BuiltinType 0x{{.+}} 'int'
// CHECK: |-EnumDecl 0x{{.+}} <line:[[@LINE-30]]:5, col:21> col:16 class E1 'int' instantiated_from 0x[[#SCOPED_MEMBER_ENUM_E1]]{{$}}
@@ -635,7 +635,7 @@ namespace testCanonicalTemplate {
// CHECK-NEXT: | `-ClassTemplateDecl 0x{{.+}} parent 0x{{.+}} <col:5, col:40> col:40 friend_undeclared TestClassTemplate{{$}}
// CHECK-NEXT: | |-TemplateTypeParmDecl 0x{{.+}} <col:14, col:23> col:23 typename depth 1 index 0 T2{{$}}
// CHECK-NEXT: | `-CXXRecordDecl 0x{{.+}} parent 0x{{.+}} <col:34, col:40> col:40 class TestClassTemplate{{$}}
- // CHECK-NEXT: `-ClassTemplateSpecializationDecl 0x{{.+}} <line:[[@LINE-19]]:3, line:[[@LINE-17]]:3> line:[[@LINE-19]]:31 class TestClassTemplate definition implicit_instantiation{{$}}
+ // CHECK-NEXT: `-ClassTemplateSpecializationDecl 0x{{.+}} <line:[[@LINE-19]]:25, line:[[@LINE-17]]:3> 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{{$}}
@@ -668,7 +668,7 @@ namespace testCanonicalTemplate {
// CHECK: ClassTemplateDecl 0x{{.+}} <{{.+}}:[[@LINE-5]]:3, col:31> col:31 TestClassTemplate2{{$}}
// CHECK-NEXT: |-TemplateTypeParmDecl 0x{{.+}} <col:12, col:21> col:21 typename depth 0 index 0 T1{{$}}
// CHECK-NEXT: |-CXXRecordDecl 0x{{.+}} <col:25, col:31> col:31 class TestClassTemplate2{{$}}
- // CHECK-NEXT: `-ClassTemplateSpecializationDecl 0x{{.+}} <line:[[@LINE-6]]:3, line:[[@LINE-5]]:3> line:[[@LINE-6]]:31 class TestClassTemplate2 definition implicit_instantiation{{$}}
+ // CHECK-NEXT: `-ClassTemplateSpecializationDecl 0x{{.+}} <line:[[@LINE-6]]:25, line:[[@LINE-5]]:3> 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{{$}}
diff --git a/clang/test/AST/ast-dump-openmp-begin-declare-variant_template_3.cpp b/clang/test/AST/ast-dump-openmp-begin-declare-variant_template_3.cpp
index 44d1cb462cd58..779dfec42ea8e 100644
--- a/clang/test/AST/ast-dump-openmp-begin-declare-variant_template_3.cpp
+++ b/clang/test/AST/ast-dump-openmp-begin-declare-variant_template_3.cpp
@@ -59,7 +59,7 @@ int test() {
// CHECK-NEXT: | | |-ParmVarDecl [[ADDR_5:0x[a-z0-9]*]] <col:5> col:8 'int'
// CHECK-NEXT: | | |-ParmVarDecl [[ADDR_6:0x[a-z0-9]*]] <col:10, col:12> col:13 'T *'
// CHECK-NEXT: | | `-CompoundStmt [[ADDR_7:0x[a-z0-9]*]] <col:15, col:16>
-// CHECK-NEXT: | |-ClassTemplateSpecializationDecl [[ADDR_8:0x[a-z0-9]*]] <line:5:1, line:7:1> line:5:30 struct S definition
+// CHECK-NEXT: | |-ClassTemplateSpecializationDecl [[ADDR_8:0x[a-z0-9]*]] <line:5:23, line:7:1> line:5:30 struct S definition
// CHECK-NEXT: | | |-DefinitionData pass_in_registers empty standard_layout trivially_copyable has_user_declared_ctor can_const_default_init
// CHECK-NEXT: | | | |-DefaultConstructor defaulted_is_constexpr
// CHECK-NEXT: | | | |-CopyConstructor simple trivial has_const_param implicit_has_const_param
@@ -82,7 +82,7 @@ int test() {
// CXX17-NEXT: | | |-CXXConstructorDecl [[ADDR_16:0x[a-z0-9]*]] <col:30> col:30 implicit constexpr S 'void (S<int> &&)' inline default trivial noexcept-unevaluated
// CXX17-NEXT: | | | `-ParmVarDecl [[ADDR_17:0x[a-z0-9]*]] <col:30> col:30 'S<int> &&'
// CHECK-NEXT: | | `-CXXDestructorDecl [[ADDR_19:0x[a-z0-9]*]] <col:30> col:30 implicit referenced {{(constexpr )?}}~S 'void ({{.*}}) noexcept' inline default trivial
-// CHECK-NEXT: | `-ClassTemplateSpecializationDecl [[ADDR_20:0x[a-z0-9]*]] <col:1, line:7:1> line:5:30 struct S
+// CHECK-NEXT: | `-ClassTemplateSpecializationDecl [[ADDR_20:0x[a-z0-9]*]] <col:23, line:7:1> line:5:30 struct S
// CHECK-NEXT: | `-TemplateArgument type 'double'
// CHECK-NEXT: | `-BuiltinType [[ADDR_21:0x[a-z0-9]*]] 'double'
// CHECK-NEXT: |-FunctionTemplateDecl [[ADDR_22:0x[a-z0-9]*]] <line:9:1, line:12:1> line:10:5 also_before
diff --git a/clang/test/AST/ast-dump-template-decls-json.cpp b/clang/test/AST/ast-dump-template-decls-json.cpp
index 70f1d3b55f3ee..240469955f4b6 100644
--- a/clang/test/AST/ast-dump-template-decls-json.cpp
+++ b/clang/test/AST/ast-dump-template-decls-json.cpp
@@ -2872,8 +2872,8 @@ W(int)->W<1>;
// CHECK-NEXT: "range": {
// CHECK-NEXT: "begin": {
// CHECK-NEXT: "offset": {{[0-9]+}},
-// CHECK-NEXT: "col": 1,
-// CHECK-NEXT: "tokLen": 8
+// CHECK-NEXT: "col": 18,
+// CHECK-NEXT: "tokLen": 5
// CHECK-NEXT: },
// CHECK-NEXT: "end": {
// CHECK-NEXT: "offset": {{[0-9]+}},
diff --git a/clang/test/AST/ast-dump-template-redecl.cpp b/clang/test/AST/ast-dump-template-redecl.cpp
new file mode 100644
index 0000000000000..a883375c1630b
--- /dev/null
+++ b/clang/test/AST/ast-dump-template-redecl.cpp
@@ -0,0 +1,88 @@
+// RUN: %clang_cc1 -triple x86_64-unknown-unknown -fopenmp -verify -ast-dump %s %std_cxx17- | FileCheck %s --check-prefixes=CHECK
+// expected-no-diagnostics
+
+template <class T>
+struct Redeclared {
+ void function() {}
+};
+
+template <class T>
+struct Redeclared;
+
+Redeclared<int> instantiation;
+
+template <typename T>
+void redeclaredFunction(T t) {
+ (void)t;
+}
+
+template <typename T>
+void redeclaredFunction(T t);
+
+void instantiate() {
+ redeclaredFunction(0);
+}
+
+
+// CHECK: |-ClassTemplateDecl [[ADDR_0:0x[a-z0-9]*]] <{{.*}}:4:1, line:7:1> line:5:8 Redeclared
+// CHECK-NEXT: | |-TemplateTypeParmDecl [[ADDR_1:0x[a-z0-9]*]] <line:4:11, col:17> col:17 class depth 0 index 0 T
+// CHECK-NEXT: | |-CXXRecordDecl [[ADDR_2:0x[a-z0-9]*]] <line:5:1, line:7:1> line:5:8 struct Redeclared 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 {{(constexpr )?}}needs_implicit
+// CHECK-NEXT: | | |-CXXRecordDecl [[ADDR_3:0x[a-z0-9]*]] <col:1, col:8> col:8 implicit struct Redeclared
+// CHECK-NEXT: | | `-CXXMethodDecl [[ADDR_4:0x[a-z0-9]*]] <line:6:3, col:20> col:8 function 'void ()' implicit-inline
+// CHECK-NEXT: | | `-CompoundStmt [[ADDR_5:0x[a-z0-9]*]] <col:19, col:20>
+// CHECK-NEXT: | `-ClassTemplateSpecializationDecl [[ADDR_6:0x[a-z0-9]*]] <line:5:1, line:7:1> line:5:8 struct Redeclared 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 constexpr needs_implicit
+// CHECK-NEXT: | |-TemplateArgument type 'int'
+// CHECK-NEXT: | | `-BuiltinType [[ADDR_7:0x[a-z0-9]*]] 'int'
+// CHECK-NEXT: | |-CXXRecordDecl [[ADDR_8:0x[a-z0-9]*]] <col:1, col:8> col:8 implicit struct Redeclared
+// CHECK-NEXT: | |-CXXMethodDecl [[ADDR_9:0x[a-z0-9]*]] <line:6:3, col:20> col:8 function 'void ()' implicit_instantiation implicit-inline instantiated_from [[ADDR_4]]
+// CHECK-NEXT: | |-CXXConstructorDecl [[ADDR_10:0x[a-z0-9]*]] <line:5:8> col:8 implicit used constexpr Redeclared 'void () noexcept' inline default trivial
+// CHECK-NEXT: | | `-CompoundStmt [[ADDR_11:0x[a-z0-9]*]] <col:8>
+// CHECK-NEXT: | |-CXXConstructorDecl [[ADDR_12:0x[a-z0-9]*]] <col:8> col:8 implicit constexpr Redeclared 'void (const Redeclared<int> &)' inline default trivial noexcept-unevaluated [[ADDR_12]]
+// CHECK-NEXT: | | `-ParmVarDecl [[ADDR_13:0x[a-z0-9]*]] <col:8> col:8 'const Redeclared<int> &'
+// CHECK-NEXT: | `-CXXConstructorDecl [[ADDR_14:0x[a-z0-9]*]] <col:8> col:8 implicit constexpr Redeclared 'void (Redeclared<int> &&)' inline default trivial noexcept-unevaluated [[ADDR_14]]
+// CHECK-NEXT: | `-ParmVarDecl [[ADDR_15:0x[a-z0-9]*]] <col:8> col:8 'Redeclared<int> &&'
+// CHECK-NEXT: |-ClassTemplateDecl [[ADDR_16:0x[a-z0-9]*]] prev [[ADDR_0]] <line:9:1, line:10:8> col:8 Redeclared
+// CHECK-NEXT: | |-TemplateTypeParmDecl [[ADDR_17:0x[a-z0-9]*]] <line:9:11, col:17> col:17 class depth 0 index 0 T
+// CHECK-NEXT: | |-CXXRecordDecl [[ADDR_18:0x[a-z0-9]*]] prev [[ADDR_2]] <line:10:1, col:8> col:8 struct Redeclared
+// CHECK-NEXT: | `-ClassTemplateSpecialization [[ADDR_19:0x[a-z0-9]*]] 'Redeclared'
+// CHECK-NEXT: |-VarDecl [[ADDR_20:0x[a-z0-9]*]] <line:12:1, col:17> col:17 instantiation 'Redeclared<int>' callinit
+// CHECK-NEXT: | `-CXXConstructExpr [[ADDR_21:0x[a-z0-9]*]] <col:17> 'Redeclared<int>' 'void () noexcept'
+// CHECK-NEXT: |-FunctionTemplateDecl [[ADDR_22:0x[a-z0-9]*]] <line:14:1, line:17:1> line:15:6 redeclaredFunction
+// CHECK-NEXT: | |-TemplateTypeParmDecl [[ADDR_23:0x[a-z0-9]*]] <line:14:11, col:20> col:20 referenced typename depth 0 index 0 T
+// CHECK-NEXT: | |-FunctionDecl [[ADDR_24:0x[a-z0-9]*]] <line:15:1, line:17:1> line:15:6 redeclaredFunction 'void (T)'
+// CHECK-NEXT: | | |-ParmVarDecl [[ADDR_25:0x[a-z0-9]*]] <col:25, col:27> col:27 referenced t 'T'
+// CHECK-NEXT: | | `-CompoundStmt [[ADDR_26:0x[a-z0-9]*]] <col:30, line:17:1>
+// CHECK-NEXT: | | `-CStyleCastExpr [[ADDR_27:0x[a-z0-9]*]] <line:16:3, col:9> 'void' <ToVoid>
+// CHECK-NEXT: | | `-DeclRefExpr [[ADDR_28:0x[a-z0-9]*]] <col:9> 'T' lvalue ParmVar [[ADDR_25]] 't' 'T'
+// CHECK-NEXT: | `-FunctionDecl [[ADDR_29:0x[a-z0-9]*]] <line:15:1, line:17:1> line:15:6 used redeclaredFunction 'void (int)' implicit_instantiation
+// CHECK-NEXT: | |-TemplateArgument type 'int'
+// CHECK-NEXT: | | `-BuiltinType [[ADDR_30:0x[a-z0-9]*]] 'int'
+// CHECK-NEXT: | |-ParmVarDecl [[ADDR_31:0x[a-z0-9]*]] <line:20:25, col:27> col:27 used t 'int'
+// CHECK-NEXT: | `-CompoundStmt [[ADDR_32:0x[a-z0-9]*]] <line:15:30, line:17:1>
+// CHECK-NEXT: | `-CStyleCastExpr [[ADDR_33:0x[a-z0-9]*]] <line:16:3, col:9> 'void' <ToVoid>
+// CHECK-NEXT: | `-DeclRefExpr [[ADDR_34:0x[a-z0-9]*]] <col:9> 'int' lvalue ParmVar [[ADDR_31]] 't' 'int'
+// CHECK-NEXT: |-FunctionTemplateDecl [[ADDR_35:0x[a-z0-9]*]] prev [[ADDR_22]] <line:19:1, line:20:28> col:6 redeclaredFunction
+// CHECK-NEXT: | |-TemplateTypeParmDecl [[ADDR_36:0x[a-z0-9]*]] <line:19:11, col:20> col:20 referenced typename depth 0 index 0 T
+// CHECK-NEXT: | |-FunctionDecl [[ADDR_37:0x[a-z0-9]*]] prev [[ADDR_24]] <line:20:1, col:28> col:6 redeclaredFunction 'void (T)'
+// CHECK-NEXT: | | `-ParmVarDecl [[ADDR_38:0x[a-z0-9]*]] <col:25, col:27> col:27 t 'T'
+// CHECK-NEXT: | `-Function [[ADDR_39:0x[a-z0-9]*]] 'redeclaredFunction' 'void (int)'
+// CHECK-NEXT: `-FunctionDecl [[ADDR_40:0x[a-z0-9]*]] <line:22:1, line:24:1> line:22:6 instantiate 'void ()'
+// CHECK-NEXT: `-CompoundStmt [[ADDR_41:0x[a-z0-9]*]] <col:20, line:24:1>
+// CHECK-NEXT: `-CallExpr [[ADDR_42:0x[a-z0-9]*]] <line:23:3, col:23> 'void'
+// CHECK-NEXT: |-ImplicitCastExpr [[ADDR_43:0x[a-z0-9]*]] <col:3> 'void (*)(int)' <FunctionToPointerDecay>
+// CHECK-NEXT: | `-DeclRefExpr [[ADDR_44:0x[a-z0-9]*]] <col:3> 'void (int)' lvalue Function [[ADDR_29]] 'redeclaredFunction' 'void (int)' (FunctionTemplate [[ADDR_35]] 'redeclaredFunction')
+// CHECK-NEXT: `-IntegerLiteral [[ADDR_45:0x[a-z0-9]*]] <col:22> 'int' 0
diff --git a/clang/test/ParserHLSL/hlsl_resource_class_attr.hlsl b/clang/test/ParserHLSL/hlsl_resource_class_attr.hlsl
index fbada8b4b99f7..6ceaf8fae102e 100644
--- a/clang/test/ParserHLSL/hlsl_resource_class_attr.hlsl
+++ b/clang/test/ParserHLSL/hlsl_resource_class_attr.hlsl
@@ -28,7 +28,7 @@ template<typename T> struct MyBuffer2 {
__hlsl_resource_t [[hlsl::resource_class(UAV)]] h;
};
-// CHECK: ClassTemplateSpecializationDecl 0x{{[0-9a-f]+}} <line:[[# @LINE - 4]]:1, line:[[# @LINE - 2]]:1> line:[[# @LINE - 4]]:29 struct MyBuffer2 definition implicit_instantiation
+// CHECK: ClassTemplateSpecializationDecl 0x{{[0-9a-f]+}} <line:[[# @LINE - 4]]:22, line:[[# @LINE - 2]]:1> line:[[# @LINE - 4]]:29 struct MyBuffer2 definition implicit_instantiation
// CHECK: TemplateArgument type 'float'
// CHECK: BuiltinType 0x{{[0-9a-f]+}} 'float'
// CHECK: CXXRecordDecl 0x{{[0-9a-f]+}} <col:22, col:29> col:29 implicit struct MyBuffer2
More information about the cfe-commits
mailing list