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:
parent
0713053e4a
commit
1cee3d9db7
|
@ -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:
|
||||
|
|
|
@ -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>"
|
||||
}
|
||||
|
|
|
@ -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 { };
|
||||
|
|
Loading…
Reference in a new issue