Author: rnk Date: Wed Jun 26 14:59:19 2019 New Revision: 364483 URL: http://llvm.org/viewvc/llvm-project?rev=364483&view=rev Log: Merging r359809: ------------------------------------------------------------------------ r359809 | rnk | 2019-05-02 10:45:54 -0700 (Thu, 02 May 2019) | 27 lines
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. Reviewers: JDevlieghere, aprantl, ormris, dblaikie Subscribers: cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D61408 ------------------------------------------------------------------------ Added: cfe/branches/release_80/test/CodeGenCXX/debug-info-var-template-partial.cpp - copied, changed from r359809, cfe/trunk/test/CodeGenCXX/debug-info-var-template-partial.cpp Modified: cfe/branches/release_80/ (props changed) cfe/branches/release_80/lib/CodeGen/CGDebugInfo.cpp cfe/branches/release_80/test/CodeGenCXX/debug-info-template-member.cpp Propchange: cfe/branches/release_80/ ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Wed Jun 26 14:59:19 2019 @@ -1,4 +1,4 @@ /cfe/branches/type-system-rewrite:134693-134817 -/cfe/trunk:351334,351340,351344,351360,351457,351459,351531,351579-351580,352040,352079,352099,352102,352105,352119,352156,352221-352222,352229,352307,352323,352463,352539,352610,352672,352822,353142,353393,353402,353411,353431,353493,353495,353656,353943,353976,354035,354074,354147,354351,354721,354723,354937,354968,355489,355491,355743 +/cfe/trunk:351334,351340,351344,351360,351457,351459,351531,351579-351580,352040,352079,352099,352102,352105,352119,352156,352221-352222,352229,352307,352323,352463,352539,352610,352672,352822,353142,353393,353402,353411,353431,353493,353495,353656,353943,353976,354035,354074,354147,354351,354721,354723,354937,354968,355489,355491,355743,359809 /cfe/trunk/test:170344 /cfe/trunk/test/SemaTemplate:126920 Modified: cfe/branches/release_80/lib/CodeGen/CGDebugInfo.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_80/lib/CodeGen/CGDebugInfo.cpp?rev=364483&r1=364482&r2=364483&view=diff ============================================================================== --- cfe/branches/release_80/lib/CodeGen/CGDebugInfo.cpp (original) +++ cfe/branches/release_80/lib/CodeGen/CGDebugInfo.cpp Wed Jun 26 14:59:19 2019 @@ -1817,32 +1817,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/branches/release_80/test/CodeGenCXX/debug-info-template-member.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_80/test/CodeGenCXX/debug-info-template-member.cpp?rev=364483&r1=364482&r2=364483&view=diff ============================================================================== --- cfe/branches/release_80/test/CodeGenCXX/debug-info-template-member.cpp (original) +++ cfe/branches/release_80/test/CodeGenCXX/debug-info-template-member.cpp Wed Jun 26 14:59:19 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]+}} Copied: cfe/branches/release_80/test/CodeGenCXX/debug-info-var-template-partial.cpp (from r359809, cfe/trunk/test/CodeGenCXX/debug-info-var-template-partial.cpp) URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_80/test/CodeGenCXX/debug-info-var-template-partial.cpp?p2=cfe/branches/release_80/test/CodeGenCXX/debug-info-var-template-partial.cpp&p1=cfe/trunk/test/CodeGenCXX/debug-info-var-template-partial.cpp&r1=359809&r2=364483&rev=364483&view=diff ============================================================================== --- cfe/trunk/test/CodeGenCXX/debug-info-var-template-partial.cpp (original) +++ cfe/branches/release_80/test/CodeGenCXX/debug-info-var-template-partial.cpp Wed Jun 26 14:59:19 2019 @@ -10,7 +10,7 @@ static_assert(is_same_v<int, int>, "shou // 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: distinct !DIGlobalVariable(name: "is_same_v", linkageName: "_ZL9is_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) _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits