[clang] Fix scope of typedefs present inside a template class (PR #146729)
via cfe-commits
cfe-commits at lists.llvm.org
Thu Aug 21 10:52:18 PDT 2025
https://github.com/ykhatav updated https://github.com/llvm/llvm-project/pull/146729
>From 29dd71a91958e8de7ee811838994fa664afe75d1 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 01/11] Fix scoping of dependent typedefs
---
clang/lib/CodeGen/CGDebugInfo.cpp | 12 ++++++++++--
.../dependent-template-type-scope.cpp | 18 ++++++++++++++++++
2 files changed, 28 insertions(+), 2 deletions(-)
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 994bdbdae860f..1ee6f52efda6a 100644
--- a/clang/lib/CodeGen/CGDebugInfo.cpp
+++ b/clang/lib/CodeGen/CGDebugInfo.cpp
@@ -4183,9 +4183,17 @@ llvm::DICompositeType *CGDebugInfo::CreateLimitedType(const RecordType *Ty) {
llvm::MDNode::replaceWithDistinct(llvm::TempDICompositeType(RealDecl));
break;
}
-
- RegionMap[RD].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(),
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 12e9adf8c8a98b02ec8e5a58f682832d132ddfc0 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 02/11] 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 1ee6f52efda6a..d9b5935f7bb7c 100644
--- a/clang/lib/CodeGen/CGDebugInfo.cpp
+++ b/clang/lib/CodeGen/CGDebugInfo.cpp
@@ -4183,17 +4183,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 7e3dfe0cc9d954733f01be22f779c7583521b4a1 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 03/11] 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 d9b5935f7bb7c..1dc12d705b2cf 100644
--- a/clang/lib/CodeGen/CGDebugInfo.cpp
+++ b/clang/lib/CodeGen/CGDebugInfo.cpp
@@ -4188,11 +4188,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 5b88f9d72edf4ab205adcc832b19acbb5555e75d 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 04/11] Address review comments
---
clang/docs/ReleaseNotes.rst | 3 +++
clang/lib/CodeGen/CGDebugInfo.cpp | 3 +--
2 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index fe1dd15c6f885..c9dbb6cfe4a83 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -220,6 +220,7 @@ Improvements to Coverage Mapping
Bug Fixes in This Version
-------------------------
+
- Fix a crash when marco name is empty in ``#pragma push_macro("")`` or
``#pragma pop_macro("")``. (#GH149762).
- `-Wunreachable-code`` now diagnoses tautological or contradictory
@@ -229,6 +230,8 @@ Bug Fixes in This Version
cast chain. (#GH149967).
- Fixed a crash with incompatible pointer to integer conversions in designated
initializers involving string literals. (#GH154046)
+ 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 1dc12d705b2cf..6fbed3e3369d1 100644
--- a/clang/lib/CodeGen/CGDebugInfo.cpp
+++ b/clang/lib/CodeGen/CGDebugInfo.cpp
@@ -4183,8 +4183,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);
>From 10f08d4fbcabd3d78d87c14a40ded284521e89b4 Mon Sep 17 00:00:00 2001
From: "Khatavkar, Yashasvi" <yashasvi.khatavkar at intel.com>
Date: Wed, 13 Aug 2025 12:19:44 -0700
Subject: [PATCH 05/11] Address review comment
---
clang/lib/CodeGen/CGDebugInfo.cpp | 10 ++++------
1 file changed, 4 insertions(+), 6 deletions(-)
diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp
index 6fbed3e3369d1..a4663f79bd609 100644
--- a/clang/lib/CodeGen/CGDebugInfo.cpp
+++ b/clang/lib/CodeGen/CGDebugInfo.cpp
@@ -4183,13 +4183,11 @@ llvm::DICompositeType *CGDebugInfo::CreateLimitedType(const RecordType *Ty) {
llvm::MDNode::replaceWithDistinct(llvm::TempDICompositeType(RealDecl));
break;
}
- if (auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(Ty->getDecl())) {
- CXXRecordDecl *TemplateDecl =
- CTSD->getSpecializedTemplate()->getTemplatedDecl();
- RegionMap[TemplateDecl].reset(RealDecl);
- } else {
- RegionMap[Ty->getDecl()].reset(RealDecl);
+ auto *Decl = Ty->getDecl();
+ if (auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(Decl)) {
+ Decl = CTSD->getSpecializedTemplate()->getTemplateDecl();
}
+ RegionMap[Decl].reset(RealDecl);
TypeCache[QualType(Ty, 0).getAsOpaquePtr()].reset(RealDecl);
if (const auto *TSpecial = dyn_cast<ClassTemplateSpecializationDecl>(RD))
>From 3f5774338736709f724dfcb39ccb9aa5ba96e231 Mon Sep 17 00:00:00 2001
From: "Khatavkar, Yashasvi" <yashasvi.khatavkar at intel.com>
Date: Thu, 14 Aug 2025 06:54:27 -0700
Subject: [PATCH 06/11] Fix release note after merge confits
---
clang/docs/ReleaseNotes.rst | 1 -
1 file changed, 1 deletion(-)
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index c9dbb6cfe4a83..2b01dc4c84ec4 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -220,7 +220,6 @@ Improvements to Coverage Mapping
Bug Fixes in This Version
-------------------------
-
- Fix a crash when marco name is empty in ``#pragma push_macro("")`` or
``#pragma pop_macro("")``. (#GH149762).
- `-Wunreachable-code`` now diagnoses tautological or contradictory
>From b1fbff2491fd04fb76340de04c38dd294b55f0fb Mon Sep 17 00:00:00 2001
From: "Khatavkar, Yashasvi" <yashasvi.khatavkar at intel.com>
Date: Thu, 14 Aug 2025 07:18:19 -0700
Subject: [PATCH 07/11] Fix build failure
---
clang/lib/CodeGen/CGDebugInfo.cpp | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp
index a4663f79bd609..3f379850ac5ad 100644
--- a/clang/lib/CodeGen/CGDebugInfo.cpp
+++ b/clang/lib/CodeGen/CGDebugInfo.cpp
@@ -4183,11 +4183,11 @@ llvm::DICompositeType *CGDebugInfo::CreateLimitedType(const RecordType *Ty) {
llvm::MDNode::replaceWithDistinct(llvm::TempDICompositeType(RealDecl));
break;
}
- auto *Decl = Ty->getDecl();
- if (auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(Decl)) {
- Decl = CTSD->getSpecializedTemplate()->getTemplateDecl();
+
+ if (auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(RD)) {
+ RD = CTSD->getSpecializedTemplate()->getTemplatedDecl();
}
- RegionMap[Decl].reset(RealDecl);
+ RegionMap[RD].reset(RealDecl);
TypeCache[QualType(Ty, 0).getAsOpaquePtr()].reset(RealDecl);
if (const auto *TSpecial = dyn_cast<ClassTemplateSpecializationDecl>(RD))
>From a1ff3af79423900a667200eb9bfa6cd609efafc6 Mon Sep 17 00:00:00 2001
From: "Khatavkar, Yashasvi" <yashasvi.khatavkar at intel.com>
Date: Thu, 14 Aug 2025 07:25:36 -0700
Subject: [PATCH 08/11] Apply clang-format
---
clang/lib/CodeGen/CGDebugInfo.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp
index 3f379850ac5ad..696e0492cced7 100644
--- a/clang/lib/CodeGen/CGDebugInfo.cpp
+++ b/clang/lib/CodeGen/CGDebugInfo.cpp
@@ -4183,7 +4183,7 @@ llvm::DICompositeType *CGDebugInfo::CreateLimitedType(const RecordType *Ty) {
llvm::MDNode::replaceWithDistinct(llvm::TempDICompositeType(RealDecl));
break;
}
-
+
if (auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(RD)) {
RD = CTSD->getSpecializedTemplate()->getTemplatedDecl();
}
>From 8bc2ddb874f021aa5097b2bcedb28e329afa333a Mon Sep 17 00:00:00 2001
From: "Khatavkar, Yashasvi" <yashasvi.khatavkar at intel.com>
Date: Thu, 14 Aug 2025 08:31:21 -0700
Subject: [PATCH 09/11] fix test failures
---
clang/lib/CodeGen/CGDebugInfo.cpp | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp
index 696e0492cced7..9cd6d5815d9ea 100644
--- a/clang/lib/CodeGen/CGDebugInfo.cpp
+++ b/clang/lib/CodeGen/CGDebugInfo.cpp
@@ -4184,10 +4184,12 @@ llvm::DICompositeType *CGDebugInfo::CreateLimitedType(const RecordType *Ty) {
break;
}
- if (auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(RD)) {
- RD = CTSD->getSpecializedTemplate()->getTemplatedDecl();
- }
+ if (auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(Ty->getOriginalDecl())) {
+ CXXRecordDecl *TemplateDecl = CTSD->getSpecializedTemplate()->getTemplatedDecl();
+ RegionMap[TemplateDecl].reset(RealDecl);
+ }else {
RegionMap[RD].reset(RealDecl);
+ }
TypeCache[QualType(Ty, 0).getAsOpaquePtr()].reset(RealDecl);
if (const auto *TSpecial = dyn_cast<ClassTemplateSpecializationDecl>(RD))
>From c7164eef53e165b695cb67aca853e97633fd0ac9 Mon Sep 17 00:00:00 2001
From: "Khatavkar, Yashasvi" <yashasvi.khatavkar at intel.com>
Date: Thu, 14 Aug 2025 08:33:03 -0700
Subject: [PATCH 10/11] Apply clang-format
---
clang/lib/CodeGen/CGDebugInfo.cpp | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp
index 9cd6d5815d9ea..c44fea3e6383d 100644
--- a/clang/lib/CodeGen/CGDebugInfo.cpp
+++ b/clang/lib/CodeGen/CGDebugInfo.cpp
@@ -4184,11 +4184,13 @@ llvm::DICompositeType *CGDebugInfo::CreateLimitedType(const RecordType *Ty) {
break;
}
- if (auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(Ty->getOriginalDecl())) {
- CXXRecordDecl *TemplateDecl = CTSD->getSpecializedTemplate()->getTemplatedDecl();
+ if (auto *CTSD =
+ dyn_cast<ClassTemplateSpecializationDecl>(Ty->getOriginalDecl())) {
+ CXXRecordDecl *TemplateDecl =
+ CTSD->getSpecializedTemplate()->getTemplatedDecl();
RegionMap[TemplateDecl].reset(RealDecl);
- }else {
- RegionMap[RD].reset(RealDecl);
+ } else {
+ RegionMap[RD].reset(RealDecl);
}
TypeCache[QualType(Ty, 0).getAsOpaquePtr()].reset(RealDecl);
>From fc20aeb6d712c5f3fa8a21deab84dcc8f3e82c59 Mon Sep 17 00:00:00 2001
From: "Khatavkar, Yashasvi" <yashasvi.khatavkar at intel.com>
Date: Thu, 21 Aug 2025 10:51:09 -0700
Subject: [PATCH 11/11] Move test to debuginfo directory
---
.../CXX}/dependent-template-type-scope.cpp | 0
1 file changed, 0 insertions(+), 0 deletions(-)
rename clang/test/{CodeGenCXX => DebugInfo/CXX}/dependent-template-type-scope.cpp (100%)
diff --git a/clang/test/CodeGenCXX/dependent-template-type-scope.cpp b/clang/test/DebugInfo/CXX/dependent-template-type-scope.cpp
similarity index 100%
rename from clang/test/CodeGenCXX/dependent-template-type-scope.cpp
rename to clang/test/DebugInfo/CXX/dependent-template-type-scope.cpp
More information about the cfe-commits
mailing list