[Lldb-commits] [lldb] [lldb] Add MSVC STL/libstdc++ formatters for queue, stack, and priority_queue (PR #217241)

via lldb-commits lldb-commits at lists.llvm.org
Wed Aug 19 02:14:58 PDT 2026


https://github.com/Daedie-git created https://github.com/llvm/llvm-project/pull/217241

MSVC STL and libstdc++ store the underlying container of `std::queue` / `std::stack` / `std::priority_queue` in a member named `c`. libc++ already has formatters via the inline-namespace regex; this registers the same adaptor frontend for the un-inlined `std::` names.

Tests extend the generic queue suite to libstdc++ (queue/stack/priority_queue) and MSVC STL (Windows).

Split out of #217177 at @Nerixyz's request. Leaving bitset (#175570), initializer_list (#178712), coroutine_handle (#194941), and chrono (#195125) to those PRs.

Part of #24834

CC @Nerixyz @DavidSpickett @Michael137

I've read the LLVM Developer Policy, Code-Review Policy, and [AI Tool Use Policy](https://llvm.org/docs/AIToolPolicy.html).

AI tool usage: Grok 4.6 was used to help write this change. I reviewed the result and can answer questions about the patch during review.

>From 8ccd14da97acec8e51f7014aac1dc18c56a6fef8 Mon Sep 17 00:00:00 2001
From: Bjorn Schobben <bjorn.schobben at aimsport.com>
Date: Wed, 19 Aug 2026 10:52:59 +0200
Subject: [PATCH] [lldb] Add MSVC STL/libstdc++ formatters for queue, stack,
 and priority_queue

These adaptors store the container in a member named `c` in both MSVC
STL and libstdc++. Reuse the existing adaptor frontend and register it
for the un-inlined std:: names. libc++ continues to use the inline
namespace regex.

Part of #24834
---
 .../Language/CPlusPlus/CPlusPlusLanguage.cpp  | 21 ++++++++
 .../queue/TestDataFormatterStdQueue.py        | 54 ++++++++++++++-----
 .../data-formatter-stl/generic/queue/main.cpp | 10 +++-
 3 files changed, 69 insertions(+), 16 deletions(-)

diff --git a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
index 8225c2141a84a..c28e75745dfca 100644
--- a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
+++ b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
@@ -1947,6 +1947,27 @@ static void LoadCommonStlFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
                 "MSVC STL/libstdc++ std::strong_ordering summary provider",
                 "std::strong_ordering",
                 eTypeOptionHideChildren | eTypeOptionHideValue, false);
+
+  // Container adaptors store the underlying container in a member named `c`
+  // in both MSVC STL and libstdc++.
+  AddCXXSynthetic(cpp_category_sp, LibcxxQueueFrontEndCreator,
+                  "std::queue synthetic children", "^std::queue<.+>(( )?&)?$",
+                  stl_synth_flags, true);
+  AddCXXSynthetic(cpp_category_sp, LibcxxQueueFrontEndCreator,
+                  "std::stack synthetic children", "^std::stack<.+>(( )?&)?$",
+                  stl_synth_flags, true);
+  AddCXXSynthetic(cpp_category_sp, LibcxxQueueFrontEndCreator,
+                  "std::priority_queue synthetic children",
+                  "^std::priority_queue<.+>(( )?&)?$", stl_synth_flags, true);
+  AddCXXSummary(cpp_category_sp, ContainerSizeSummaryProvider,
+                "std::queue summary provider", "^std::queue<.+>(( )?&)?$",
+                stl_summary_flags, true);
+  AddCXXSummary(cpp_category_sp, ContainerSizeSummaryProvider,
+                "std::stack summary provider", "^std::stack<.+>(( )?&)?$",
+                stl_summary_flags, true);
+  AddCXXSummary(cpp_category_sp, ContainerSizeSummaryProvider,
+                "std::priority_queue summary provider",
+                "^std::priority_queue<.+>(( )?&)?$", stl_summary_flags, true);
 }
 
 static void LoadMsvcStlFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/queue/TestDataFormatterStdQueue.py b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/queue/TestDataFormatterStdQueue.py
index d5ae06bd057c4..166ed83220d2b 100644
--- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/queue/TestDataFormatterStdQueue.py
+++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/queue/TestDataFormatterStdQueue.py
@@ -15,28 +15,54 @@ def setUp(self):
         TestBase.setUp(self)
         self.namespace = "std"
 
-    def check_variable(self, name):
+    def check_sequence(self, name, type_name):
         var = self.frame().FindVariable(name)
-        self.assertTrue(var.IsValid())
-
-        queue = self.namespace + "::queue"
-        self.assertIn(queue, var.GetDisplayTypeName())
-        self.assertEqual(var.GetNumChildren(), 5)
+        self.assertTrue(var.IsValid(), name)
+        self.assertIn(self.namespace + "::" + type_name, var.GetDisplayTypeName())
+        self.assertEqual(var.GetNumChildren(), 5, name)
         for i in range(5):
             ch = var.GetChildAtIndex(i)
-            self.assertTrue(ch.IsValid())
-            self.assertEqual(ch.GetValueAsSigned(), i + 1)
+            self.assertTrue(ch.IsValid(), f"{name}[{i}]")
+            self.assertEqual(ch.GetValueAsSigned(), i + 1, f"{name}[{i}]")
+
+    def check_priority_queue(self, name):
+        var = self.frame().FindVariable(name)
+        self.assertTrue(var.IsValid(), name)
+        self.assertIn(self.namespace + "::priority_queue", var.GetDisplayTypeName())
+        self.assertEqual(var.GetNumChildren(), 5, name)
+        values = sorted(var.GetChildAtIndex(i).GetValueAsSigned() for i in range(5))
+        self.assertEqual(values, [1, 2, 3, 4, 5])
+
+    def do_test_queues(self):
+        lldbutil.run_to_source_breakpoint(
+            self, "// break here", lldb.SBFileSpec("main.cpp", False)
+        )
+        self.check_sequence("q1", "queue")
+        self.check_sequence("q2", "queue")
+
+    def do_test_adaptors(self):
+        self.do_test_queues()
+        self.check_sequence("s1", "stack")
+        self.check_sequence("s2", "stack")
+        self.check_priority_queue("pq")
+
+    @expectedFailureAll(
+        bugnumber="llvm.org/pr36109", debug_info="gmodules", triple=".*-android"
+    )
+    @add_test_categories(["libstdcxx"])
+    def test_libstdcxx(self):
+        self.build(dictionary={"USE_LIBSTDCPP": 1})
+        self.do_test_adaptors()
 
     @expectedFailureAll(
         bugnumber="llvm.org/pr36109", debug_info="gmodules", triple=".*-android"
     )
     @add_test_categories(["libc++"])
     def test_libcxx(self):
-        """Test that std::queue is displayed correctly"""
         self.build(dictionary={"USE_LIBCPP": 1})
-        lldbutil.run_to_source_breakpoint(
-            self, "// break here", lldb.SBFileSpec("main.cpp", False)
-        )
+        self.do_test_queues()
 
-        self.check_variable("q1")
-        self.check_variable("q2")
+    @add_test_categories(["msvcstl"])
+    def test_msvcstl(self):
+        self.build()
+        self.do_test_adaptors()
diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/queue/main.cpp b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/queue/main.cpp
index 406b437914932..a85c5f8ce39d2 100644
--- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/queue/main.cpp
+++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/queue/main.cpp
@@ -1,9 +1,15 @@
 #include <queue>
+#include <stack>
 #include <vector>
 
 int main() {
   std::queue<int> q1{{1, 2, 3, 4, 5}};
   std::queue<int, std::vector<int>> q2{{1, 2, 3, 4, 5}};
-  int ret = q1.size() + q2.size(); // break here
-  return ret;
+  std::stack<int> s1{{1, 2, 3, 4, 5}};
+  std::stack<int, std::vector<int>> s2{{1, 2, 3, 4, 5}};
+  std::priority_queue<int> pq;
+  for (int v : {1, 2, 3, 4, 5})
+    pq.push(v);
+  int ret = q1.size() + q2.size() + s1.size() + s2.size() + pq.size();
+  return ret; // break here
 }



More information about the lldb-commits mailing list