https://github.com/charles-zablit updated 
https://github.com/llvm/llvm-project/pull/150999

>From 9b3551c6dbf8629c49f2bf3ed3f34e7b4e52e65f Mon Sep 17 00:00:00 2001
From: Charles Zablit <c_zab...@apple.com>
Date: Mon, 28 Jul 2025 18:58:44 +0200
Subject: [PATCH 1/3] [lldb] add TemplateRange and NameQualifiersRange to
 DemangledNameInfo

---
 lldb/docs/use/formatting.rst               |   3 +
 lldb/include/lldb/Core/DemangledNameInfo.h |  25 ++
 lldb/include/lldb/Core/FormatEntity.h      |   1 +
 lldb/source/Core/FormatEntity.cpp          |   3 +
 lldb/unittests/Core/MangledTest.cpp        | 259 ++++++++++++++-------
 5 files changed, 213 insertions(+), 78 deletions(-)

diff --git a/lldb/docs/use/formatting.rst b/lldb/docs/use/formatting.rst
index 39ccfed30a2ca..0b60f1e193acb 100644
--- a/lldb/docs/use/formatting.rst
+++ b/lldb/docs/use/formatting.rst
@@ -89,6 +89,8 @@ A complete list of currently supported format string 
variables is listed below:
 
+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
 | ``function.name-without-args``                    | The name of the current 
function without arguments and values (used to include a function name in-line 
in the ``disassembly-format``)                                                  
                                                                                
                     |
 
+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| ``function.name-qualifiers``                      | Any qualifiers added 
after the name of a function and before its arguments or template arguments.    
                                                                                
                                                                                
                       |
++---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
 | ``function.basename``                             | The basename of the 
current function depending on the frame's language. E.g., for C++ the basename 
for ``void ns::foo<float>::bar<int>(int) const`` is ``bar``.                    
                                                                                
                         |
 
+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
 | ``function.prefix``                               | Any prefix added to the 
demangled function name of the current function. This depends on the frame's 
language. E.g., for C++ the prefix will always be empty.                        
                                                                                
                       |
@@ -332,6 +334,7 @@ The function names displayed in backtraces/``frame 
info``/``thread info`` are th
 - ``${function.prefix}``
 - ``${function.scope}``
 - ``${function.basename}``
+- ``${function.name-qualifiers}``
 - ``${function.template-arguments}``
 - ``${function.formatted-arguments}``
 - ``${function.qualifiers}``
diff --git a/lldb/include/lldb/Core/DemangledNameInfo.h 
b/lldb/include/lldb/Core/DemangledNameInfo.h
index 9f567232dc50f..bdfcb488c2e01 100644
--- a/lldb/include/lldb/Core/DemangledNameInfo.h
+++ b/lldb/include/lldb/Core/DemangledNameInfo.h
@@ -30,6 +30,16 @@ struct DemangledNameInfo {
   /// \endcode
   std::pair<size_t, size_t> BasenameRange;
 
+  /// A [start, end) pair for the function template arguments.
+  /// The basename is the name without scope qualifiers
+  /// and without template parameters. E.g.,
+  /// \code{.cpp}
+  ///    void foo::bar<int>::someFunc<float>(int) const &&
+  ///                                ^     ^
+  ///                              start  end
+  /// \endcode
+  std::pair<size_t, size_t> TemplateRange;
+
   /// A [start, end) pair for the function scope qualifiers.
   /// E.g., for
   /// \code{.cpp}
@@ -59,6 +69,11 @@ struct DemangledNameInfo {
   /// \endcode
   std::pair<size_t, size_t> QualifiersRange;
 
+  /// Indicates the [start, end) of the function's name qualifiers. This is a
+  /// catch-all range for anything in between the basename and the arguments,
+  /// that is not tracked by the rest of the pairs.
+  std::pair<size_t, size_t> NameQualifiersRange;
+
   /// Indicates the [start, end) of the function's prefix. This is a
   /// catch-all range for anything that is not tracked by the rest of
   /// the pairs.
@@ -75,6 +90,11 @@ struct DemangledNameInfo {
     return BasenameRange.second > BasenameRange.first;
   }
 
+  /// Returns \c true if this object holds a valid template range.
+  bool hasTemplate() const {
+    return TemplateRange.second >= TemplateRange.first;
+  }
+
   /// Returns \c true if this object holds a valid scope range.
   bool hasScope() const { return ScopeRange.second >= ScopeRange.first; }
 
@@ -88,6 +108,11 @@ struct DemangledNameInfo {
     return QualifiersRange.second >= QualifiersRange.first;
   }
 
+  /// Returns \c true if this object holds a valid name qualifiers range.
+  bool hasNameQualifiers() const {
+    return NameQualifiersRange.second >= NameQualifiersRange.first;
+  }
+
   /// Returns \c true if this object holds a valid prefix range.
   bool hasPrefix() const { return PrefixRange.second >= PrefixRange.first; }
 
diff --git a/lldb/include/lldb/Core/FormatEntity.h 
b/lldb/include/lldb/Core/FormatEntity.h
index 17fee068230b2..d602edffb4c88 100644
--- a/lldb/include/lldb/Core/FormatEntity.h
+++ b/lldb/include/lldb/Core/FormatEntity.h
@@ -91,6 +91,7 @@ struct Entry {
     FunctionPrefix,
     FunctionScope,
     FunctionBasename,
+    FunctionNameQualifiers,
     FunctionTemplateArguments,
     FunctionFormattedArguments,
     FunctionReturnLeft,
diff --git a/lldb/source/Core/FormatEntity.cpp 
b/lldb/source/Core/FormatEntity.cpp
index 370b51e726ec2..5d3c8b421d5d1 100644
--- a/lldb/source/Core/FormatEntity.cpp
+++ b/lldb/source/Core/FormatEntity.cpp
@@ -128,6 +128,7 @@ constexpr Definition g_function_child_entries[] = {
     Definition("prefix", EntryType::FunctionPrefix),
     Definition("scope", EntryType::FunctionScope),
     Definition("basename", EntryType::FunctionBasename),
+    Definition("name-qualifiers", EntryType::FunctionNameQualifiers),
     Definition("template-arguments", EntryType::FunctionTemplateArguments),
     Definition("formatted-arguments", EntryType::FunctionFormattedArguments),
     Definition("return-left", EntryType::FunctionReturnLeft),
@@ -390,6 +391,7 @@ const char *FormatEntity::Entry::TypeToCString(Type t) {
     ENUM_TO_CSTR(FunctionPrefix);
     ENUM_TO_CSTR(FunctionScope);
     ENUM_TO_CSTR(FunctionBasename);
+    ENUM_TO_CSTR(FunctionNameQualifiers);
     ENUM_TO_CSTR(FunctionTemplateArguments);
     ENUM_TO_CSTR(FunctionFormattedArguments);
     ENUM_TO_CSTR(FunctionReturnLeft);
@@ -1842,6 +1844,7 @@ bool FormatEntity::Format(const Entry &entry, Stream &s,
   case Entry::Type::FunctionPrefix:
   case Entry::Type::FunctionScope:
   case Entry::Type::FunctionBasename:
+  case Entry::Type::FunctionNameQualifiers:
   case Entry::Type::FunctionTemplateArguments:
   case Entry::Type::FunctionFormattedArguments:
   case Entry::Type::FunctionReturnRight:
diff --git a/lldb/unittests/Core/MangledTest.cpp 
b/lldb/unittests/Core/MangledTest.cpp
index 4bda657047541..7d273a46f1174 100644
--- a/lldb/unittests/Core/MangledTest.cpp
+++ b/lldb/unittests/Core/MangledTest.cpp
@@ -435,142 +435,202 @@ struct DemanglingPartsTestCase {
 DemanglingPartsTestCase g_demangling_parts_test_cases[] = {
     // clang-format off
    { 
"_ZNVKO3BarIN2ns3QuxIiEEE1CIPFi3FooIS_IiES6_EEE6methodIS6_EENS5_IT_SC_E5InnerIiEESD_SD_",
-     { /*.BasenameRange=*/{92, 98}, /*.ScopeRange=*/{36, 92}, 
/*.ArgumentsRange=*/{ 108, 158 },
-       /*.QualifiersRange=*/{158, 176}, /*.PrefixRange=*/{0, 0}, 
/*.SuffixRange=*/{0, 0} },
+     {
+       /*.BasenameRange=*/{92, 98}, /*.TemplateRange=*/{0, 0}, 
/*.ScopeRange=*/{36, 92},
+       /*.ArgumentsRange=*/{108, 158}, /*.QualifiersRange=*/{158, 176}, 
/*.NameQualifiersRange=*/{0, 0},
+       /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0}
+     },
      /*.basename=*/"method",
      /*.scope=*/"Bar<ns::Qux<int>>::C<int (*)(Foo<Bar<int>, Bar<int>>)>::",
      /*.qualifiers=*/" const volatile &&"
    },
    { "_Z7getFuncIfEPFiiiET_",
-     { /*.BasenameRange=*/{6, 13}, /*.ScopeRange=*/{6, 6}, 
/*.ArgumentsRange=*/{ 20, 27 },
-       /*.QualifiersRange=*/{38, 38}, /*.PrefixRange=*/{0, 0}, 
/*.SuffixRange=*/{0, 0} },
+     {
+       /*.BasenameRange=*/{6, 13}, /*.TemplateRange=*/{0, 0}, 
/*.ScopeRange=*/{6, 6},
+       /*.ArgumentsRange=*/{20, 27}, /*.QualifiersRange=*/{38, 38}, 
/*.NameQualifiersRange=*/{0, 0},
+       /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0}
+     },
      /*.basename=*/"getFunc",
      /*.scope=*/"",
      /*.qualifiers=*/""
    },
    { "_ZN1f1b1c1gEv",
-     { /*.BasenameRange=*/{9, 10}, /*.ScopeRange=*/{0, 9}, 
/*.ArgumentsRange=*/{ 10, 12 },
-       /*.QualifiersRange=*/{12, 12}, /*.PrefixRange=*/{0, 0}, 
/*.SuffixRange=*/{0, 0} },
+     {
+       /*.BasenameRange=*/{9, 10}, /*.TemplateRange=*/{0, 0}, 
/*.ScopeRange=*/{0, 9},
+       /*.ArgumentsRange=*/{10, 12}, /*.QualifiersRange=*/{12, 12}, 
/*.NameQualifiersRange=*/{0, 0},
+       /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0}
+     },
      /*.basename=*/"g",
      /*.scope=*/"f::b::c::",
      /*.qualifiers=*/""
    },
    { "_ZN5test73fD1IiEEDTcmtlNS_1DEL_ZNS_1bEEEcvT__EES2_",
-     { /*.BasenameRange=*/{45, 48}, /*.ScopeRange=*/{38, 45}, 
/*.ArgumentsRange=*/{ 53, 58 },
-       /*.QualifiersRange=*/{58, 58}, /*.PrefixRange=*/{0, 0}, 
/*.SuffixRange=*/{0, 0} },
+     {
+       /*.BasenameRange=*/{45, 48}, /*.TemplateRange=*/{0, 0}, 
/*.ScopeRange=*/{38, 45},
+       /*.ArgumentsRange=*/{53, 58}, /*.QualifiersRange=*/{58, 58}, 
/*.NameQualifiersRange=*/{0, 0},
+       /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0}
+     },
      /*.basename=*/"fD1",
      /*.scope=*/"test7::",
      /*.qualifiers=*/""
    },
    { "_ZN5test73fD1IiEEDTcmtlNS_1DEL_ZNS_1bINDT1cE1dEEEEEcvT__EES2_",
-     { /*.BasenameRange=*/{61, 64}, /*.ScopeRange=*/{54, 61}, 
/*.ArgumentsRange=*/{ 69, 79 },
-       /*.QualifiersRange=*/{79, 79}, /*.PrefixRange=*/{0, 0}, 
/*.SuffixRange=*/{0, 0} },
+     {
+       /*.BasenameRange=*/{61, 64}, /*.TemplateRange=*/{0, 
0},/*.ScopeRange=*/{54, 61},
+       /*.ArgumentsRange=*/{69, 79}, /*.QualifiersRange=*/{79, 79}, 
/*.NameQualifiersRange=*/{0, 0},
+       /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0}
+     },
      /*.basename=*/"fD1",
      /*.scope=*/"test7::",
      /*.qualifiers=*/""
    },
    { 
"_ZN5test7INDT1cE1dINDT1cE1dEEEE3fD1INDT1cE1dINDT1cE1dEEEEEDTcmtlNS_1DEL_ZNS_1bINDT1cE1dEEEEEcvT__EES2_",
-     { /*.BasenameRange=*/{120, 123}, /*.ScopeRange=*/{81, 120}, 
/*.ArgumentsRange=*/{ 155, 168 },
-       /*.QualifiersRange=*/{168, 168}, /*.PrefixRange=*/{0, 0}, 
/*.SuffixRange=*/{0, 0} },
+     {
+       /*.BasenameRange=*/{120, 123}, /*.TemplateRange=*/{0, 0}, 
/*.ScopeRange=*/{81, 120},
+       /*.ArgumentsRange=*/{155, 168}, /*.QualifiersRange=*/{168, 168}, 
/*.NameQualifiersRange=*/{0, 0},
+       /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0}
+     },
      /*.basename=*/"fD1",
      /*.scope=*/"test7<decltype(c)::d<decltype(c)::d>>::",
      /*.qualifiers=*/""
    },
    { 
"_ZN8nlohmann16json_abi_v3_11_310basic_jsonINSt3__13mapENS2_6vectorENS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEbxydS8_NS0_14adl_serializerENS4_IhNS8_IhEEEEvE5parseIRA29_KcEESE_OT_NS2_8functionIFbiNS0_6detail13parse_event_tERSE_EEEbb",
-     { /*.BasenameRange=*/{687, 692}, /*.ScopeRange=*/{343, 687}, 
/*.ArgumentsRange=*/{ 713, 1174 },
-       /*.QualifiersRange=*/{1174, 1174}, /*.PrefixRange=*/{0, 0}, 
/*.SuffixRange=*/{0, 0} },
+     {
+       /*.BasenameRange=*/{687, 692}, /*.TemplateRange=*/{0, 0}, 
/*.ScopeRange=*/{343, 687},
+       /*.ArgumentsRange=*/{713, 1174}, /*.QualifiersRange=*/{1174, 1174}, 
/*.NameQualifiersRange=*/{0, 0},
+       /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0}
+     },
      /*.basename=*/"parse",
      /*.scope=*/"nlohmann::json_abi_v3_11_3::basic_json<std::__1::map, 
std::__1::vector, std::__1::basic_string<char, std::__1::char_traits<char>, 
std::__1::allocator<char>>, bool, long long, unsigned long long, double, 
std::__1::allocator, nlohmann::json_abi_v3_11_3::adl_serializer, 
std::__1::vector<unsigned char, std::__1::allocator<unsigned char>>, void>::",
      /*.qualifiers=*/""
    },
    { 
"_ZN8nlohmann16json_abi_v3_11_310basic_jsonINSt3__13mapENS2_6vectorENS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEbxydS8_NS0_14adl_serializerENS4_IhNS8_IhEEEEvEC1EDn",
-     { /*.BasenameRange=*/{344, 354}, /*.ScopeRange=*/{0, 344}, 
/*.ArgumentsRange=*/{ 354, 370 },
-       /*.QualifiersRange=*/{370, 370}, /*.PrefixRange=*/{0, 0}, 
/*.SuffixRange=*/{0, 0} },
+     {
+       /*.BasenameRange=*/{344, 354}, /*.TemplateRange=*/{0, 0}, 
/*.ScopeRange=*/{0, 344},
+       /*.ArgumentsRange=*/{354, 370}, /*.QualifiersRange=*/{370, 370}, 
/*.NameQualifiersRange=*/{0, 0},
+       /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0}
+     },
      /*.basename=*/"basic_json",
      /*.scope=*/"nlohmann::json_abi_v3_11_3::basic_json<std::__1::map, 
std::__1::vector, std::__1::basic_string<char, std::__1::char_traits<char>, 
std::__1::allocator<char>>, bool, long long, unsigned long long, double, 
std::__1::allocator, nlohmann::json_abi_v3_11_3::adl_serializer, 
std::__1::vector<unsigned char, std::__1::allocator<unsigned char>>, void>::",
      /*.qualifiers=*/""
    },
    { "_Z3fppIiEPFPFvvEiEf",
-     { /*.BasenameRange=*/{10, 13}, /*.ScopeRange=*/{10, 10}, 
/*.ArgumentsRange=*/{ 18, 25 },
-      /*.QualifiersRange=*/{34,34}, /*.PrefixRange=*/{0, 0}, 
/*.SuffixRange=*/{0, 0} },
+     {
+       /*.BasenameRange=*/{10, 13}, /*.TemplateRange=*/{0, 0}, 
/*.ScopeRange=*/{10, 10},
+      /*.ArgumentsRange=*/{18, 25}, /*.QualifiersRange=*/{34,34}, 
/*.NameQualifiersRange=*/{0, 0},
+      /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0}
+     },
      /*.basename=*/"fpp",
      /*.scope=*/"",
      /*.qualifiers=*/""
    },
    { "_Z3fppIiEPFPFvvEN2ns3FooIiEEEf",
-     { /*.BasenameRange=*/{10, 13}, /*.ScopeRange=*/{10, 10}, 
/*.ArgumentsRange=*/{ 18, 25 },
-       /*.QualifiersRange=*/{43, 43}, /*.PrefixRange=*/{0, 0}, 
/*.SuffixRange=*/{0, 0} },
+     {
+       /*.BasenameRange=*/{10, 13}, /*.TemplateRange=*/{0, 0}, 
/*.ScopeRange=*/{10, 10},
+       /*.ArgumentsRange=*/{18, 25}, /*.QualifiersRange=*/{43, 43}, 
/*.NameQualifiersRange=*/{0, 0},
+       /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0}
+     },
      /*.basename=*/"fpp",
      /*.scope=*/"",
      /*.qualifiers=*/""
    },
    { "_Z3fppIiEPFPFvPFN2ns3FooIiEENS2_3BarIfE3QuxEEEPFS2_S2_EEf",
-     { /*.BasenameRange=*/{10, 13}, /*.ScopeRange=*/{10, 10}, 
/*.ArgumentsRange=*/{ 18, 25 },
-       /*.QualifiersRange=*/{108, 108}, /*.PrefixRange=*/{0, 0}, 
/*.SuffixRange=*/{0, 0} },
+     {
+       /*.BasenameRange=*/{10, 13}, /*.TemplateRange=*/{0, 0}, 
/*.ScopeRange=*/{10, 10},
+       /*.ArgumentsRange=*/{18, 25}, /*.QualifiersRange=*/{108, 108}, 
/*.NameQualifiersRange=*/{0, 0},
+       /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0}
+     },
      /*.basename=*/"fpp",
      /*.scope=*/"",
      /*.qualifiers=*/""
    },
    { "_ZN2ns8HasFuncsINS_3FooINS1_IiE3BarIfE3QuxEEEE3fppIiEEPFPFvvEiEf",
-     { /*.BasenameRange=*/{64, 67}, /*.ScopeRange=*/{10, 64}, 
/*.ArgumentsRange=*/{ 72, 79 },
-       /*.QualifiersRange=*/{88, 88}, /*.PrefixRange=*/{0, 0}, 
/*.SuffixRange=*/{0, 0} },
+     {
+       /*.BasenameRange=*/{64, 67}, /*.TemplateRange=*/{0, 0}, 
/*.ScopeRange=*/{10, 64},
+       /*.ArgumentsRange=*/{72, 79}, /*.QualifiersRange=*/{88, 88}, 
/*.NameQualifiersRange=*/{0, 0},
+       /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0}
+     },
      /*.basename=*/"fpp",
      /*.scope=*/"ns::HasFuncs<ns::Foo<ns::Foo<int>::Bar<float>::Qux>>::",
      /*.qualifiers=*/""
    },
    { "_ZN2ns8HasFuncsINS_3FooINS1_IiE3BarIfE3QuxEEEE3fppIiEEPFPFvvES2_Ef",
-     { /*.BasenameRange=*/{64, 67}, /*.ScopeRange=*/{10, 64}, 
/*.ArgumentsRange=*/{ 72, 79 },
-       /*.QualifiersRange=*/{97, 97}, /*.PrefixRange=*/{0, 0}, 
/*.SuffixRange=*/{0, 0} },
+     {
+       /*.BasenameRange=*/{64, 67}, /*.TemplateRange=*/{0, 0}, 
/*.ScopeRange=*/{10, 64},
+       /*.ArgumentsRange=*/{72, 79}, /*.QualifiersRange=*/{97, 97}, 
/*.NameQualifiersRange=*/{0, 0},
+       /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0}
+     },
      /*.basename=*/"fpp",
      /*.scope=*/"ns::HasFuncs<ns::Foo<ns::Foo<int>::Bar<float>::Qux>>::",
      /*.qualifiers=*/"",
    },
    { 
"_ZN2ns8HasFuncsINS_3FooINS1_IiE3BarIfE3QuxEEEE3fppIiEEPFPFvPFS2_S5_EEPFS2_S2_EEf",
-     { /*.BasenameRange=*/{64, 67}, /*.ScopeRange=*/{10, 64}, 
/*.ArgumentsRange=*/{ 72, 79 },
-       /*.QualifiersRange=*/{162, 162}, /*.PrefixRange=*/{0, 0}, 
/*.SuffixRange=*/{0, 0} },
+     {
+       /*.BasenameRange=*/{64, 67}, /*.TemplateRange=*/{0, 0}, 
/*.ScopeRange=*/{10, 64},
+       /*.ArgumentsRange=*/{72, 79}, /*.QualifiersRange=*/{162, 162}, 
/*.NameQualifiersRange=*/{0, 0},
+       /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0}
+     },
      /*.basename=*/"fpp",
      /*.scope=*/"ns::HasFuncs<ns::Foo<ns::Foo<int>::Bar<float>::Qux>>::",
      /*.qualifiers=*/"",
    },
    { "_ZNKO2ns3ns23Bar3fooIiEEPFPFNS0_3FooIiEEiENS3_IfEEEi",
-     { /*.BasenameRange=*/{37, 40}, /*.ScopeRange=*/{23, 37}, 
/*.ArgumentsRange=*/{ 45, 50 },
-       /*.QualifiersRange=*/{78, 87}, /*.PrefixRange=*/{0, 0}, 
/*.SuffixRange=*/{0, 0} },
+     {
+       /*.BasenameRange=*/{37, 40}, /*.TemplateRange=*/{0, 0}, 
/*.ScopeRange=*/{23, 37},
+       /*.ArgumentsRange=*/{45, 50}, /*.QualifiersRange=*/{78, 87}, 
/*.NameQualifiersRange=*/{0, 0},
+       /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0}
+     },
      /*.basename=*/"foo",
      /*.scope=*/"ns::ns2::Bar::",
      /*.qualifiers=*/" const &&",
    },
    { "_ZTV11ImageLoader",
-     { /*.BasenameRange=*/{0, 0}, /*.ScopeRange=*/{0, 0}, 
/*.ArgumentsRange=*/{ 0, 0 },
-       /*.QualifiersRange=*/{0, 0}, /*.PrefixRange=*/{0, 0}, 
/*.SuffixRange=*/{0, 0} },
+     {
+       /*.BasenameRange=*/{0, 0}, /*.TemplateRange=*/{0, 0}, 
/*.ScopeRange=*/{0, 0},
+       /*.ArgumentsRange=*/{0, 0}, /*.QualifiersRange=*/{0, 0}, 
/*.NameQualifiersRange=*/{0, 0},
+       /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0}
+     },
      /*.basename=*/"",
      /*.scope=*/"",
      /*.qualifiers=*/"",
      /*.valid_basename=*/false
    },
    { 
"___ZNK5dyld313MachOAnalyzer18forEachInitializerER11DiagnosticsRKNS0_15VMAddrConverterEU13block_pointerFvjEPKv_block_invoke.204",
-     { /*.BasenameRange=*/{55, 73}, /*.ScopeRange=*/{33, 55}, 
/*.ArgumentsRange=*/{ 73, 181 },
-       /*.QualifiersRange=*/{181, 187}, /*.PrefixRange=*/{0, 0}, 
/*.SuffixRange=*/{0, 0} },
+     {
+       /*.BasenameRange=*/{55, 73}, /*.TemplateRange=*/{0, 0}, 
/*.ScopeRange=*/{33, 55},
+       /*.ArgumentsRange=*/{73, 181}, /*.QualifiersRange=*/{181, 187}, 
/*.NameQualifiersRange=*/{0, 0},
+       /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0}
+     },
      /*.basename=*/"forEachInitializer",
      /*.scope=*/"dyld3::MachOAnalyzer::",
      /*.qualifiers=*/" const",
    },
    { "_ZZN5dyld45startEPNS_10KernelArgsEPvS2_ENK3$_1clEv",
-     { /*.BasenameRange=*/{53, 63}, /*.ScopeRange=*/{0, 53}, 
/*.ArgumentsRange=*/{ 63, 65 },
-       /*.QualifiersRange=*/{65, 71}, /*.PrefixRange=*/{0, 0}, 
/*.SuffixRange=*/{0, 0} },
+     {
+       /*.BasenameRange=*/{53, 63}, /*.TemplateRange=*/{0, 0}, 
/*.ScopeRange=*/{0, 53},
+       /*.ArgumentsRange=*/{63, 65}, /*.QualifiersRange=*/{65, 71}, 
/*.NameQualifiersRange=*/{0, 0},
+       /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0}
+     },
      /*.basename=*/"operator()",
      /*.scope=*/"dyld4::start(dyld4::KernelArgs*, void*, void*)::$_1::",
      /*.qualifiers=*/" const",
    },
    { 
"_ZZNK5dyld46Loader38runInitializersBottomUpPlusUpwardLinksERNS_12RuntimeStateEENK3$_0clEv",
-     { /*.BasenameRange=*/{88, 98}, /*.ScopeRange=*/{0, 88}, 
/*.ArgumentsRange=*/{ 98, 100 },
-       /*.QualifiersRange=*/{100, 106}, /*.PrefixRange=*/{0, 0}, 
/*.SuffixRange=*/{0, 0} },
+     {
+       /*.BasenameRange=*/{88, 98}, /*.TemplateRange=*/{0, 0}, 
/*.ScopeRange=*/{0, 88},
+       /*.ArgumentsRange=*/{98, 100}, /*.QualifiersRange=*/{100, 106}, 
/*.NameQualifiersRange=*/{0, 0},
+       /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0}
+     },
      /*.basename=*/"operator()",
      
/*.scope=*/"dyld4::Loader::runInitializersBottomUpPlusUpwardLinks(dyld4::RuntimeState&)
 const::$_0::",
      /*.qualifiers=*/" const",
    },
    { 
"_ZZNK5dyld46Loader38runInitializersBottomUpPlusUpwardLinksERNS_12RuntimeStateEENK3$_0clEv.cold",
-     { /*.BasenameRange=*/{88, 98}, /*.ScopeRange=*/{0, 88}, 
/*.ArgumentsRange=*/{ 98, 100 },
-       /*.QualifiersRange=*/{100, 106}, /*.PrefixRange=*/{0, 0}, 
/*.SuffixRange=*/{0, 0} },
+     {
+       /*.BasenameRange=*/{88, 98}, /*.TemplateRange=*/{0, 0}, 
/*.ScopeRange=*/{0, 88},
+       /*.ArgumentsRange=*/{98, 100}, /*.QualifiersRange=*/{100, 106}, 
/*.NameQualifiersRange=*/{0, 0},
+       /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0}
+     },
      /*.basename=*/"operator()",
      
/*.scope=*/"dyld4::Loader::runInitializersBottomUpPlusUpwardLinks(dyld4::RuntimeState&)
 const::$_0::",
      /*.qualifiers=*/" const",
@@ -638,57 +698,97 @@ INSTANTIATE_TEST_SUITE_P(DemanglingPartsTests, 
DemanglingPartsTestFixture,
 struct DemangledNameInfoTestCase {
   DemangledNameInfo expected_info;
   bool valid_basename;
+  bool valid_template;
   bool valid_scope;
   bool valid_arguments;
   bool valid_qualifiers;
+  bool valid_name_qualifiers;
   bool valid_prefix;
   bool valid_suffix;
 };
 
 DemangledNameInfoTestCase g_demangled_name_info_test_cases[] = {
     // clang-format off
-   {
-    { /*.BasenameRange=*/{0, 10}, /*.ScopeRange=*/{1, 0}, 
/*.ArgumentsRange=*/{1, 0},
-      /*.QualifiersRange=*/{1, 0}, /*.PrefixRange=*/{1, 0}, 
/*.SuffixRange=*/{1, 0}
+  {
+    {
+      /*.BasenameRange=*/{0, 10}, /*.TemplateRange=*/{1, 0}, 
/*.ScopeRange=*/{1, 0},
+      /*.ArgumentsRange=*/{1, 0}, /*.QualifiersRange=*/{1, 0}, 
/*.NameQualifiersRange=*/{1, 0}, /*.PrefixRange=*/{1, 0},
+      /*.SuffixRange=*/{1, 0}
     },
-      /*valid_basename=*/true, /*valid_scope=*/false, 
/*valid_arguments=*/false,
-      /*valid_qualifiers=*/false, /*valid_prefix=*/false, 
/*valid_suffix=*/false,
-   },
-   {
-    { /*.BasenameRange=*/{1, 0}, /*.ScopeRange=*/{0, 10}, 
/*.ArgumentsRange=*/{1, 0},
-      /*.QualifiersRange=*/{1, 0}, /*.PrefixRange=*/{1, 0}, 
/*.SuffixRange=*/{1, 0}
+    /*valid_basename=*/true, /*valid_template=*/false, /*valid_scope=*/false,
+    /*valid_arguments=*/false, /*valid_qualifiers=*/false, 
/*valid_name_qualifiers=*/false,
+    /*valid_prefix=*/false, /*valid_suffix=*/false,
+  },
+  {
+    {
+      /*.BasenameRange=*/{1, 0}, /*.TemplateRange=*/{0, 10}, 
/*.ScopeRange=*/{1, 0},
+      /*.ArgumentsRange=*/{1, 0}, /*.QualifiersRange=*/{1, 0}, 
/*.NameQualifiersRange=*/{1, 0}, /*.PrefixRange=*/{1, 0},
+      /*.SuffixRange=*/{1, 0}
     },
-      /*valid_basename=*/false, /*valid_scope=*/true, 
/*valid_arguments=*/false,
-      /*valid_qualifiers=*/false, /*valid_prefix=*/false, 
/*valid_suffix=*/false,
-   },
-   {
-    { /*.BasenameRange=*/{1, 0}, /*.ScopeRange=*/{1, 0}, 
/*.ArgumentsRange=*/{0, 10},
-      /*.QualifiersRange=*/{1, 0}, /*.PrefixRange=*/{1, 0}, 
/*.SuffixRange=*/{1, 0}
+    /*valid_basename=*/false, /*valid_name_qualifiers=*/true, 
/*valid_scope=*/false,
+    /*valid_arguments=*/false, /*valid_qualifiers=*/false, 
/*valid_name_qualifiers=*/false,
+    /*valid_prefix=*/false, /*valid_suffix=*/false,
+  },
+  {
+    {
+      /*.BasenameRange=*/{1, 0}, /*.TemplateRange=*/{1, 0}, 
/*.ScopeRange=*/{0, 10},
+      /*.ArgumentsRange=*/{1, 0}, /*.QualifiersRange=*/{1, 0}, 
/*.NameQualifiersRange=*/{1, 0}, /*.PrefixRange=*/{1, 0},
+      /*.SuffixRange=*/{1, 0}
     },
-      /*valid_basename=*/false, /*valid_scope=*/false, 
/*valid_arguments=*/true,
-      /*valid_qualifiers=*/false, /*valid_prefix=*/false, 
/*valid_suffix=*/false,
-   },
-   {
-    { /*.BasenameRange=*/{1, 0}, /*.ScopeRange=*/{1, 0}, 
/*.ArgumentsRange=*/{1, 0},
-      /*.QualifiersRange=*/{0, 10}, /*.PrefixRange=*/{1, 0}, 
/*.SuffixRange=*/{1, 0}
+    /*valid_basename=*/false, /*valid_template=*/false, /*valid_scope=*/true,
+    /*valid_arguments=*/false, /*valid_qualifiers=*/false, 
/*valid_name_qualifiers=*/false,
+    /*valid_prefix=*/false, /*valid_suffix=*/false,
+  },
+  {
+    {
+      /*.BasenameRange=*/{1, 0}, /*.TemplateRange=*/{1, 0}, 
/*.ScopeRange=*/{1, 0},
+      /*.ArgumentsRange=*/{0, 10}, /*.QualifiersRange=*/{1, 0}, 
/*.NameQualifiersRange=*/{1, 0}, /*.PrefixRange=*/{1, 0},
+      /*.SuffixRange=*/{1, 0}
     },
-      /*valid_basename=*/false, /*valid_scope=*/false, 
/*valid_arguments=*/false,
-      /*valid_qualifiers=*/true, /*valid_prefix=*/false, 
/*valid_suffix=*/false,
-   },
-   {
-    { /*.BasenameRange=*/{1, 0}, /*.ScopeRange=*/{1, 0}, 
/*.ArgumentsRange=*/{1, 0},
-      /*.QualifiersRange=*/{1, 0}, /*.PrefixRange=*/{0, 10}, 
/*.SuffixRange=*/{1, 0}
+    /*valid_basename=*/false, /*valid_template=*/false, /*valid_scope=*/false,
+    /*valid_arguments=*/true, /*valid_qualifiers=*/false, 
/*valid_name_qualifiers=*/false,
+    /*valid_prefix=*/false, /*valid_suffix=*/false,
+  },
+  {
+    {
+      /*.BasenameRange=*/{1, 0}, /*.TemplateRange=*/{1, 0}, 
/*.ScopeRange=*/{1, 0},
+      /*.ArgumentsRange=*/{1, 0}, /*.QualifiersRange=*/{0, 10}, 
/*.NameQualifiersRange=*/{1, 0}, /*.PrefixRange=*/{1, 0},
+      /*.SuffixRange=*/{1, 0}
     },
-      /*valid_basename=*/false, /*valid_scope=*/false, 
/*valid_arguments=*/false,
-      /*valid_qualifiers=*/false, /*valid_prefix=*/true, 
/*valid_suffix=*/false,
-   },
-   {
-    { /*.BasenameRange=*/{1, 0}, /*.ScopeRange=*/{1, 0}, 
/*.ArgumentsRange=*/{1, 0},
-      /*.QualifiersRange=*/{1, 0}, /*.PrefixRange=*/{1, 0}, 
/*.SuffixRange=*/{0, 10}
+    /*valid_basename=*/false, /*valid_template=*/false, /*valid_scope=*/false,
+    /*valid_arguments=*/false, /*valid_qualifiers=*/true, 
/*valid_name_qualifiers=*/false,
+    /*valid_prefix=*/false, /*valid_suffix=*/false,
+  },
+  {
+    {
+      /*.BasenameRange=*/{1, 0}, /*.TemplateRange=*/{1, 0}, 
/*.ScopeRange=*/{1, 0},
+      /*.ArgumentsRange=*/{1, 0}, /*.QualifiersRange=*/{1, 0}, 
/*.NameQualifiersRange=*/{0, 10}, /*.PrefixRange=*/{1, 0},
+      /*.SuffixRange=*/{1, 0}
     },
-      /*valid_basename=*/false, /*valid_scope=*/false, 
/*valid_arguments=*/false,
-      /*valid_qualifiers=*/false, /*valid_prefix=*/false, 
/*valid_suffix=*/true,
-   },
+    /*valid_basename=*/false, /*valid_template=*/false, /*valid_scope=*/false,
+    /*valid_arguments=*/false, /*valid_qualifiers=*/false, 
/*valid_name_qualifiers=*/true,
+    /*valid_prefix=*/false, /*valid_suffix=*/false,
+  },
+  {
+    {
+      /*.BasenameRange=*/{1, 0}, /*.TemplateRange=*/{1, 0}, 
/*.ScopeRange=*/{1, 0},
+      /*.ArgumentsRange=*/{1, 0}, /*.QualifiersRange=*/{1, 0}, 
/*.NameQualifiersRange=*/{1, 0}, /*.PrefixRange=*/{0, 10},
+      /*.SuffixRange=*/{1, 0}
+    },
+    /*valid_basename=*/false, /*valid_template=*/false, /*valid_scope=*/false,
+    /*valid_arguments=*/false, /*valid_qualifiers=*/false, 
/*valid_name_qualifiers=*/false,
+    /*valid_prefix=*/true, /*valid_suffix=*/false,
+  },
+  {
+    {
+      /*.BasenameRange=*/{1, 0}, /*.TemplateRange=*/{1, 0}, 
/*.ScopeRange=*/{1, 0},
+      /*.ArgumentsRange=*/{1, 0}, /*.QualifiersRange=*/{1, 0}, 
/*.NameQualifiersRange=*/{1, 0}, /*.PrefixRange=*/{1, 0},
+      /*.SuffixRange=*/{0, 10}
+    },
+    /*valid_basename=*/false, /*valid_template=*/false, /*valid_scope=*/false,
+    /*valid_arguments=*/false, /*valid_qualifiers=*/false, 
/*valid_name_qualifiers=*/false,
+    /*valid_prefix=*/false, /*valid_suffix=*/true,
+  },
     // clang-format on
 };
 
@@ -696,13 +796,16 @@ struct DemangledNameInfoTestFixture
     : public ::testing::TestWithParam<DemangledNameInfoTestCase> {};
 
 TEST_P(DemangledNameInfoTestFixture, DemangledNameInfoRanges) {
-  const auto &[info, valid_basename, valid_scope, valid_arguments,
-               valid_qualifiers, valid_prefix, valid_suffix] = GetParam();
+  const auto &[info, valid_basename, valid_template, valid_scope,
+               valid_arguments, valid_qualifiers, valid_name_qualifiers,
+               valid_prefix, valid_suffix] = GetParam();
 
   ASSERT_EQ(info.hasBasename(), valid_basename);
+  ASSERT_EQ(info.hasTemplate(), valid_template);
   ASSERT_EQ(info.hasScope(), valid_scope);
   ASSERT_EQ(info.hasArguments(), valid_arguments);
   ASSERT_EQ(info.hasQualifiers(), valid_qualifiers);
+  ASSERT_EQ(info.hasNameQualifiers(), valid_name_qualifiers);
   ASSERT_EQ(info.hasPrefix(), valid_prefix);
   ASSERT_EQ(info.hasSuffix(), valid_suffix);
 }

>From a059d5181b827e56b3fe02f527b96a6dc1b80e9b Mon Sep 17 00:00:00 2001
From: Charles Zablit <c_zab...@apple.com>
Date: Tue, 29 Jul 2025 17:40:09 +0100
Subject: [PATCH 2/3] embed the logic for TemplateArgumentsRange inside the
 demangler

---
 lldb/docs/use/formatting.rst                  |  2 +-
 lldb/include/lldb/Core/DemangledNameInfo.h    | 39 ++++++--
 lldb/source/Core/DemangledNameInfo.cpp        |  4 +
 .../Language/CPlusPlus/CPlusPlusLanguage.cpp  | 10 +-
 lldb/unittests/Core/MangledTest.cpp           | 97 ++++++++++---------
 5 files changed, 89 insertions(+), 63 deletions(-)

diff --git a/lldb/docs/use/formatting.rst b/lldb/docs/use/formatting.rst
index 0b60f1e193acb..4967f6b7c2be7 100644
--- a/lldb/docs/use/formatting.rst
+++ b/lldb/docs/use/formatting.rst
@@ -89,7 +89,7 @@ A complete list of currently supported format string 
variables is listed below:
 
+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
 | ``function.name-without-args``                    | The name of the current 
function without arguments and values (used to include a function name in-line 
in the ``disassembly-format``)                                                  
                                                                                
                     |
 
+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| ``function.name-qualifiers``                      | Any qualifiers added 
after the name of a function and before its arguments or template arguments.    
                                                                                
                                                                                
                       |
+| ``function.name-qualifiers``                      | Any qualifiers added 
after the name of a function and before its arguments or template arguments. 
E.g., for Swift the name qualifier for ``closure #1 in A.foo<Int>()`` is `` in 
A.foo``.                                                                        
                           |
 
+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
 | ``function.basename``                             | The basename of the 
current function depending on the frame's language. E.g., for C++ the basename 
for ``void ns::foo<float>::bar<int>(int) const`` is ``bar``.                    
                                                                                
                         |
 
+---------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
diff --git a/lldb/include/lldb/Core/DemangledNameInfo.h 
b/lldb/include/lldb/Core/DemangledNameInfo.h
index bdfcb488c2e01..0ee24d02a0c55 100644
--- a/lldb/include/lldb/Core/DemangledNameInfo.h
+++ b/lldb/include/lldb/Core/DemangledNameInfo.h
@@ -22,7 +22,9 @@ namespace lldb_private {
 struct DemangledNameInfo {
   /// A [start, end) pair for the function basename.
   /// The basename is the name without scope qualifiers
-  /// and without template parameters. E.g.,
+  /// and without template parameters.
+  ///
+  /// E.g.,
   /// \code{.cpp}
   ///    void foo::bar<int>::someFunc<float>(int) const &&
   ///                        ^       ^
@@ -31,17 +33,18 @@ struct DemangledNameInfo {
   std::pair<size_t, size_t> BasenameRange;
 
   /// A [start, end) pair for the function template arguments.
-  /// The basename is the name without scope qualifiers
-  /// and without template parameters. E.g.,
+  ///
+  /// E.g.,
   /// \code{.cpp}
   ///    void foo::bar<int>::someFunc<float>(int) const &&
-  ///                                ^     ^
-  ///                              start  end
+  ///                                ^      ^
+  ///                              start   end
   /// \endcode
-  std::pair<size_t, size_t> TemplateRange;
+  std::pair<size_t, size_t> TemplateArgumentsRange;
 
   /// A [start, end) pair for the function scope qualifiers.
-  /// E.g., for
+  ///
+  /// E.g.,
   /// \code{.cpp}
   ///    void foo::bar<int>::qux<float>(int) const &&
   ///         ^              ^
@@ -50,6 +53,7 @@ struct DemangledNameInfo {
   std::pair<size_t, size_t> ScopeRange;
 
   /// Indicates the [start, end) of the function argument list.
+  ///
   /// E.g.,
   /// \code{.cpp}
   ///    int (*getFunc<float>(float, double))(int, int)
@@ -72,6 +76,13 @@ struct DemangledNameInfo {
   /// Indicates the [start, end) of the function's name qualifiers. This is a
   /// catch-all range for anything in between the basename and the arguments,
   /// that is not tracked by the rest of the pairs.
+  ///
+  /// E.g.,
+  /// \code{.swift}
+  ///    void foo::bar<int>::qux<float>(int) const &&
+  ///                                       ^        ^
+  ///                                     start     end
+  /// \endcode
   std::pair<size_t, size_t> NameQualifiersRange;
 
   /// Indicates the [start, end) of the function's prefix. This is a
@@ -90,9 +101,9 @@ struct DemangledNameInfo {
     return BasenameRange.second > BasenameRange.first;
   }
 
-  /// Returns \c true if this object holds a valid template range.
-  bool hasTemplate() const {
-    return TemplateRange.second >= TemplateRange.first;
+  /// Returns \c true if this object holds a valid template arguments range.
+  bool hasTemplateArguments() const {
+    return TemplateArgumentsRange.second >= TemplateArgumentsRange.first;
   }
 
   /// Returns \c true if this object holds a valid scope range.
@@ -172,6 +183,14 @@ struct TrackingOutputBuffer : public 
llvm::itanium_demangle::OutputBuffer {
   /// the basename range to the current \c OB position.
   void updateBasenameEnd();
 
+  /// If this object \ref shouldTrack, then update the beginning of
+  /// the template arguments range to the current \c OB position.
+  void updateTemplateArgumentsStart();
+
+  /// If this object \ref shouldTrack, then update the end of
+  /// the template arguments range to the current \c OB position.
+  void updateTemplateArgumentsEnd();
+
   /// If this object \ref shouldTrack, then update the beginning
   /// of the scope range to the current \c OB position.
   void updateScopeStart();
diff --git a/lldb/source/Core/DemangledNameInfo.cpp 
b/lldb/source/Core/DemangledNameInfo.cpp
index 54a06edc5ec1d..95db524fba2da 100644
--- a/lldb/source/Core/DemangledNameInfo.cpp
+++ b/lldb/source/Core/DemangledNameInfo.cpp
@@ -92,6 +92,10 @@ void TrackingOutputBuffer::finalizeStart() {
   if (NameInfo.BasenameRange.second == 0)
     NameInfo.BasenameRange.second = getCurrentPosition();
 
+  if (NameInfo.BasenameRange.second != NameInfo.ArgumentsRange.first)
+    NameInfo.TemplateArgumentsRange = {NameInfo.BasenameRange.second,
+                                       NameInfo.ArgumentsRange.first};
+
   assert(!shouldTrack());
   assert(canFinalize());
 }
diff --git a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp 
b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
index 46753c5efc331..3353d5a898898 100644
--- a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
+++ b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
@@ -283,12 +283,12 @@ GetDemangledTemplateArguments(const SymbolContext &sc) {
 
   auto [demangled_name, info] = *info_or_err;
 
-  if (info.ArgumentsRange.first < info.BasenameRange.second)
-    return llvm::createStringError("Arguments range for '%s' is invalid.",
-                                   demangled_name.data());
+  if (!info.hasTemplateArguments())
+    return llvm::createStringError(
+        "Template arguments range for '%s' is invalid.", 
demangled_name.data());
 
-  return demangled_name.slice(info.BasenameRange.second,
-                              info.ArgumentsRange.first);
+  return demangled_name.slice(info.TemplateArgumentsRange.first,
+                              info.TemplateArgumentsRange.second);
 }
 
 static llvm::Expected<llvm::StringRef>
diff --git a/lldb/unittests/Core/MangledTest.cpp 
b/lldb/unittests/Core/MangledTest.cpp
index 7d273a46f1174..06494274ef2e2 100644
--- a/lldb/unittests/Core/MangledTest.cpp
+++ b/lldb/unittests/Core/MangledTest.cpp
@@ -436,7 +436,7 @@ DemanglingPartsTestCase g_demangling_parts_test_cases[] = {
     // clang-format off
    { 
"_ZNVKO3BarIN2ns3QuxIiEEE1CIPFi3FooIS_IiES6_EEE6methodIS6_EENS5_IT_SC_E5InnerIiEESD_SD_",
      {
-       /*.BasenameRange=*/{92, 98}, /*.TemplateRange=*/{0, 0}, 
/*.ScopeRange=*/{36, 92},
+       /*.BasenameRange=*/{92, 98}, /*.TemplateArgumentsRange=*/{98, 108}, 
/*.ScopeRange=*/{36, 92},
        /*.ArgumentsRange=*/{108, 158}, /*.QualifiersRange=*/{158, 176}, 
/*.NameQualifiersRange=*/{0, 0},
        /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0}
      },
@@ -446,7 +446,7 @@ DemanglingPartsTestCase g_demangling_parts_test_cases[] = {
    },
    { "_Z7getFuncIfEPFiiiET_",
      {
-       /*.BasenameRange=*/{6, 13}, /*.TemplateRange=*/{0, 0}, 
/*.ScopeRange=*/{6, 6},
+       /*.BasenameRange=*/{6, 13}, /*.TemplateArgumentsRange=*/{13, 20}, 
/*.ScopeRange=*/{6, 6},
        /*.ArgumentsRange=*/{20, 27}, /*.QualifiersRange=*/{38, 38}, 
/*.NameQualifiersRange=*/{0, 0},
        /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0}
      },
@@ -456,7 +456,7 @@ DemanglingPartsTestCase g_demangling_parts_test_cases[] = {
    },
    { "_ZN1f1b1c1gEv",
      {
-       /*.BasenameRange=*/{9, 10}, /*.TemplateRange=*/{0, 0}, 
/*.ScopeRange=*/{0, 9},
+       /*.BasenameRange=*/{9, 10}, /*.TemplateArgumentsRange=*/{0, 0}, 
/*.ScopeRange=*/{0, 9},
        /*.ArgumentsRange=*/{10, 12}, /*.QualifiersRange=*/{12, 12}, 
/*.NameQualifiersRange=*/{0, 0},
        /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0}
      },
@@ -466,7 +466,7 @@ DemanglingPartsTestCase g_demangling_parts_test_cases[] = {
    },
    { "_ZN5test73fD1IiEEDTcmtlNS_1DEL_ZNS_1bEEEcvT__EES2_",
      {
-       /*.BasenameRange=*/{45, 48}, /*.TemplateRange=*/{0, 0}, 
/*.ScopeRange=*/{38, 45},
+       /*.BasenameRange=*/{45, 48}, /*.TemplateArgumentsRange=*/{48, 53}, 
/*.ScopeRange=*/{38, 45},
        /*.ArgumentsRange=*/{53, 58}, /*.QualifiersRange=*/{58, 58}, 
/*.NameQualifiersRange=*/{0, 0},
        /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0}
      },
@@ -476,7 +476,7 @@ DemanglingPartsTestCase g_demangling_parts_test_cases[] = {
    },
    { "_ZN5test73fD1IiEEDTcmtlNS_1DEL_ZNS_1bINDT1cE1dEEEEEcvT__EES2_",
      {
-       /*.BasenameRange=*/{61, 64}, /*.TemplateRange=*/{0, 
0},/*.ScopeRange=*/{54, 61},
+       /*.BasenameRange=*/{61, 64}, /*.TemplateArgumentsRange=*/{64, 
69},/*.ScopeRange=*/{54, 61},
        /*.ArgumentsRange=*/{69, 79}, /*.QualifiersRange=*/{79, 79}, 
/*.NameQualifiersRange=*/{0, 0},
        /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0}
      },
@@ -486,7 +486,7 @@ DemanglingPartsTestCase g_demangling_parts_test_cases[] = {
    },
    { 
"_ZN5test7INDT1cE1dINDT1cE1dEEEE3fD1INDT1cE1dINDT1cE1dEEEEEDTcmtlNS_1DEL_ZNS_1bINDT1cE1dEEEEEcvT__EES2_",
      {
-       /*.BasenameRange=*/{120, 123}, /*.TemplateRange=*/{0, 0}, 
/*.ScopeRange=*/{81, 120},
+       /*.BasenameRange=*/{120, 123}, /*.TemplateArgumentsRange=*/{123, 155}, 
/*.ScopeRange=*/{81, 120},
        /*.ArgumentsRange=*/{155, 168}, /*.QualifiersRange=*/{168, 168}, 
/*.NameQualifiersRange=*/{0, 0},
        /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0}
      },
@@ -496,7 +496,7 @@ DemanglingPartsTestCase g_demangling_parts_test_cases[] = {
    },
    { 
"_ZN8nlohmann16json_abi_v3_11_310basic_jsonINSt3__13mapENS2_6vectorENS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEbxydS8_NS0_14adl_serializerENS4_IhNS8_IhEEEEvE5parseIRA29_KcEESE_OT_NS2_8functionIFbiNS0_6detail13parse_event_tERSE_EEEbb",
      {
-       /*.BasenameRange=*/{687, 692}, /*.TemplateRange=*/{0, 0}, 
/*.ScopeRange=*/{343, 687},
+       /*.BasenameRange=*/{687, 692}, /*.TemplateArgumentsRange=*/{692, 713}, 
/*.ScopeRange=*/{343, 687},
        /*.ArgumentsRange=*/{713, 1174}, /*.QualifiersRange=*/{1174, 1174}, 
/*.NameQualifiersRange=*/{0, 0},
        /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0}
      },
@@ -506,7 +506,7 @@ DemanglingPartsTestCase g_demangling_parts_test_cases[] = {
    },
    { 
"_ZN8nlohmann16json_abi_v3_11_310basic_jsonINSt3__13mapENS2_6vectorENS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEbxydS8_NS0_14adl_serializerENS4_IhNS8_IhEEEEvEC1EDn",
      {
-       /*.BasenameRange=*/{344, 354}, /*.TemplateRange=*/{0, 0}, 
/*.ScopeRange=*/{0, 344},
+       /*.BasenameRange=*/{344, 354}, /*.TemplateArgumentsRange=*/{0, 0}, 
/*.ScopeRange=*/{0, 344},
        /*.ArgumentsRange=*/{354, 370}, /*.QualifiersRange=*/{370, 370}, 
/*.NameQualifiersRange=*/{0, 0},
        /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0}
      },
@@ -516,7 +516,7 @@ DemanglingPartsTestCase g_demangling_parts_test_cases[] = {
    },
    { "_Z3fppIiEPFPFvvEiEf",
      {
-       /*.BasenameRange=*/{10, 13}, /*.TemplateRange=*/{0, 0}, 
/*.ScopeRange=*/{10, 10},
+       /*.BasenameRange=*/{10, 13}, /*.TemplateArgumentsRange=*/{13, 18}, 
/*.ScopeRange=*/{10, 10},
       /*.ArgumentsRange=*/{18, 25}, /*.QualifiersRange=*/{34,34}, 
/*.NameQualifiersRange=*/{0, 0},
       /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0}
      },
@@ -526,7 +526,7 @@ DemanglingPartsTestCase g_demangling_parts_test_cases[] = {
    },
    { "_Z3fppIiEPFPFvvEN2ns3FooIiEEEf",
      {
-       /*.BasenameRange=*/{10, 13}, /*.TemplateRange=*/{0, 0}, 
/*.ScopeRange=*/{10, 10},
+       /*.BasenameRange=*/{10, 13}, /*.TemplateArgumentsRange=*/{13, 18}, 
/*.ScopeRange=*/{10, 10},
        /*.ArgumentsRange=*/{18, 25}, /*.QualifiersRange=*/{43, 43}, 
/*.NameQualifiersRange=*/{0, 0},
        /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0}
      },
@@ -536,7 +536,7 @@ DemanglingPartsTestCase g_demangling_parts_test_cases[] = {
    },
    { "_Z3fppIiEPFPFvPFN2ns3FooIiEENS2_3BarIfE3QuxEEEPFS2_S2_EEf",
      {
-       /*.BasenameRange=*/{10, 13}, /*.TemplateRange=*/{0, 0}, 
/*.ScopeRange=*/{10, 10},
+       /*.BasenameRange=*/{10, 13}, /*.TemplateArgumentsRange=*/{13, 18}, 
/*.ScopeRange=*/{10, 10},
        /*.ArgumentsRange=*/{18, 25}, /*.QualifiersRange=*/{108, 108}, 
/*.NameQualifiersRange=*/{0, 0},
        /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0}
      },
@@ -546,7 +546,7 @@ DemanglingPartsTestCase g_demangling_parts_test_cases[] = {
    },
    { "_ZN2ns8HasFuncsINS_3FooINS1_IiE3BarIfE3QuxEEEE3fppIiEEPFPFvvEiEf",
      {
-       /*.BasenameRange=*/{64, 67}, /*.TemplateRange=*/{0, 0}, 
/*.ScopeRange=*/{10, 64},
+       /*.BasenameRange=*/{64, 67}, /*.TemplateArgumentsRange=*/{67, 72}, 
/*.ScopeRange=*/{10, 64},
        /*.ArgumentsRange=*/{72, 79}, /*.QualifiersRange=*/{88, 88}, 
/*.NameQualifiersRange=*/{0, 0},
        /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0}
      },
@@ -556,7 +556,7 @@ DemanglingPartsTestCase g_demangling_parts_test_cases[] = {
    },
    { "_ZN2ns8HasFuncsINS_3FooINS1_IiE3BarIfE3QuxEEEE3fppIiEEPFPFvvES2_Ef",
      {
-       /*.BasenameRange=*/{64, 67}, /*.TemplateRange=*/{0, 0}, 
/*.ScopeRange=*/{10, 64},
+       /*.BasenameRange=*/{64, 67}, /*.TemplateArgumentsRange=*/{67, 72}, 
/*.ScopeRange=*/{10, 64},
        /*.ArgumentsRange=*/{72, 79}, /*.QualifiersRange=*/{97, 97}, 
/*.NameQualifiersRange=*/{0, 0},
        /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0}
      },
@@ -566,7 +566,7 @@ DemanglingPartsTestCase g_demangling_parts_test_cases[] = {
    },
    { 
"_ZN2ns8HasFuncsINS_3FooINS1_IiE3BarIfE3QuxEEEE3fppIiEEPFPFvPFS2_S5_EEPFS2_S2_EEf",
      {
-       /*.BasenameRange=*/{64, 67}, /*.TemplateRange=*/{0, 0}, 
/*.ScopeRange=*/{10, 64},
+       /*.BasenameRange=*/{64, 67}, /*.TemplateArgumentsRange=*/{67, 72}, 
/*.ScopeRange=*/{10, 64},
        /*.ArgumentsRange=*/{72, 79}, /*.QualifiersRange=*/{162, 162}, 
/*.NameQualifiersRange=*/{0, 0},
        /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0}
      },
@@ -576,7 +576,7 @@ DemanglingPartsTestCase g_demangling_parts_test_cases[] = {
    },
    { "_ZNKO2ns3ns23Bar3fooIiEEPFPFNS0_3FooIiEEiENS3_IfEEEi",
      {
-       /*.BasenameRange=*/{37, 40}, /*.TemplateRange=*/{0, 0}, 
/*.ScopeRange=*/{23, 37},
+       /*.BasenameRange=*/{37, 40}, /*.TemplateArgumentsRange=*/{40, 45}, 
/*.ScopeRange=*/{23, 37},
        /*.ArgumentsRange=*/{45, 50}, /*.QualifiersRange=*/{78, 87}, 
/*.NameQualifiersRange=*/{0, 0},
        /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0}
      },
@@ -586,7 +586,7 @@ DemanglingPartsTestCase g_demangling_parts_test_cases[] = {
    },
    { "_ZTV11ImageLoader",
      {
-       /*.BasenameRange=*/{0, 0}, /*.TemplateRange=*/{0, 0}, 
/*.ScopeRange=*/{0, 0},
+       /*.BasenameRange=*/{0, 0}, /*.TemplateArgumentsRange=*/{0, 0}, 
/*.ScopeRange=*/{0, 0},
        /*.ArgumentsRange=*/{0, 0}, /*.QualifiersRange=*/{0, 0}, 
/*.NameQualifiersRange=*/{0, 0},
        /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0}
      },
@@ -597,7 +597,7 @@ DemanglingPartsTestCase g_demangling_parts_test_cases[] = {
    },
    { 
"___ZNK5dyld313MachOAnalyzer18forEachInitializerER11DiagnosticsRKNS0_15VMAddrConverterEU13block_pointerFvjEPKv_block_invoke.204",
      {
-       /*.BasenameRange=*/{55, 73}, /*.TemplateRange=*/{0, 0}, 
/*.ScopeRange=*/{33, 55},
+       /*.BasenameRange=*/{55, 73}, /*.TemplateArgumentsRange=*/{0, 0}, 
/*.ScopeRange=*/{33, 55},
        /*.ArgumentsRange=*/{73, 181}, /*.QualifiersRange=*/{181, 187}, 
/*.NameQualifiersRange=*/{0, 0},
        /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0}
      },
@@ -607,7 +607,7 @@ DemanglingPartsTestCase g_demangling_parts_test_cases[] = {
    },
    { "_ZZN5dyld45startEPNS_10KernelArgsEPvS2_ENK3$_1clEv",
      {
-       /*.BasenameRange=*/{53, 63}, /*.TemplateRange=*/{0, 0}, 
/*.ScopeRange=*/{0, 53},
+       /*.BasenameRange=*/{53, 63}, /*.TemplateArgumentsRange=*/{0, 0}, 
/*.ScopeRange=*/{0, 53},
        /*.ArgumentsRange=*/{63, 65}, /*.QualifiersRange=*/{65, 71}, 
/*.NameQualifiersRange=*/{0, 0},
        /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0}
      },
@@ -617,7 +617,7 @@ DemanglingPartsTestCase g_demangling_parts_test_cases[] = {
    },
    { 
"_ZZNK5dyld46Loader38runInitializersBottomUpPlusUpwardLinksERNS_12RuntimeStateEENK3$_0clEv",
      {
-       /*.BasenameRange=*/{88, 98}, /*.TemplateRange=*/{0, 0}, 
/*.ScopeRange=*/{0, 88},
+       /*.BasenameRange=*/{88, 98}, /*.TemplateArgumentsRange=*/{0, 0}, 
/*.ScopeRange=*/{0, 88},
        /*.ArgumentsRange=*/{98, 100}, /*.QualifiersRange=*/{100, 106}, 
/*.NameQualifiersRange=*/{0, 0},
        /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0}
      },
@@ -627,7 +627,7 @@ DemanglingPartsTestCase g_demangling_parts_test_cases[] = {
    },
    { 
"_ZZNK5dyld46Loader38runInitializersBottomUpPlusUpwardLinksERNS_12RuntimeStateEENK3$_0clEv.cold",
      {
-       /*.BasenameRange=*/{88, 98}, /*.TemplateRange=*/{0, 0}, 
/*.ScopeRange=*/{0, 88},
+       /*.BasenameRange=*/{88, 98}, /*.TemplateArgumentsRange=*/{0, 0}, 
/*.ScopeRange=*/{0, 88},
        /*.ArgumentsRange=*/{98, 100}, /*.QualifiersRange=*/{100, 106}, 
/*.NameQualifiersRange=*/{0, 0},
        /*.PrefixRange=*/{0, 0}, /*.SuffixRange=*/{0, 0}
      },
@@ -677,11 +677,14 @@ TEST_P(DemanglingPartsTestFixture, DemanglingParts) {
   auto demangled = std::string_view(*OB);
 
   ASSERT_EQ(OB->NameInfo.hasBasename(), valid_basename);
-
+  std::cout << demangled << " " << OB->NameInfo.BasenameRange.first << ", "
+            << OB->NameInfo.BasenameRange.second << '\n';
   EXPECT_EQ(OB->NameInfo.BasenameRange, info.BasenameRange);
+  EXPECT_EQ(OB->NameInfo.TemplateArgumentsRange, info.TemplateArgumentsRange);
   EXPECT_EQ(OB->NameInfo.ScopeRange, info.ScopeRange);
   EXPECT_EQ(OB->NameInfo.ArgumentsRange, info.ArgumentsRange);
   EXPECT_EQ(OB->NameInfo.QualifiersRange, info.QualifiersRange);
+  EXPECT_EQ(OB->NameInfo.NameQualifiersRange, info.NameQualifiersRange);
 
   auto get_part = [&](const std::pair<size_t, size_t> &loc) {
     return demangled.substr(loc.first, loc.second - loc.first);
@@ -711,9 +714,9 @@ DemangledNameInfoTestCase 
g_demangled_name_info_test_cases[] = {
     // clang-format off
   {
     {
-      /*.BasenameRange=*/{0, 10}, /*.TemplateRange=*/{1, 0}, 
/*.ScopeRange=*/{1, 0},
-      /*.ArgumentsRange=*/{1, 0}, /*.QualifiersRange=*/{1, 0}, 
/*.NameQualifiersRange=*/{1, 0}, /*.PrefixRange=*/{1, 0},
-      /*.SuffixRange=*/{1, 0}
+      /*.BasenameRange=*/{0, 10}, /*.TemplateArgumentsRange=*/{1, 0}, 
/*.ScopeRange=*/{1, 0},
+      /*.ArgumentsRange=*/{1, 0}, /*.QualifiersRange=*/{1, 0}, 
/*.NameQualifiersRange=*/{1, 0},
+      /*.PrefixRange=*/{1, 0}, /*.SuffixRange=*/{1, 0}
     },
     /*valid_basename=*/true, /*valid_template=*/false, /*valid_scope=*/false,
     /*valid_arguments=*/false, /*valid_qualifiers=*/false, 
/*valid_name_qualifiers=*/false,
@@ -721,9 +724,9 @@ DemangledNameInfoTestCase 
g_demangled_name_info_test_cases[] = {
   },
   {
     {
-      /*.BasenameRange=*/{1, 0}, /*.TemplateRange=*/{0, 10}, 
/*.ScopeRange=*/{1, 0},
-      /*.ArgumentsRange=*/{1, 0}, /*.QualifiersRange=*/{1, 0}, 
/*.NameQualifiersRange=*/{1, 0}, /*.PrefixRange=*/{1, 0},
-      /*.SuffixRange=*/{1, 0}
+      /*.BasenameRange=*/{1, 0}, /*.TemplateArgumentsRange=*/{0, 10}, 
/*.ScopeRange=*/{1, 0},
+      /*.ArgumentsRange=*/{1, 0}, /*.QualifiersRange=*/{1, 0}, 
/*.NameQualifiersRange=*/{1, 0},
+      /*.PrefixRange=*/{1, 0}, /*.SuffixRange=*/{1, 0}
     },
     /*valid_basename=*/false, /*valid_name_qualifiers=*/true, 
/*valid_scope=*/false,
     /*valid_arguments=*/false, /*valid_qualifiers=*/false, 
/*valid_name_qualifiers=*/false,
@@ -731,9 +734,9 @@ DemangledNameInfoTestCase 
g_demangled_name_info_test_cases[] = {
   },
   {
     {
-      /*.BasenameRange=*/{1, 0}, /*.TemplateRange=*/{1, 0}, 
/*.ScopeRange=*/{0, 10},
-      /*.ArgumentsRange=*/{1, 0}, /*.QualifiersRange=*/{1, 0}, 
/*.NameQualifiersRange=*/{1, 0}, /*.PrefixRange=*/{1, 0},
-      /*.SuffixRange=*/{1, 0}
+      /*.BasenameRange=*/{1, 0}, /*.TemplateArgumentsRange=*/{1, 0}, 
/*.ScopeRange=*/{0, 10},
+      /*.ArgumentsRange=*/{1, 0}, /*.QualifiersRange=*/{1, 0}, 
/*.NameQualifiersRange=*/{1, 0},
+      /*.PrefixRange=*/{1, 0}, /*.SuffixRange=*/{1, 0}
     },
     /*valid_basename=*/false, /*valid_template=*/false, /*valid_scope=*/true,
     /*valid_arguments=*/false, /*valid_qualifiers=*/false, 
/*valid_name_qualifiers=*/false,
@@ -741,9 +744,9 @@ DemangledNameInfoTestCase 
g_demangled_name_info_test_cases[] = {
   },
   {
     {
-      /*.BasenameRange=*/{1, 0}, /*.TemplateRange=*/{1, 0}, 
/*.ScopeRange=*/{1, 0},
-      /*.ArgumentsRange=*/{0, 10}, /*.QualifiersRange=*/{1, 0}, 
/*.NameQualifiersRange=*/{1, 0}, /*.PrefixRange=*/{1, 0},
-      /*.SuffixRange=*/{1, 0}
+      /*.BasenameRange=*/{1, 0}, /*.TemplateArgumentsRange=*/{1, 0}, 
/*.ScopeRange=*/{1, 0},
+      /*.ArgumentsRange=*/{0, 10}, /*.QualifiersRange=*/{1, 0}, 
/*.NameQualifiersRange=*/{1, 0},
+      /*.PrefixRange=*/{1, 0}, /*.SuffixRange=*/{1, 0}
     },
     /*valid_basename=*/false, /*valid_template=*/false, /*valid_scope=*/false,
     /*valid_arguments=*/true, /*valid_qualifiers=*/false, 
/*valid_name_qualifiers=*/false,
@@ -751,9 +754,9 @@ DemangledNameInfoTestCase 
g_demangled_name_info_test_cases[] = {
   },
   {
     {
-      /*.BasenameRange=*/{1, 0}, /*.TemplateRange=*/{1, 0}, 
/*.ScopeRange=*/{1, 0},
-      /*.ArgumentsRange=*/{1, 0}, /*.QualifiersRange=*/{0, 10}, 
/*.NameQualifiersRange=*/{1, 0}, /*.PrefixRange=*/{1, 0},
-      /*.SuffixRange=*/{1, 0}
+      /*.BasenameRange=*/{1, 0}, /*.TemplateArgumentsRange=*/{1, 0}, 
/*.ScopeRange=*/{1, 0},
+      /*.ArgumentsRange=*/{1, 0}, /*.QualifiersRange=*/{0, 10}, 
/*.NameQualifiersRange=*/{1, 0},
+      /*.PrefixRange=*/{1, 0}, /*.SuffixRange=*/{1, 0}
     },
     /*valid_basename=*/false, /*valid_template=*/false, /*valid_scope=*/false,
     /*valid_arguments=*/false, /*valid_qualifiers=*/true, 
/*valid_name_qualifiers=*/false,
@@ -761,9 +764,9 @@ DemangledNameInfoTestCase 
g_demangled_name_info_test_cases[] = {
   },
   {
     {
-      /*.BasenameRange=*/{1, 0}, /*.TemplateRange=*/{1, 0}, 
/*.ScopeRange=*/{1, 0},
-      /*.ArgumentsRange=*/{1, 0}, /*.QualifiersRange=*/{1, 0}, 
/*.NameQualifiersRange=*/{0, 10}, /*.PrefixRange=*/{1, 0},
-      /*.SuffixRange=*/{1, 0}
+      /*.BasenameRange=*/{1, 0}, /*.TemplateArgumentsRange=*/{1, 0}, 
/*.ScopeRange=*/{1, 0},
+      /*.ArgumentsRange=*/{1, 0}, /*.QualifiersRange=*/{1, 0}, 
/*.NameQualifiersRange=*/{0, 10},
+      /*.PrefixRange=*/{1, 0}, /*.SuffixRange=*/{1, 0}
     },
     /*valid_basename=*/false, /*valid_template=*/false, /*valid_scope=*/false,
     /*valid_arguments=*/false, /*valid_qualifiers=*/false, 
/*valid_name_qualifiers=*/true,
@@ -771,9 +774,9 @@ DemangledNameInfoTestCase 
g_demangled_name_info_test_cases[] = {
   },
   {
     {
-      /*.BasenameRange=*/{1, 0}, /*.TemplateRange=*/{1, 0}, 
/*.ScopeRange=*/{1, 0},
-      /*.ArgumentsRange=*/{1, 0}, /*.QualifiersRange=*/{1, 0}, 
/*.NameQualifiersRange=*/{1, 0}, /*.PrefixRange=*/{0, 10},
-      /*.SuffixRange=*/{1, 0}
+      /*.BasenameRange=*/{1, 0}, /*.TemplateArgumentsRange=*/{1, 0}, 
/*.ScopeRange=*/{1, 0},
+      /*.ArgumentsRange=*/{1, 0}, /*.QualifiersRange=*/{1, 0}, 
/*.NameQualifiersRange=*/{1, 0},
+      /*.PrefixRange=*/{0, 10}, /*.SuffixRange=*/{1, 0}
     },
     /*valid_basename=*/false, /*valid_template=*/false, /*valid_scope=*/false,
     /*valid_arguments=*/false, /*valid_qualifiers=*/false, 
/*valid_name_qualifiers=*/false,
@@ -781,9 +784,9 @@ DemangledNameInfoTestCase 
g_demangled_name_info_test_cases[] = {
   },
   {
     {
-      /*.BasenameRange=*/{1, 0}, /*.TemplateRange=*/{1, 0}, 
/*.ScopeRange=*/{1, 0},
-      /*.ArgumentsRange=*/{1, 0}, /*.QualifiersRange=*/{1, 0}, 
/*.NameQualifiersRange=*/{1, 0}, /*.PrefixRange=*/{1, 0},
-      /*.SuffixRange=*/{0, 10}
+      /*.BasenameRange=*/{1, 0}, /*.TemplateArgumentsRange=*/{1, 0}, 
/*.ScopeRange=*/{1, 0},
+      /*.ArgumentsRange=*/{1, 0}, /*.QualifiersRange=*/{1, 0}, 
/*.NameQualifiersRange=*/{1, 0},
+      /*.PrefixRange=*/{1, 0}, /*.SuffixRange=*/{0, 10}
     },
     /*valid_basename=*/false, /*valid_template=*/false, /*valid_scope=*/false,
     /*valid_arguments=*/false, /*valid_qualifiers=*/false, 
/*valid_name_qualifiers=*/false,
@@ -796,12 +799,12 @@ struct DemangledNameInfoTestFixture
     : public ::testing::TestWithParam<DemangledNameInfoTestCase> {};
 
 TEST_P(DemangledNameInfoTestFixture, DemangledNameInfoRanges) {
-  const auto &[info, valid_basename, valid_template, valid_scope,
+  const auto &[info, valid_basename, valid_template_arguments, valid_scope,
                valid_arguments, valid_qualifiers, valid_name_qualifiers,
                valid_prefix, valid_suffix] = GetParam();
 
   ASSERT_EQ(info.hasBasename(), valid_basename);
-  ASSERT_EQ(info.hasTemplate(), valid_template);
+  ASSERT_EQ(info.hasTemplateArguments(), valid_template_arguments);
   ASSERT_EQ(info.hasScope(), valid_scope);
   ASSERT_EQ(info.hasArguments(), valid_arguments);
   ASSERT_EQ(info.hasQualifiers(), valid_qualifiers);

>From c2e9516f2887157c16542a89169ac1d3f36d784a Mon Sep 17 00:00:00 2001
From: Charles Zablit <c_zab...@apple.com>
Date: Wed, 30 Jul 2025 10:32:35 +0100
Subject: [PATCH 3/3] fixup! embed the logic for TemplateArgumentsRange inside
 the demangler

---
 lldb/include/lldb/Core/DemangledNameInfo.h | 8 --------
 1 file changed, 8 deletions(-)

diff --git a/lldb/include/lldb/Core/DemangledNameInfo.h 
b/lldb/include/lldb/Core/DemangledNameInfo.h
index 0ee24d02a0c55..4f3960f6da1e0 100644
--- a/lldb/include/lldb/Core/DemangledNameInfo.h
+++ b/lldb/include/lldb/Core/DemangledNameInfo.h
@@ -183,14 +183,6 @@ struct TrackingOutputBuffer : public 
llvm::itanium_demangle::OutputBuffer {
   /// the basename range to the current \c OB position.
   void updateBasenameEnd();
 
-  /// If this object \ref shouldTrack, then update the beginning of
-  /// the template arguments range to the current \c OB position.
-  void updateTemplateArgumentsStart();
-
-  /// If this object \ref shouldTrack, then update the end of
-  /// the template arguments range to the current \c OB position.
-  void updateTemplateArgumentsEnd();
-
   /// If this object \ref shouldTrack, then update the beginning
   /// of the scope range to the current \c OB position.
   void updateScopeStart();

_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to