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.
This commit is contained in:
David Blaikie 2022-04-07 23:59:19 +00:00
parent 0713053e4a
commit 1cee3d9db7
3 changed files with 14 additions and 1 deletions

View file

@ -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:

View file

@ -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>"
}

View file

@ -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 { };