Index: lldb/trunk/include/lldb/Symbol/ClangASTContext.h =================================================================== --- lldb/trunk/include/lldb/Symbol/ClangASTContext.h +++ lldb/trunk/include/lldb/Symbol/ClangASTContext.h @@ -787,7 +787,7 @@ size_t idx) override; CompilerType GetTypeTemplateArgument(lldb::opaque_compiler_type_t type, size_t idx) override; - std::pair + llvm::Optional GetIntegralTemplateArgument(lldb::opaque_compiler_type_t type, size_t idx) override; Index: lldb/trunk/include/lldb/Symbol/CompilerType.h =================================================================== --- lldb/trunk/include/lldb/Symbol/CompilerType.h +++ lldb/trunk/include/lldb/Symbol/CompilerType.h @@ -20,6 +20,7 @@ // Project includes #include "lldb/Core/ClangForward.h" #include "lldb/lldb-private.h" +#include "llvm/ADT/APSInt.h" namespace lldb_private { @@ -290,6 +291,8 @@ // Exploring the type //---------------------------------------------------------------------- + struct IntegralTemplateArgument; + uint64_t GetByteSize(ExecutionContextScope *exe_scope) const; uint64_t GetBitSize(ExecutionContextScope *exe_scope) const; @@ -368,9 +371,9 @@ lldb::TemplateArgumentKind GetTemplateArgumentKind(size_t idx) const; CompilerType GetTypeTemplateArgument(size_t idx) const; - // Returns the value of the template argument and its type. In case the - // argument is not found, returns an invalid CompilerType. - std::pair GetIntegralTemplateArgument(size_t idx) const; + // Returns the value of the template argument and its type. + llvm::Optional + GetIntegralTemplateArgument(size_t idx) const; CompilerType GetTypeForFormatters() const; @@ -433,6 +436,11 @@ bool operator==(const CompilerType &lhs, const CompilerType &rhs); bool operator!=(const CompilerType &lhs, const CompilerType &rhs); +struct CompilerType::IntegralTemplateArgument { + llvm::APSInt value; + CompilerType type; +}; + } // namespace lldb_private #endif // liblldb_CompilerType_h_ Index: lldb/trunk/include/lldb/Symbol/TypeSystem.h =================================================================== --- lldb/trunk/include/lldb/Symbol/TypeSystem.h +++ lldb/trunk/include/lldb/Symbol/TypeSystem.h @@ -355,9 +355,8 @@ GetTemplateArgumentKind(lldb::opaque_compiler_type_t type, size_t idx); virtual CompilerType GetTypeTemplateArgument(lldb::opaque_compiler_type_t type, size_t idx); - virtual std::pair - GetIntegralTemplateArgument(lldb::opaque_compiler_type_t type, - size_t idx); + virtual llvm::Optional + GetIntegralTemplateArgument(lldb::opaque_compiler_type_t type, size_t idx); //---------------------------------------------------------------------- // Dumping types Index: lldb/trunk/source/API/SBType.cpp =================================================================== --- lldb/trunk/source/API/SBType.cpp +++ lldb/trunk/source/API/SBType.cpp @@ -426,7 +426,7 @@ case eTemplateArgumentKindIntegral: type = m_opaque_sp->GetCompilerType(false) .GetIntegralTemplateArgument(idx) - .second; + ->type; break; default: break; Index: lldb/trunk/source/Plugins/Language/CPlusPlus/LibCxxBitset.cpp =================================================================== --- lldb/trunk/source/Plugins/Language/CPlusPlus/LibCxxBitset.cpp +++ lldb/trunk/source/Plugins/Language/CPlusPlus/LibCxxBitset.cpp @@ -59,10 +59,8 @@ size_t capping_size = target_sp->GetMaximumNumberOfChildrenToDisplay(); size_t size = 0; - auto value_and_type = - m_backend.GetCompilerType().GetIntegralTemplateArgument(0); - if (value_and_type.second) - size = value_and_type.first.getLimitedValue(capping_size); + if (auto arg = m_backend.GetCompilerType().GetIntegralTemplateArgument(0)) + size = arg->value.getLimitedValue(capping_size); m_elements.assign(size, ValueObjectSP()); Index: lldb/trunk/source/Symbol/ClangASTContext.cpp =================================================================== --- lldb/trunk/source/Symbol/ClangASTContext.cpp +++ lldb/trunk/source/Symbol/ClangASTContext.cpp @@ -7650,21 +7650,21 @@ return CompilerType(getASTContext(), template_arg.getAsType()); } -std::pair +llvm::Optional ClangASTContext::GetIntegralTemplateArgument(lldb::opaque_compiler_type_t type, size_t idx) { const clang::ClassTemplateSpecializationDecl *template_decl = GetAsTemplateSpecialization(type); if (! template_decl || idx >= template_decl->getTemplateArgs().size()) - return {llvm::APSInt(0), CompilerType()}; + return llvm::None; const clang::TemplateArgument &template_arg = template_decl->getTemplateArgs()[idx]; if (template_arg.getKind() != clang::TemplateArgument::Integral) - return {llvm::APSInt(0), CompilerType()}; + return llvm::None; - return {template_arg.getAsIntegral(), - CompilerType(getASTContext(), template_arg.getIntegralType())}; + return {{template_arg.getAsIntegral(), + CompilerType(getASTContext(), template_arg.getIntegralType())}}; } CompilerType ClangASTContext::GetTypeForFormatters(void *type) { Index: lldb/trunk/source/Symbol/CompilerType.cpp =================================================================== --- lldb/trunk/source/Symbol/CompilerType.cpp +++ lldb/trunk/source/Symbol/CompilerType.cpp @@ -703,12 +703,11 @@ return CompilerType(); } -std::pair -CompilerType::GetIntegralTemplateArgument(size_t idx) const -{ +llvm::Optional +CompilerType::GetIntegralTemplateArgument(size_t idx) const { if (IsValid()) return m_type_system->GetIntegralTemplateArgument(m_type, idx); - return {llvm::APSInt(0), CompilerType()}; + return llvm::None; } CompilerType CompilerType::GetTypeForFormatters() const { Index: lldb/trunk/source/Symbol/TypeSystem.cpp =================================================================== --- lldb/trunk/source/Symbol/TypeSystem.cpp +++ lldb/trunk/source/Symbol/TypeSystem.cpp @@ -111,10 +111,10 @@ return CompilerType(); } -std::pair +llvm::Optional TypeSystem::GetIntegralTemplateArgument(opaque_compiler_type_t type, - size_t idx) { - return {llvm::APSInt(0), CompilerType()}; + size_t idx) { + return llvm::None; } LazyBool TypeSystem::ShouldPrintAsOneLiner(void *type, ValueObject *valobj) { Index: lldb/trunk/unittests/Symbol/TestClangASTContext.cpp =================================================================== --- lldb/trunk/unittests/Symbol/TestClangASTContext.cpp +++ lldb/trunk/unittests/Symbol/TestClangASTContext.cpp @@ -382,8 +382,8 @@ infos.names.push_back("T"); infos.args.push_back(TemplateArgument(m_ast->getASTContext()->IntTy)); infos.names.push_back("I"); - infos.args.push_back(TemplateArgument(*m_ast->getASTContext(), - llvm::APSInt(47), + llvm::APSInt arg(llvm::APInt(8, 47)); + infos.args.push_back(TemplateArgument(*m_ast->getASTContext(), arg, m_ast->getASTContext()->IntTy)); // template struct foo; @@ -419,15 +419,16 @@ eTemplateArgumentKindType); EXPECT_EQ(m_ast->GetTypeTemplateArgument(t.GetOpaqueQualType(), 0), int_type); - auto p = m_ast->GetIntegralTemplateArgument(t.GetOpaqueQualType(), 0); - EXPECT_EQ(p.second, CompilerType()); + EXPECT_EQ(llvm::None, + m_ast->GetIntegralTemplateArgument(t.GetOpaqueQualType(), 0)); EXPECT_EQ(m_ast->GetTemplateArgumentKind(t.GetOpaqueQualType(), 1), eTemplateArgumentKindIntegral); EXPECT_EQ(m_ast->GetTypeTemplateArgument(t.GetOpaqueQualType(), 1), CompilerType()); - p = m_ast->GetIntegralTemplateArgument(t.GetOpaqueQualType(), 1); - EXPECT_EQ(p.first, llvm::APSInt(47)); - EXPECT_EQ(p.second, int_type); + auto result = m_ast->GetIntegralTemplateArgument(t.GetOpaqueQualType(), 1); + ASSERT_NE(llvm::None, result); + EXPECT_EQ(arg, result->value); + EXPECT_EQ(int_type, result->type); } }