summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Blaikie <dblaikie@gmail.com>2022-04-07 23:59:19 +0000
committerDavid Blaikie <dblaikie@gmail.com>2022-04-08 00:00:46 +0000
commit1cee3d9db77b2c62a03efe1cce45f627dcbe6457 (patch)
treeb39f9531c8895be003fae022999139fcc3faff1b
parent0713053e4a3f08fc0a8408400ee5c4d20a188765 (diff)
downloadllvm-1cee3d9db77b2c62a03efe1cce45f627dcbe6457.tar.gz
DebugInfo: Consider the type of NTTP when simplifying template names
Since the NTTP may need to be cast to the type when rebuilding the name, check that the type can be rebuilt when determining whether a template name can be simplified.
-rw-r--r--clang/lib/CodeGen/CGDebugInfo.cpp3
-rw-r--r--clang/test/CodeGenCXX/debug-info-simple-template-names.cpp7
-rw-r--r--cross-project-tests/debuginfo-tests/clang_llvm_roundtrip/simplified_template_names.cpp5
3 files changed, 14 insertions, 1 deletions
diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp
index 63b89f258a8a..c18dbccf8293 100644
--- a/clang/lib/CodeGen/CGDebugInfo.cpp
+++ b/clang/lib/CodeGen/CGDebugInfo.cpp
@@ -5167,7 +5167,8 @@ std::string CGDebugInfo::GetName(const Decl *D, bool Qualified) const {
// harder to parse back into a large integer, etc - so punting on
// this for now. Re-parsing the integers back into APInt is probably
// feasible some day.
- return TA.getAsIntegral().getBitWidth() <= 64;
+ return TA.getAsIntegral().getBitWidth() <= 64 &&
+ IsReconstitutableType(TA.getIntegralType());
case TemplateArgument::Type:
return IsReconstitutableType(TA.getAsType());
default:
diff --git a/clang/test/CodeGenCXX/debug-info-simple-template-names.cpp b/clang/test/CodeGenCXX/debug-info-simple-template-names.cpp
index 190d121937a0..98faa0fc6f0b 100644
--- a/clang/test/CodeGenCXX/debug-info-simple-template-names.cpp
+++ b/clang/test/CodeGenCXX/debug-info-simple-template-names.cpp
@@ -31,6 +31,10 @@ struct t4 {
};
t4 v1;
+enum { UnnamedEnum1 };
+template<decltype(UnnamedEnum1)>
+void f4() {
+}
// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "t3<(anonymous namespace)::LocalEnum, ((anonymous namespace)::LocalEnum)0>"
void f() {
// Basic examples of simplifiable/rebuildable names
@@ -122,4 +126,7 @@ void f() {
int fnrt() __attribute__((noreturn));
f1<decltype(fnrt)>();
// CHECK: !DISubprogram(name: "f1<int () __attribute__((noreturn))>",
+
+ f4<UnnamedEnum1>();
+ // CHECK: !DISubprogram(name: "f4<((unnamed enum at {{.*}}))0>"
}
diff --git a/cross-project-tests/debuginfo-tests/clang_llvm_roundtrip/simplified_template_names.cpp b/cross-project-tests/debuginfo-tests/clang_llvm_roundtrip/simplified_template_names.cpp
index 9bc14f8ce657..b68d4e8c04b9 100644
--- a/cross-project-tests/debuginfo-tests/clang_llvm_roundtrip/simplified_template_names.cpp
+++ b/cross-project-tests/debuginfo-tests/clang_llvm_roundtrip/simplified_template_names.cpp
@@ -179,6 +179,10 @@ struct t12 {
t11<LocalEnum, LocalEnum1> v1;
};
+template<decltype(ns::AnonEnum1)>
+void f10() {
+}
+
int main() {
struct { } A;
auto L = []{};
@@ -327,6 +331,7 @@ int main() {
f1<decltype(fcc)>();
int fnrt() __attribute__((noreturn));
f1<decltype(fnrt)>();
+ f10<ns::AnonEnum1>();
}
void t8::mem() {
struct t7 { };