diff options
author | David Blaikie <dblaikie@gmail.com> | 2019-10-18 23:58:34 +0000 |
---|---|---|
committer | David Blaikie <dblaikie@gmail.com> | 2019-10-18 23:58:34 +0000 |
commit | 3b03365d5fddd6485581747d7a7ba1799d94241f (patch) | |
tree | dd010c8f7111ead0a7138dd8041c1110b27480b9 | |
parent | 7000556ec0f00c6c96211b4e5c82032476f37cb5 (diff) | |
download | clang-3b03365d5fddd6485581747d7a7ba1799d94241f.tar.gz |
DebugInfo: Render the canonical name of a class template specialization, even when nested in another class template specialization
Differential Revision: https://reviews.llvm.org/D63031
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@375304 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/AST/TypePrinter.cpp | 3 | ||||
-rw-r--r-- | lib/CodeGen/CGDebugInfo.cpp | 4 | ||||
-rw-r--r-- | test/CodeGenCXX/debug-info-template-explicit-specialization.cpp | 5 |
3 files changed, 10 insertions, 2 deletions
diff --git a/lib/AST/TypePrinter.cpp b/lib/AST/TypePrinter.cpp index d7b7103faa..dacbf9a96d 100644 --- a/lib/AST/TypePrinter.cpp +++ b/lib/AST/TypePrinter.cpp @@ -1204,7 +1204,8 @@ void TypePrinter::printTag(TagDecl *D, raw_ostream &OS) { // arguments. if (const auto *Spec = dyn_cast<ClassTemplateSpecializationDecl>(D)) { ArrayRef<TemplateArgument> Args; - if (TypeSourceInfo *TAW = Spec->getTypeAsWritten()) { + TypeSourceInfo *TAW = Spec->getTypeAsWritten(); + if (!Policy.PrintCanonicalTypes && TAW) { const TemplateSpecializationType *TST = cast<TemplateSpecializationType>(TAW->getType()); Args = TST->template_arguments(); diff --git a/lib/CodeGen/CGDebugInfo.cpp b/lib/CodeGen/CGDebugInfo.cpp index 7962ae002b..294d54e378 100644 --- a/lib/CodeGen/CGDebugInfo.cpp +++ b/lib/CodeGen/CGDebugInfo.cpp @@ -314,7 +314,9 @@ StringRef CGDebugInfo::getClassName(const RecordDecl *RD) { if (isa<ClassTemplateSpecializationDecl>(RD)) { SmallString<128> Name; llvm::raw_svector_ostream OS(Name); - RD->getNameForDiagnostic(OS, getPrintingPolicy(), + PrintingPolicy PP = getPrintingPolicy(); + PP.PrintCanonicalTypes = true; + RD->getNameForDiagnostic(OS, PP, /*Qualified*/ false); // Copy this name on the side and use its reference. diff --git a/test/CodeGenCXX/debug-info-template-explicit-specialization.cpp b/test/CodeGenCXX/debug-info-template-explicit-specialization.cpp index cd51b52250..4e41c4092b 100644 --- a/test/CodeGenCXX/debug-info-template-explicit-specialization.cpp +++ b/test/CodeGenCXX/debug-info-template-explicit-specialization.cpp @@ -105,7 +105,12 @@ struct j { }; extern template class j<int>; j<int> jj; +template <typename T> +struct j_wrap { +}; +j_wrap<j<int>> j_wrap_j; // CHECK: DICompositeType(tag: DW_TAG_structure_type, name: "j<int, int>" +// CHECK: DICompositeType(tag: DW_TAG_structure_type, name: "j_wrap<j<int, int> >" template <typename T> struct k { |