From 8a2708eca05acc8285203bd8efbdc68318f61fcb Mon Sep 17 00:00:00 2001 From: Reid Kleckner Date: Thu, 2 May 2019 17:45:54 +0000 Subject: Use primary template parameter names for variable template debug info Summary: Fixes PR41677 Consider: template constexpr bool is_same_v = false; template constexpr bool is_same_v = true; template constexpr bool is_same_v; Before this change, when emitting debug info for the `is_same_v` 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 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@359809 91177308-0d34-0410-b5e6-96231b3b80d8 --- test/CodeGenCXX/debug-info-var-template-partial.cpp | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 test/CodeGenCXX/debug-info-var-template-partial.cpp (limited to 'test/CodeGenCXX/debug-info-var-template-partial.cpp') diff --git a/test/CodeGenCXX/debug-info-var-template-partial.cpp b/test/CodeGenCXX/debug-info-var-template-partial.cpp new file mode 100644 index 0000000000..21ea03b8ee --- /dev/null +++ b/test/CodeGenCXX/debug-info-var-template-partial.cpp @@ -0,0 +1,17 @@ +// RUN: %clang_cc1 -emit-llvm -triple x86_64-linux-gnu %s -o - -debug-info-kind=limited | FileCheck %s + +template constexpr bool is_same_v = false; +template constexpr bool is_same_v = true; + +template constexpr bool is_same_v; +static_assert(is_same_v, "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]]) -- cgit v1.2.3