[Lldb-commits] [lldb] [lldb] Support MS style `struct`/`class` in C++ name parser (PR #196525)
via lldb-commits
lldb-commits at lists.llvm.org
Fri May 8 05:56:39 PDT 2026
https://github.com/Nerixyz created https://github.com/llvm/llvm-project/pull/196525
If a type is declared as a `class` or a `struct` is part of the mangled name in the Microsoft ABI. This is also reflected in the demangled name. There, it shows up before the qualified name. For example, you could have `class ns1::ns2::MyClass`. It will show up like this in return types and function/template arguments.
This adds a check in `CPlusPlusNameParser::ParseFullNameImpl` for these cases.
>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] [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",
More information about the lldb-commits
mailing list