[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