[Lldb-commits] [lldb] 90e8889 - [lldb] Fix CxxMethodName Parser on return type (#169652)
via lldb-commits
lldb-commits at lists.llvm.org
Thu Nov 27 07:09:09 PST 2025
Author: Ebuka Ezike
Date: 2025-11-27T15:09:05Z
New Revision: 90e8889a6394e29843ba903eff45ca03f877a6dd
URL: https://github.com/llvm/llvm-project/commit/90e8889a6394e29843ba903eff45ca03f877a6dd
DIFF: https://github.com/llvm/llvm-project/commit/90e8889a6394e29843ba903eff45ca03f877a6dd.diff
LOG: [lldb] Fix CxxMethodName Parser on return type (#169652)
The simplified parser incorrectly assumes if there is a context, there
is no return type.
Fixed the case where functions have both a context and a return type.
For example,
`int foo::bar::func()`
`Type<int> foo::bar::func()`
Also fixed the case where there is no space between the context and
return.
`std::vector<int>foo::bar()`
Added:
Modified:
lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
lldb/unittests/Language/CPlusPlus/CPlusPlusLanguageTest.cpp
Removed:
################################################################################
diff --git a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
index 4b66ff814935a..a3624accf9b5a 100644
--- a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
+++ b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
@@ -208,6 +208,20 @@ static bool IsTrivialBasename(const llvm::StringRef &basename) {
return idx == basename.size();
}
+/// A context is trivial if an only if it matches this pattern.
+/// "^\s*([A-Za-z_:]*)\s*$". for example function `foo::bar::func()`
+/// has a trivial context but. but `foo<int>::bar::func()` doesn't.
+static bool IsTrivialContext(llvm::StringRef context) {
+ // remove trailing or leading whitespace.
+ context = context.trim();
+
+ const auto iter = context.find_if_not([](char current) {
+ return std::isalnum(static_cast<unsigned char>(current)) ||
+ current == '_' || current == ':';
+ });
+ return iter == llvm::StringRef::npos;
+}
+
/// Writes out the function name in 'full_name' to 'out_stream'
/// but replaces each argument type with the variable name
/// and the corresponding pretty-printed value
@@ -481,18 +495,17 @@ bool CPlusPlusLanguage::CxxMethodName::TrySimplifiedParse() {
m_basename = full.substr(basename_begin, basename_end - basename_begin);
}
- if (IsTrivialBasename(m_basename)) {
+ if (IsTrivialBasename(m_basename) && IsTrivialContext(m_context)) {
return true;
- } else {
- // The C++ basename doesn't match our regular expressions so this can't
- // be a valid C++ method, clear everything out and indicate an error
- m_context = llvm::StringRef();
- m_basename = llvm::StringRef();
- m_arguments = llvm::StringRef();
- m_qualifiers = llvm::StringRef();
- m_return_type = llvm::StringRef();
- return false;
}
+ // The C++ basename doesn't match our regular expressions so this can't
+ // be a valid C++ method, clear everything out and indicate an error
+ m_context = llvm::StringRef();
+ m_basename = llvm::StringRef();
+ m_arguments = llvm::StringRef();
+ m_qualifiers = llvm::StringRef();
+ m_return_type = llvm::StringRef();
+ return false;
}
return false;
}
diff --git a/lldb/unittests/Language/CPlusPlus/CPlusPlusLanguageTest.cpp b/lldb/unittests/Language/CPlusPlus/CPlusPlusLanguageTest.cpp
index 23f2f4218601a..c05418168e62e 100644
--- a/lldb/unittests/Language/CPlusPlus/CPlusPlusLanguageTest.cpp
+++ b/lldb/unittests/Language/CPlusPlus/CPlusPlusLanguageTest.cpp
@@ -30,6 +30,10 @@ TEST(CPlusPlusLanguage, MethodNameParsing) {
{"foo::~bar(baz)", "", "foo", "~bar", "(baz)", "", "foo::~bar"},
{"a::b::c::d(e,f)", "", "a::b::c", "d", "(e,f)", "", "a::b::c::d"},
{"void f(int)", "void", "", "f", "(int)", "", "f"},
+ {"std::vector<int>foo::bar()", "std::vector<int>", "foo", "bar", "()", "",
+ "foo::bar"},
+ {"int foo::bar::func01(int a, double b)", "int", "foo::bar", "func01",
+ "(int a, double b)", "", "foo::bar::func01"},
// Operators
{"std::basic_ostream<char, std::char_traits<char> >& "
@@ -101,6 +105,8 @@ TEST(CPlusPlusLanguage, MethodNameParsing) {
"std::forward<decltype(nullptr)>"},
// Templates
+ {"vector<int > foo::bar::func(int)", "vector<int >", "foo::bar", "func",
+ "(int)", "", "foo::bar::func"},
{"void llvm::PM<llvm::Module, llvm::AM<llvm::Module>>::"
"addPass<llvm::VP>(llvm::VP)",
"void", "llvm::PM<llvm::Module, llvm::AM<llvm::Module>>",
More information about the lldb-commits
mailing list