On Thu, 2 May 2019 at 10:43, Reid Kleckner via cfe-commits <cfe-commits@lists.llvm.org> wrote: > > Author: rnk > Date: Thu May 2 10:45:54 2019 > New Revision: 359809 > > URL: http://llvm.org/viewvc/llvm-project?rev=359809&view=rev > Log: > Use primary template parameter names for variable template debug info > > Summary: > Fixes PR41677 > > Consider: > template <typename LHS, typename RHS> constexpr bool is_same_v = false; > template <typename T> constexpr bool is_same_v<T, T> = true; > template constexpr bool is_same_v<int, int>; > > Before this change, when emitting debug info for the > `is_same_v<int, int>` global variable, clang would crash because it > would try to use the template parameter list from the partial > specialization to give parameter names to template arguments. This > doesn't work in general, since a partial specialization can have fewer > arguments than the primary template. Therefore, always use the primary > template. Hypothetically we could try to use the parameter names from > the partial specialization when possible, but it's not clear this really > helps debugging in practice.
Hmm, consider: template<typename T> constexpr bool is_pointer = false; template<typename T> constexpr bool is_pointer<T*> = true; If I somehow inspect is_pointer<int*> in a debugger, I think it'd be surprising to find I had T=int* instead of T=int. (This is likely not a big deal for a case like this, but there could be a lambda on the right-hand side of the =, and stepping into that should put the right set of things in scope.) > Reviewers: JDevlieghere, aprantl, ormris, dblaikie > > Subscribers: cfe-commits > > Tags: #clang > > Differential Revision: https://reviews.llvm.org/D61408 > > Added: > cfe/trunk/test/CodeGenCXX/debug-info-var-template-partial.cpp > Modified: > cfe/trunk/lib/CodeGen/CGDebugInfo.cpp > cfe/trunk/test/CodeGenCXX/debug-info-template-member.cpp > > Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.cpp?rev=359809&r1=359808&r2=359809&view=diff > ============================================================================== > --- cfe/trunk/lib/CodeGen/CGDebugInfo.cpp (original) > +++ cfe/trunk/lib/CodeGen/CGDebugInfo.cpp Thu May 2 10:45:54 2019 > @@ -1827,32 +1827,24 @@ CGDebugInfo::CollectFunctionTemplatePara > } > > llvm::DINodeArray CGDebugInfo::CollectVarTemplateParams(const VarDecl *VL, > - llvm::DIFile *Unit) { > - if (auto *TS = dyn_cast<VarTemplateSpecializationDecl>(VL)) { > - auto T = TS->getSpecializedTemplateOrPartial(); > - auto TA = TS->getTemplateArgs().asArray(); > - // Collect parameters for a partial specialization > - if (T.is<VarTemplatePartialSpecializationDecl *>()) { > - const TemplateParameterList *TList = > - T.get<VarTemplatePartialSpecializationDecl *>() > - ->getTemplateParameters(); > - return CollectTemplateParams(TList, TA, Unit); > - } > - > - // Collect parameters for an explicit specialization > - if (T.is<VarTemplateDecl *>()) { > - const TemplateParameterList *TList = T.get<VarTemplateDecl *>() > - ->getTemplateParameters(); > - return CollectTemplateParams(TList, TA, Unit); > - } > - } > - return llvm::DINodeArray(); > + llvm::DIFile *Unit) { > + // Always get the full list of parameters, not just the ones from the > + // specialization. A partial specialization may have fewer parameters than > + // there are arguments. > + auto *TS = dyn_cast<VarTemplateSpecializationDecl>(VL); > + if (!TS) > + return llvm::DINodeArray(); > + VarTemplateDecl *T = TS->getSpecializedTemplate(); > + const TemplateParameterList *TList = T->getTemplateParameters(); > + auto TA = TS->getTemplateArgs().asArray(); > + return CollectTemplateParams(TList, TA, Unit); > } > > llvm::DINodeArray CGDebugInfo::CollectCXXTemplateParams( > const ClassTemplateSpecializationDecl *TSpecial, llvm::DIFile *Unit) { > - // Always get the full list of parameters, not just the ones from > - // the specialization. > + // Always get the full list of parameters, not just the ones from the > + // specialization. A partial specialization may have fewer parameters than > + // there are arguments. > TemplateParameterList *TPList = > TSpecial->getSpecializedTemplate()->getTemplateParameters(); > const TemplateArgumentList &TAList = TSpecial->getTemplateArgs(); > > Modified: cfe/trunk/test/CodeGenCXX/debug-info-template-member.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-info-template-member.cpp?rev=359809&r1=359808&r2=359809&view=diff > ============================================================================== > --- cfe/trunk/test/CodeGenCXX/debug-info-template-member.cpp (original) > +++ cfe/trunk/test/CodeGenCXX/debug-info-template-member.cpp Thu May 2 > 10:45:54 2019 > @@ -30,7 +30,7 @@ inline int add3(int x) { > // CHECK: {{![0-9]+}} = distinct !DIGlobalVariable( > // CHECK-SAME: name: "var" > // CHECK-SAME: templateParams: {{![0-9]+}} > -// CHECK: !DITemplateTypeParameter(name: "P", type: {{![0-9]+}}) > +// CHECK: !DITemplateTypeParameter(name: "T", type: {{![0-9]+}}) > // CHECK: {{![0-9]+}} = distinct !DIGlobalVariable( > // CHECK-SAME: name: "varray" > // CHECK-SAME: templateParams: {{![0-9]+}} > > Added: cfe/trunk/test/CodeGenCXX/debug-info-var-template-partial.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-info-var-template-partial.cpp?rev=359809&view=auto > ============================================================================== > --- cfe/trunk/test/CodeGenCXX/debug-info-var-template-partial.cpp (added) > +++ cfe/trunk/test/CodeGenCXX/debug-info-var-template-partial.cpp Thu May 2 > 10:45:54 2019 > @@ -0,0 +1,17 @@ > +// RUN: %clang_cc1 -emit-llvm -triple x86_64-linux-gnu %s -o - > -debug-info-kind=limited | FileCheck %s > + > +template <typename LHS, typename RHS> constexpr bool is_same_v = false; > +template <typename T> constexpr bool is_same_v<T, T> = true; > + > +template constexpr bool is_same_v<int, int>; > +static_assert(is_same_v<int, int>, "should get partial spec"); > + > +// Note that the template arguments for the instantiated variable use the > +// parameter names from the primary template. The partial specialization > might > +// not have enough parameters. > + > +// CHECK: distinct !DIGlobalVariable(name: "is_same_v", linkageName: > "_Z9is_same_vIiiE", {{.*}} templateParams: ![[PARAMS:[0-9]+]]) > +// CHECK: ![[PARAMS]] = !{![[LHS:[0-9]+]], ![[RHS:[0-9]+]]} > +// CHECK: ![[LHS]] = !DITemplateTypeParameter(name: "LHS", type: > ![[INT:[0-9]+]]) > +// CHECK: ![[INT]] = !DIBasicType(name: "int", size: 32, encoding: > DW_ATE_signed) > +// CHECK: ![[RHS]] = !DITemplateTypeParameter(name: "RHS", type: ![[INT]]) > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits