diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp --- a/clang/lib/CodeGen/CGDebugInfo.cpp +++ b/clang/lib/CodeGen/CGDebugInfo.cpp @@ -1415,14 +1415,20 @@ unsigned LineNumber = getLineNumber(Var->getLocation()); StringRef VName = Var->getName(); llvm::Constant *C = nullptr; - if (Var->getInit()) { - const APValue *Value = Var->evaluateValue(); - if (Value) { - if (Value->isInt()) - C = llvm::ConstantInt::get(CGM.getLLVMContext(), Value->getInt()); - if (Value->isFloat()) - C = llvm::ConstantFP::get(CGM.getLLVMContext(), Value->getFloat()); - } + APValue *Value = nullptr; + if (Var->getInit()) + Value = Var->evaluateValue(); + else if (auto *TemplateDecl = Var->getInstantiatedFromStaticDataMember()) { + // Inline static data members might not have an initialization. + if (TemplateDecl->getInit()) + Value = TemplateDecl->evaluateValue(); + } + + if (Value) { + if (Value->isInt()) + C = llvm::ConstantInt::get(CGM.getLLVMContext(), Value->getInt()); + if (Value->isFloat()) + C = llvm::ConstantFP::get(CGM.getLLVMContext(), Value->getFloat()); } llvm::DINode::DIFlags Flags = getAccessFlag(Var->getAccess(), RD); diff --git a/clang/test/CodeGenCXX/debug-info-static-member.cpp b/clang/test/CodeGenCXX/debug-info-static-member.cpp --- a/clang/test/CodeGenCXX/debug-info-static-member.cpp +++ b/clang/test/CodeGenCXX/debug-info-static-member.cpp @@ -1,6 +1,7 @@ // RUN: %clangxx -target x86_64-unknown-unknown -g %s -emit-llvm -S -o - | FileCheck %s // RUN: %clangxx -target x86_64-unknown-unknown -g -std=c++98 %s -emit-llvm -S -o - | FileCheck %s // RUN: %clangxx -target x86_64-unknown-unknown -g -std=c++11 %s -emit-llvm -S -o - | FileCheck %s +// RUN: %clangxx -target x86_64-unknown-unknown -g -std=c++17 %s -emit-llvm -S -o - | FileCheck %s // RUN: %clang_cc1 -triple x86_64-windows-msvc -gcodeview -debug-info-kind=limited %s -emit-llvm -o - | FileCheck --check-prefix MSVC %s // PR14471 @@ -45,6 +46,9 @@ // CHECK-NOT: DIFlagFwdDecl // CHECK-SAME: ){{$}} // CHECK: !DIDerivedType(tag: DW_TAG_member, name: "static_decl_templ_var" +// CHECK-SAME: extraData: i32 7 +// CHECK-DAG: !DIDerivedType(tag: DW_TAG_member, name: "static_constexpr_decl_templ_var" +// CHECK-SAME: extraData: i32 8 int C::a = 4; // CHECK: [[B]] = !DIGlobalVariableExpression(var: [[BV:.*]], expr: !DIExpression()) @@ -133,6 +137,11 @@ template struct static_decl_templ { static const int static_decl_templ_var = 7; +#if __cplusplus >= 201103L + static constexpr int static_constexpr_decl_templ_var = 8; +#else + static const int static_constexpr_decl_templ_var = 8; +#endif }; template