Author: Nerixyz Date: 2026-07-07T21:47:33+02:00 New Revision: d8f56af5fecb3d431efa801b80a87a6547638fd8
URL: https://github.com/llvm/llvm-project/commit/d8f56af5fecb3d431efa801b80a87a6547638fd8 DIFF: https://github.com/llvm/llvm-project/commit/d8f56af5fecb3d431efa801b80a87a6547638fd8.diff LOG: [lldb] Support MS style `struct`/`class` in C++ name parser (#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. 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 4d283bb02e533..871548345a977 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusNameParser.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusNameParser.cpp @@ -700,6 +700,23 @@ 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) { + continue_parsing = false; + break; + } + Advance(); + if (ConsumeToken(tok::raw_identifier)) { + state = State::AfterIdentifier; + break; + } + + 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..9d9df77659be0 100644 --- a/lldb/unittests/Language/CPlusPlus/CPlusPlusLanguageTest.cpp +++ b/lldb/unittests/Language/CPlusPlus/CPlusPlusLanguageTest.cpp @@ -34,6 +34,18 @@ 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 foo(class a)", "", "", "struct foo", "(class a)", "", + "struct foo"}, + {"struct AStruct struct_foo(class class_::_AClass)", "struct AStruct", "", + "struct_foo", "(class class_::_AClass)", "", "struct_foo"}, + {"class_(enum_arg)", "", "", "class_", "(enum_arg)", "", "class_"}, + {"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"}, + {"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> >& " @@ -147,6 +159,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", _______________________________________________ lldb-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
