[Lldb-commits] [lldb] [lldb] Support MS style `struct`/`class` in C++ name parser (PR #196525)

via lldb-commits lldb-commits at lists.llvm.org
Thu Jun 18 08:12:48 PDT 2026


https://github.com/Nerixyz updated https://github.com/llvm/llvm-project/pull/196525

>From 25649c7bf1717509d06fe27db94ed74768c78076 Mon Sep 17 00:00:00 2001
From: Nerixyz <nerixdev at outlook.de>
Date: Fri, 8 May 2026 14:52:39 +0200
Subject: [PATCH 1/2] [lldb] Support MS style `struct`/`class` in C++ name
 parser

---
 .../Language/CPlusPlus/CPlusPlusNameParser.cpp     | 14 ++++++++++++++
 .../Language/CPlusPlus/CPlusPlusLanguageTest.cpp   | 11 +++++++++++
 2 files changed, 25 insertions(+)

diff --git a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusNameParser.cpp b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusNameParser.cpp
index 4d283bb02e533..8eb536057a9d5 100644
--- a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusNameParser.cpp
+++ b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusNameParser.cpp
@@ -700,6 +700,20 @@ CPlusPlusNameParser::ParseFullNameImpl() {
         continue_parsing = false;
       }
       break;
+    case tok::kw_class:
+    case tok::kw_struct: // Microsoft: class Foo::Bar
+      if (state != State::Beginning) {
+        continue_parsing = false;
+        break;
+      }
+      Advance();
+      if (ConsumeToken(tok::raw_identifier)) {
+        state = State::AfterIdentifier;
+      } else {
+        TakeBack();
+        continue_parsing = false;
+      }
+      break;
     default:
       continue_parsing = false;
       break;
diff --git a/lldb/unittests/Language/CPlusPlus/CPlusPlusLanguageTest.cpp b/lldb/unittests/Language/CPlusPlus/CPlusPlusLanguageTest.cpp
index 41df35f67a790..49f598025f577 100644
--- a/lldb/unittests/Language/CPlusPlus/CPlusPlusLanguageTest.cpp
+++ b/lldb/unittests/Language/CPlusPlus/CPlusPlusLanguageTest.cpp
@@ -34,6 +34,11 @@ TEST(CPlusPlusLanguage, MethodNameParsing) {
        "foo::bar"},
       {"int foo::bar::func01(int a, double b)", "int", "foo::bar", "func01",
        "(int a, double b)", "", "foo::bar::func01"},
+      {"foo(struct AStruct)", "", "", "foo", "(struct AStruct)", "", "foo"},
+      {"struct AStruct a::b::c(class AClass)", "struct AStruct", "a::b", "c",
+       "(class AClass)", "", "a::b::c"},
+      {"struct ns::AStruct const & A::f(void) const",
+       "struct ns::AStruct const &", "A", "f", "(void)", "const", "A::f"},
 
       // Operators
       {"std::basic_ostream<char, std::char_traits<char> >& "
@@ -147,6 +152,12 @@ TEST(CPlusPlusLanguage, MethodNameParsing) {
       {"void foo<Bar[10]>()", "void", "", "foo<Bar[10]>", "()", "",
        "foo<Bar[10]>"},
       {"void foo<Bar[]>()", "void", "", "foo<Bar[]>", "()", "", "foo<Bar[]>"},
+      {"class std::_Func_base<bool, int> * std::_Func_class<bool, "
+       "int>::_Getimpl(void) const",
+       "class std::_Func_base<bool, int> *", "std::_Func_class<bool, int>",
+       "_Getimpl", "(void)", "const", "std::_Func_class<bool, int>::_Getimpl"},
+      {"struct AStruct foo<struct AStruct>(void)", "struct AStruct", "",
+       "foo<struct AStruct>", "(void)", "", "foo<struct AStruct>"},
 
       // auto return type
       {"auto std::test_return_auto<int>() const", "auto", "std",

>From afb45735e04b455ec1ea5a6f8f7ea4410acc0665 Mon Sep 17 00:00:00 2001
From: Nerixyz <nerixdev at outlook.de>
Date: Thu, 18 Jun 2026 17:12:26 +0200
Subject: [PATCH 2/2] fix: apply suggestions and add test for union/enum

---
 .../Plugins/Language/CPlusPlus/CPlusPlusNameParser.cpp   | 9 ++++++---
 .../Language/CPlusPlus/CPlusPlusLanguageTest.cpp         | 2 ++
 2 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusNameParser.cpp b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusNameParser.cpp
index 8eb536057a9d5..871548345a977 100644
--- a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusNameParser.cpp
+++ b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusNameParser.cpp
@@ -700,6 +700,8 @@ CPlusPlusNameParser::ParseFullNameImpl() {
         continue_parsing = false;
       }
       break;
+    case tok::kw_enum:
+    case tok::kw_union:
     case tok::kw_class:
     case tok::kw_struct: // Microsoft: class Foo::Bar
       if (state != State::Beginning) {
@@ -709,10 +711,11 @@ CPlusPlusNameParser::ParseFullNameImpl() {
       Advance();
       if (ConsumeToken(tok::raw_identifier)) {
         state = State::AfterIdentifier;
-      } else {
-        TakeBack();
-        continue_parsing = false;
+        break;
       }
+
+      TakeBack();
+      continue_parsing = false;
       break;
     default:
       continue_parsing = false;
diff --git a/lldb/unittests/Language/CPlusPlus/CPlusPlusLanguageTest.cpp b/lldb/unittests/Language/CPlusPlus/CPlusPlusLanguageTest.cpp
index 49f598025f577..037b6e087460a 100644
--- a/lldb/unittests/Language/CPlusPlus/CPlusPlusLanguageTest.cpp
+++ b/lldb/unittests/Language/CPlusPlus/CPlusPlusLanguageTest.cpp
@@ -39,6 +39,8 @@ TEST(CPlusPlusLanguage, MethodNameParsing) {
        "(class AClass)", "", "a::b::c"},
       {"struct ns::AStruct const & A::f(void) const",
        "struct ns::AStruct const &", "A", "f", "(void)", "const", "A::f"},
+      {"union AUnion A<enum AEnum>::fn(void)", "union AUnion", "A<enum AEnum>",
+       "fn", "(void)", "", "A<enum AEnum>::fn"},
 
       // Operators
       {"std::basic_ostream<char, std::char_traits<char> >& "



More information about the lldb-commits mailing list