[Lldb-commits] [lldb] 8b7a07a - [lldb] Fix abi_tag parsing for operator<< and operator-named tags (#170224)
via lldb-commits
lldb-commits at lists.llvm.org
Wed Dec 3 00:55:16 PST 2025
Author: Ebuka Ezike
Date: 2025-12-03T08:55:11Z
New Revision: 8b7a07a5f7e7b2a96417665f807cbf79a3161a76
URL: https://github.com/llvm/llvm-project/commit/8b7a07a5f7e7b2a96417665f807cbf79a3161a76
DIFF: https://github.com/llvm/llvm-project/commit/8b7a07a5f7e7b2a96417665f807cbf79a3161a76.diff
LOG: [lldb] Fix abi_tag parsing for operator<< and operator-named tags (#170224)
The parser now correctly handles:
- abi_tags attached to operator<<: `operator<<[abi:SOMETAG]`
- abi_tags with "operator" as the tag name: `func[abi:operator]`
Added:
Modified:
lldb/source/Plugins/Language/CPlusPlus/CPlusPlusNameParser.cpp
lldb/unittests/Language/CPlusPlus/CPlusPlusLanguageTest.cpp
Removed:
################################################################################
diff --git a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusNameParser.cpp b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusNameParser.cpp
index d8c095d6edeb7..4d283bb02e533 100644
--- a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusNameParser.cpp
+++ b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusNameParser.cpp
@@ -315,7 +315,7 @@ bool CPlusPlusNameParser::ConsumeAbiTag() {
// Consume the actual tag string (and allow some special characters)
while (ConsumeToken(tok::raw_identifier, tok::comma, tok::period,
- tok::numeric_constant))
+ tok::numeric_constant, tok::kw_operator))
;
if (!ConsumeToken(tok::r_square))
@@ -420,10 +420,11 @@ bool CPlusPlusNameParser::ConsumeOperator() {
// Make sure we have more tokens before attempting to look ahead one more.
if (m_next_token_index + 1 < m_tokens.size()) {
// Look ahead two tokens.
- clang::Token n_token = m_tokens[m_next_token_index + 1];
- // If we find ( or < then this is indeed operator<< no need for fix.
- if (n_token.getKind() != tok::l_paren && n_token.getKind() != tok::less) {
- clang::Token tmp_tok;
+ const clang::Token n_token = m_tokens[m_next_token_index + 1];
+ // If we find `(`, `<` or `[` then this is indeed operator<< no need for
+ // fix.
+ if (!n_token.isOneOf(tok::l_paren, tok::less, tok::l_square)) {
+ clang::Token tmp_tok{};
tmp_tok.startToken();
tmp_tok.setLength(1);
tmp_tok.setLocation(token.getLocation().getLocWithOffset(1));
diff --git a/lldb/unittests/Language/CPlusPlus/CPlusPlusLanguageTest.cpp b/lldb/unittests/Language/CPlusPlus/CPlusPlusLanguageTest.cpp
index c05418168e62e..41df35f67a790 100644
--- a/lldb/unittests/Language/CPlusPlus/CPlusPlusLanguageTest.cpp
+++ b/lldb/unittests/Language/CPlusPlus/CPlusPlusLanguageTest.cpp
@@ -69,6 +69,12 @@ TEST(CPlusPlusLanguage, MethodNameParsing) {
"const",
"std::__1::ranges::__begin::__fn::operator()[abi:v160000]<char const, "
"18ul>"},
+ {"bool Ball[abi:BALL]<int>::operator<<[abi:operator]<int>(int)", "bool",
+ "Ball[abi:BALL]<int>", "operator<<[abi:operator]<int>", "(int)", "",
+ "Ball[abi:BALL]<int>::operator<<[abi:operator]<int>"},
+ {"bool Ball[abi:BALL]<int>::operator>>[abi:operator]<int>(int)", "bool",
+ "Ball[abi:BALL]<int>", "operator>>[abi:operator]<int>", "(int)", "",
+ "Ball[abi:BALL]<int>::operator>>[abi:operator]<int>"},
// Internal classes
{"operator<<(Cls, Cls)::Subclass::function()", "",
"operator<<(Cls, Cls)::Subclass", "function", "()", "",
More information about the lldb-commits
mailing list