[clang] Fix scope of typedefs present inside a template class (PR #146729)
via cfe-commits
cfe-commits at lists.llvm.org
Wed Jul 16 11:18:27 PDT 2025
https://github.com/ykhatav updated https://github.com/llvm/llvm-project/pull/146729
>From 2add6774f7ca0ca37487b501195c66f66fe7db6d Mon Sep 17 00:00:00 2001
From: "Khatavkar, Yashasvi" <yashasvi.khatavkar at intel.com>
Date: Wed, 2 Jul 2025 08:23:14 -0700
Subject: [PATCH 1/4] Fix scoping of dependent typedefs
---
clang/lib/CodeGen/CGDebugInfo.cpp | 10 +++++++++-
.../dependent-template-type-scope.cpp | 18 ++++++++++++++++++
2 files changed, 27 insertions(+), 1 deletion(-)
create mode 100644 clang/test/CodeGenCXX/dependent-template-type-scope.cpp
diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp
index 75ee08a2bcfa6..5d343b214cbe7 100644
--- a/clang/lib/CodeGen/CGDebugInfo.cpp
+++ b/clang/lib/CodeGen/CGDebugInfo.cpp
@@ -4189,9 +4189,17 @@ llvm::DICompositeType *CGDebugInfo::CreateLimitedType(const RecordType *Ty) {
llvm::MDNode::replaceWithDistinct(llvm::TempDICompositeType(RealDecl));
break;
}
-
+ auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(Ty->getDecl());
+ if(CTSD) {
+ CXXRecordDecl *TemplateDecl =
+ CTSD->getSpecializedTemplate()->getTemplatedDecl();
+ RegionMap[TemplateDecl].reset(RealDecl);
+ TypeCache[QualType(Ty, 0).getAsOpaquePtr()].reset(RealDecl);
+ }
+ else {
RegionMap[Ty->getDecl()].reset(RealDecl);
TypeCache[QualType(Ty, 0).getAsOpaquePtr()].reset(RealDecl);
+}
if (const auto *TSpecial = dyn_cast<ClassTemplateSpecializationDecl>(RD))
DBuilder.replaceArrays(RealDecl, llvm::DINodeArray(),
diff --git a/clang/test/CodeGenCXX/dependent-template-type-scope.cpp b/clang/test/CodeGenCXX/dependent-template-type-scope.cpp
new file mode 100644
index 0000000000000..3b2e57b700936
--- /dev/null
+++ b/clang/test/CodeGenCXX/dependent-template-type-scope.cpp
@@ -0,0 +1,18 @@
+// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-llvm -debug-info-kind=standalone -o - %s | FileCheck %s
+
+struct X {
+ typedef int inside;
+ inside i;
+};
+
+template <typename T = int>
+struct Y {
+ typedef int outside;
+ outside o;
+};
+
+X x;
+Y<> y;
+
+// CHECK: ![[Y:.*]] = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "Y<int>", {{.*}}identifier: "_ZTS1YIiE")
+// CHECK: !DIDerivedType(tag: DW_TAG_typedef, name: "outside", scope: ![[Y]],
>From 032614189c12c959a9d04f464bb56a31348e27e2 Mon Sep 17 00:00:00 2001
From: "Khatavkar, Yashasvi" <yashasvi.khatavkar at intel.com>
Date: Wed, 2 Jul 2025 08:24:26 -0700
Subject: [PATCH 2/4] Apply clang-format
---
clang/lib/CodeGen/CGDebugInfo.cpp | 21 ++++++++++-----------
1 file changed, 10 insertions(+), 11 deletions(-)
diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp
index 5d343b214cbe7..ff43aad51f180 100644
--- a/clang/lib/CodeGen/CGDebugInfo.cpp
+++ b/clang/lib/CodeGen/CGDebugInfo.cpp
@@ -4189,17 +4189,16 @@ llvm::DICompositeType *CGDebugInfo::CreateLimitedType(const RecordType *Ty) {
llvm::MDNode::replaceWithDistinct(llvm::TempDICompositeType(RealDecl));
break;
}
- auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(Ty->getDecl());
- if(CTSD) {
- CXXRecordDecl *TemplateDecl =
- CTSD->getSpecializedTemplate()->getTemplatedDecl();
- RegionMap[TemplateDecl].reset(RealDecl);
- TypeCache[QualType(Ty, 0).getAsOpaquePtr()].reset(RealDecl);
- }
- else {
- RegionMap[Ty->getDecl()].reset(RealDecl);
- TypeCache[QualType(Ty, 0).getAsOpaquePtr()].reset(RealDecl);
-}
+ auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(Ty->getDecl());
+ if (CTSD) {
+ CXXRecordDecl *TemplateDecl =
+ CTSD->getSpecializedTemplate()->getTemplatedDecl();
+ RegionMap[TemplateDecl].reset(RealDecl);
+ TypeCache[QualType(Ty, 0).getAsOpaquePtr()].reset(RealDecl);
+ } else {
+ RegionMap[Ty->getDecl()].reset(RealDecl);
+ TypeCache[QualType(Ty, 0).getAsOpaquePtr()].reset(RealDecl);
+ }
if (const auto *TSpecial = dyn_cast<ClassTemplateSpecializationDecl>(RD))
DBuilder.replaceArrays(RealDecl, llvm::DINodeArray(),
>From a7657d98f46ffc8fa8d79f8ff60450fabedc53ed Mon Sep 17 00:00:00 2001
From: "Khatavkar, Yashasvi" <yashasvi.khatavkar at intel.com>
Date: Thu, 10 Jul 2025 06:28:49 -0700
Subject: [PATCH 3/4] address review comments
---
clang/lib/CodeGen/CGDebugInfo.cpp | 3 +--
clang/test/CodeGenCXX/dependent-template-type-scope.cpp | 6 ------
2 files changed, 1 insertion(+), 8 deletions(-)
diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp
index ff43aad51f180..9d69c67b1365e 100644
--- a/clang/lib/CodeGen/CGDebugInfo.cpp
+++ b/clang/lib/CodeGen/CGDebugInfo.cpp
@@ -4194,11 +4194,10 @@ llvm::DICompositeType *CGDebugInfo::CreateLimitedType(const RecordType *Ty) {
CXXRecordDecl *TemplateDecl =
CTSD->getSpecializedTemplate()->getTemplatedDecl();
RegionMap[TemplateDecl].reset(RealDecl);
- TypeCache[QualType(Ty, 0).getAsOpaquePtr()].reset(RealDecl);
} else {
RegionMap[Ty->getDecl()].reset(RealDecl);
- TypeCache[QualType(Ty, 0).getAsOpaquePtr()].reset(RealDecl);
}
+ TypeCache[QualType(Ty, 0).getAsOpaquePtr()].reset(RealDecl);
if (const auto *TSpecial = dyn_cast<ClassTemplateSpecializationDecl>(RD))
DBuilder.replaceArrays(RealDecl, llvm::DINodeArray(),
diff --git a/clang/test/CodeGenCXX/dependent-template-type-scope.cpp b/clang/test/CodeGenCXX/dependent-template-type-scope.cpp
index 3b2e57b700936..25a4d8741b01e 100644
--- a/clang/test/CodeGenCXX/dependent-template-type-scope.cpp
+++ b/clang/test/CodeGenCXX/dependent-template-type-scope.cpp
@@ -1,17 +1,11 @@
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-llvm -debug-info-kind=standalone -o - %s | FileCheck %s
-struct X {
- typedef int inside;
- inside i;
-};
-
template <typename T = int>
struct Y {
typedef int outside;
outside o;
};
-X x;
Y<> y;
// CHECK: ![[Y:.*]] = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "Y<int>", {{.*}}identifier: "_ZTS1YIiE")
>From acdb9e6e27ef8ace3c042613fa873e1ea4135aac Mon Sep 17 00:00:00 2001
From: "Khatavkar, Yashasvi" <yashasvi.khatavkar at intel.com>
Date: Wed, 16 Jul 2025 10:44:34 -0700
Subject: [PATCH 4/4] Address review comments
---
clang/docs/ReleaseNotes.rst | 1 +
clang/lib/CodeGen/CGDebugInfo.cpp | 3 +--
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index fcd3887ec7a09..1c69521eddb62 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -808,6 +808,7 @@ Bug Fixes in This Version
nested scopes. (#GH147495)
- Fixed a failed assertion with an operator call expression which comes from a
macro expansion when performing analysis for nullability attributes. (#GH138371)
+- Fixed scope of typedefs present inside a template class. (#GH91451)
Bug Fixes to Compiler Builtins
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp
index 9d69c67b1365e..f43dc196b7c46 100644
--- a/clang/lib/CodeGen/CGDebugInfo.cpp
+++ b/clang/lib/CodeGen/CGDebugInfo.cpp
@@ -4189,8 +4189,7 @@ llvm::DICompositeType *CGDebugInfo::CreateLimitedType(const RecordType *Ty) {
llvm::MDNode::replaceWithDistinct(llvm::TempDICompositeType(RealDecl));
break;
}
- auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(Ty->getDecl());
- if (CTSD) {
+ if (auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(Ty->getDecl())) {
CXXRecordDecl *TemplateDecl =
CTSD->getSpecializedTemplate()->getTemplatedDecl();
RegionMap[TemplateDecl].reset(RealDecl);
More information about the cfe-commits
mailing list