diff --git a/lldb/include/lldb/Symbol/CompilerType.h b/lldb/include/lldb/Symbol/CompilerType.h index c96fc5a2b6886..50587f4aab827 100644 --- a/lldb/include/lldb/Symbol/CompilerType.h +++ b/lldb/include/lldb/Symbol/CompilerType.h @@ -164,6 +164,8 @@ class CompilerType { bool IsFunctionPointerType() const; + bool IsMemberFunctionPointerType() const; + bool IsBlockPointerType(CompilerType *function_pointer_type_ptr = nullptr) const; diff --git a/lldb/include/lldb/Symbol/TypeSystem.h b/lldb/include/lldb/Symbol/TypeSystem.h index 151a0ceaca72a..7681a700766a2 100644 --- a/lldb/include/lldb/Symbol/TypeSystem.h +++ b/lldb/include/lldb/Symbol/TypeSystem.h @@ -169,6 +169,9 @@ class TypeSystem : public PluginInterface, virtual bool IsFunctionPointerType(lldb::opaque_compiler_type_t type) = 0; + virtual bool + IsMemberFunctionPointerType(lldb::opaque_compiler_type_t type) = 0; + virtual bool IsBlockPointerType(lldb::opaque_compiler_type_t type, CompilerType *function_pointer_type_ptr) = 0; diff --git a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp index 1b152c16eac2a..0dfaa92ac99f4 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp @@ -1390,7 +1390,8 @@ CPlusPlusLanguage::GetHardcodedSummaries() { TypeSummaryImpl::Flags(), lldb_private::formatters::CXXFunctionPointerSummaryProvider, "Function pointer summary provider")); - if (valobj.GetCompilerType().IsFunctionPointerType()) { + if (CompilerType CT = valobj.GetCompilerType(); + CT.IsFunctionPointerType() || CT.IsMemberFunctionPointerType()) { return formatter_sp; } return nullptr; diff --git a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp index fa1984b50a586..f26147e7d408e 100644 --- a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp +++ b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp @@ -3194,6 +3194,15 @@ bool TypeSystemClang::IsTypeImpl( return false; } +bool TypeSystemClang::IsMemberFunctionPointerType( + lldb::opaque_compiler_type_t type) { + auto isMemberFunctionPointerType = [](clang::QualType qual_type) { + return qual_type->isMemberFunctionPointerType(); + }; + + return IsTypeImpl(type, isMemberFunctionPointerType); +} + bool TypeSystemClang::IsFunctionPointerType(lldb::opaque_compiler_type_t type) { auto isFunctionPointerType = [](clang::QualType qual_type) { return qual_type->isFunctionPointerType(); diff --git a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h index d5b0593cac8fb..99021f9b76bda 100644 --- a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h +++ b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h @@ -656,6 +656,8 @@ class TypeSystemClang : public TypeSystem { bool IsFunctionPointerType(lldb::opaque_compiler_type_t type) override; + bool IsMemberFunctionPointerType(lldb::opaque_compiler_type_t type) override; + bool IsBlockPointerType(lldb::opaque_compiler_type_t type, CompilerType *function_pointer_type_ptr) override; diff --git a/lldb/source/Symbol/CompilerType.cpp b/lldb/source/Symbol/CompilerType.cpp index 11a7d09680d3f..d6dc43c05d1bd 100644 --- a/lldb/source/Symbol/CompilerType.cpp +++ b/lldb/source/Symbol/CompilerType.cpp @@ -154,6 +154,13 @@ bool CompilerType::IsFunctionPointerType() const { return false; } +bool CompilerType::IsMemberFunctionPointerType() const { + if (IsValid()) + if (auto type_system_sp = GetTypeSystem()) + return type_system_sp->IsMemberFunctionPointerType(m_type); + return false; +} + bool CompilerType::IsBlockPointerType( CompilerType *function_pointer_type_ptr) const { if (IsValid()) diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-cpp/TestDataFormatterCpp.py b/lldb/test/API/functionalities/data-formatter/data-formatter-cpp/TestDataFormatterCpp.py index 84d4a4c0ae5a8..4c6bcff35f720 100644 --- a/lldb/test/API/functionalities/data-formatter/data-formatter-cpp/TestDataFormatterCpp.py +++ b/lldb/test/API/functionalities/data-formatter/data-formatter-cpp/TestDataFormatterCpp.py @@ -297,10 +297,12 @@ def test_mem_func_ptr_formats(self): patterns=['member_ptr = 0x[0-9a-z]+']) self.expect( "frame variable member_func_ptr", - patterns=['member_func_ptr = 0x[0-9a-z]+']) + patterns=['member_func_ptr = 0x[0-9a-z]+'], + substrs=['(a.out`IUseCharStar::member_func(int) at main.cpp:61)']) self.expect( "frame variable ref_to_member_func_ptr", - patterns=['ref_to_member_func_ptr = 0x[0-9a-z]+']) + patterns=['ref_to_member_func_ptr = 0x[0-9a-z]+'], + substrs=['(a.out`IUseCharStar::member_func(int) at main.cpp:61)']) self.expect( "frame variable virt_member_func_ptr", - patterns=['virt_member_func_ptr = 0x[0-9a-z]+']) + patterns=['virt_member_func_ptr = 0x[0-9a-z]+$'])