[Lldb-commits] [lldb] [lldb][test] Combine libstdc++ and libc++ std::map tests into generic test (PR #147174)

Michael Buch via lldb-commits lldb-commits at lists.llvm.org
Sat Jul 5 23:40:16 PDT 2025


https://github.com/Michael137 created https://github.com/llvm/llvm-project/pull/147174

This combines the libc++ and libstdc++ test cases. The libstdcpp tests were a subset of the libc++ test, so this patch moves the libcxx test into generic and removes the libstdcpp test entirely.

Split out from https://github.com/llvm/llvm-project/pull/146740

>From afaebb5e6a16bbf91f3de26ae69050e503d55158 Mon Sep 17 00:00:00 2001
From: Michael Buch <michaelbuch12 at gmail.com>
Date: Sun, 6 Jul 2025 07:37:17 +0100
Subject: [PATCH] [lldb][test] Combine libstdc++ and libc++ std::map tests into
 generic test

This combines the libc++ and libstdc++ test cases. The libstdcpp tests were a subset of the libc++ test, so this patch moves the libcxx test into generic and removes the libstdcpp test entirely.

Split out from https://github.com/llvm/llvm-project/pull/146740
---
 .../{libstdcpp => generic}/map/Makefile       |   2 -
 .../map/TestDataFormatterStdMap.py}           |  22 +-
 .../{libcxx => generic}/map/main.cpp          |   0
 .../data-formatter-stl/libcxx/map/Makefile    |   6 -
 .../libstdcpp/map/TestDataFormatterStdMap.py  | 301 ------------------
 .../data-formatter-stl/libstdcpp/map/main.cpp |  55 ----
 6 files changed, 18 insertions(+), 368 deletions(-)
 rename lldb/test/API/functionalities/data-formatter/data-formatter-stl/{libstdcpp => generic}/map/Makefile (70%)
 rename lldb/test/API/functionalities/data-formatter/data-formatter-stl/{libcxx/map/TestDataFormatterLibccMap.py => generic/map/TestDataFormatterStdMap.py} (95%)
 rename lldb/test/API/functionalities/data-formatter/data-formatter-stl/{libcxx => generic}/map/main.cpp (100%)
 delete mode 100644 lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/map/Makefile
 delete mode 100644 lldb/test/API/functionalities/data-formatter/data-formatter-stl/libstdcpp/map/TestDataFormatterStdMap.py
 delete mode 100644 lldb/test/API/functionalities/data-formatter/data-formatter-stl/libstdcpp/map/main.cpp

diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libstdcpp/map/Makefile b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/map/Makefile
similarity index 70%
rename from lldb/test/API/functionalities/data-formatter/data-formatter-stl/libstdcpp/map/Makefile
rename to lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/map/Makefile
index bf8e6b8703f36..99998b20bcb05 100644
--- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libstdcpp/map/Makefile
+++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/map/Makefile
@@ -1,5 +1,3 @@
 CXX_SOURCES := main.cpp
 
-USE_LIBSTDCPP := 1
-
 include Makefile.rules
diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/map/TestDataFormatterLibccMap.py b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/map/TestDataFormatterStdMap.py
similarity index 95%
rename from lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/map/TestDataFormatterLibccMap.py
rename to lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/map/TestDataFormatterStdMap.py
index b2b83a3b46114..b039db8123bbf 100644
--- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/map/TestDataFormatterLibccMap.py
+++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/map/TestDataFormatterStdMap.py
@@ -9,7 +9,7 @@
 from lldbsuite.test import lldbutil
 
 
-class LibcxxMapDataFormatterTestCase(TestBase):
+class StdMapDataFormatterTestCase(TestBase):
     def setUp(self):
         TestBase.setUp(self)
         ns = "ndk" if lldbplatformutil.target_is_android() else ""
@@ -22,10 +22,8 @@ def check_pair(self, first_value, second_value):
         ]
         return ValueCheck(children=pair_children)
 
-    @add_test_categories(["libc++"])
-    def test_with_run_command(self):
+    def do_test(self):
         """Test that that file and class static variables display correctly."""
-        self.build()
         self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET)
 
         bkpt = self.target().FindBreakpointByID(
@@ -326,3 +324,19 @@ def cleanup():
         lldbutil.continue_to_breakpoint(self.process(), bkpt)
 
         self.expect("frame variable ss", substrs=["%s::map" % ns, "size=0", "{}"])
+
+    @add_test_categories(["libc++"])
+    def test_libcxx(self):
+        self.build(dictionary={"USE_LIBCPP" : 1})
+        self.do_test()
+
+    @add_test_categories(["libstdcxx"])
+    def test_libstdcxx(self):
+        self.build(dictionary={"USE_LIBSTDCPP" : 1})
+        self.do_test()
+
+    @add_test_categories(["libstdcxx"])
+    def test_libstdcxx_debug(self):
+        self.build(dictionary={"USE_LIBSTDCPP" : 1,
+                               "CXXFLAGS_EXTRAS": "-D_GLIBCXX_DEBUG"})
+        self.do_test()
diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/map/main.cpp b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/map/main.cpp
similarity index 100%
rename from lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/map/main.cpp
rename to lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/map/main.cpp
diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/map/Makefile b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/map/Makefile
deleted file mode 100644
index 564cbada74e08..0000000000000
--- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/map/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-CXX_SOURCES := main.cpp
-
-USE_LIBCPP := 1
-
-CXXFLAGS_EXTRAS := -O0
-include Makefile.rules
diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libstdcpp/map/TestDataFormatterStdMap.py b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libstdcpp/map/TestDataFormatterStdMap.py
deleted file mode 100644
index 2d76c02657a7d..0000000000000
--- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libstdcpp/map/TestDataFormatterStdMap.py
+++ /dev/null
@@ -1,301 +0,0 @@
-"""
-Test lldb data formatter subsystem.
-"""
-
-from typing import Optional
-import lldb
-from lldbsuite.test.decorators import *
-from lldbsuite.test.lldbtest import *
-from lldbsuite.test import lldbutil
-
-
-class StdMapDataFormatterTestCase(TestBase):
-    def setUp(self):
-        # Call super's setUp().
-        TestBase.setUp(self)
-        # Find the line number to break at.
-        self.line = line_number("main.cpp", "// Set break point at this line.")
-
-    @add_test_categories(["libstdcxx"])
-    @expectedFailureAll(bugnumber="llvm.org/pr50861", compiler="gcc")
-    def test_with_run_command(self):
-        self.with_run_command()
-
-    @add_test_categories(["libstdcxx"])
-    @expectedFailureAll(bugnumber="llvm.org/pr50861", compiler="gcc")
-    def test_with_run_command_debug(self):
-        build_args = {"CXXFLAGS_EXTRAS": "-D_GLIBCXX_DEBUG"}
-        self.with_run_command("__debug::", build_args)
-
-    def with_run_command(self, namespace: str = "", dictionary: Optional[dict] = None):
-        """Test that that file and class static variables display correctly."""
-        self.build(dictionary=dictionary)
-        self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET)
-
-        lldbutil.run_break_set_by_source_regexp(self, "Set break point at this line.")
-
-        self.runCmd("run", RUN_SUCCEEDED)
-
-        # The stop reason of the thread should be breakpoint.
-        self.expect(
-            "thread list",
-            STOPPED_DUE_TO_BREAKPOINT,
-            substrs=["stopped", "stop reason = breakpoint"],
-        )
-
-        # This is the function to remove the custom formats in order to have a
-        # clean slate for the next test case.
-        def cleanup():
-            self.runCmd("type format clear", check=False)
-            self.runCmd("type summary clear", check=False)
-            self.runCmd("type filter clear", check=False)
-            self.runCmd("type synth clear", check=False)
-
-        # Execute the cleanup function during test case tear down.
-        self.addTearDownHook(cleanup)
-
-        self.runCmd("frame variable ii --show-types")
-
-        self.runCmd(
-            f'type summary add -x "std::{namespace}map<" --summary-string "map has ${{svar%#}} items" -e'
-        )
-
-        self.expect("frame variable ii", substrs=["map has 0 items", "{}"])
-
-        self.runCmd("c")
-
-        self.expect(
-            "frame variable ii",
-            substrs=[
-                "map has 2 items",
-                "[0] = ",
-                "first = 0",
-                "second = 0",
-                "[1] = ",
-                "first = 1",
-                "second = 1",
-            ],
-        )
-
-        self.runCmd("c")
-
-        self.expect(
-            "frame variable ii",
-            substrs=[
-                "map has 4 items",
-                "[2] = ",
-                "first = 2",
-                "second = 0",
-                "[3] = ",
-                "first = 3",
-                "second = 1",
-            ],
-        )
-
-        self.runCmd("c")
-
-        self.expect(
-            "frame variable ii",
-            substrs=[
-                "map has 9 items",
-                "[5] = ",
-                "first = 5",
-                "second = 0",
-                "[7] = ",
-                "first = 7",
-                "second = 1",
-            ],
-        )
-
-        self.expect(
-            "expression ii",
-            substrs=[
-                "map has 9 items",
-                "[5] = ",
-                "first = 5",
-                "second = 0",
-                "[7] = ",
-                "first = 7",
-                "second = 1",
-            ],
-        )
-
-        # check access-by-index
-        self.expect("frame variable ii[0]", substrs=["first = 0", "second = 0"])
-        self.expect("frame variable ii[3]", substrs=["first =", "second ="])
-
-        self.expect("frame variable ii[8]", matching=True, substrs=["1234567"])
-
-        # check that MightHaveChildren() gets it right
-        self.assertTrue(
-            self.frame().FindVariable("ii").MightHaveChildren(),
-            "ii.MightHaveChildren() says False for non empty!",
-        )
-
-        # check that the expression parser does not make use of
-        # synthetic children instead of running code
-        # TOT clang has a fix for this, which makes the expression command here succeed
-        # since this would make the test fail or succeed depending on clang version in use
-        # this is safer commented for the time being
-        # self.expect("expression ii[8]", matching=False, error=True,
-        #            substrs = ['1234567'])
-
-        self.runCmd("c")
-
-        self.expect("frame variable ii", substrs=["map has 0 items", "{}"])
-
-        self.runCmd("frame variable si --show-types")
-
-        self.expect("frame variable si", substrs=["map has 0 items", "{}"])
-
-        self.runCmd("c")
-
-        self.expect(
-            "frame variable si",
-            substrs=["map has 1 items", "[0] = ", 'first = "zero"', "second = 0"],
-        )
-
-        self.runCmd("c")
-
-        self.expect(
-            "frame variable si",
-            substrs=[
-                "map has 5 items",
-                '[0] = (first = "four", second = 4)',
-                '[1] = (first = "one", second = 1)',
-                '[2] = (first = "three", second = 3)',
-                '[3] = (first = "two", second = 2)',
-                '[4] = (first = "zero", second = 0)',
-            ],
-        )
-
-        self.expect(
-            "expression si",
-            substrs=[
-                "map has 5 items",
-                '[0] = (first = "four", second = 4)',
-                '[1] = (first = "one", second = 1)',
-                '[2] = (first = "three", second = 3)',
-                '[3] = (first = "two", second = 2)',
-                '[4] = (first = "zero", second = 0)',
-            ],
-        )
-
-        # check access-by-index
-        self.expect("frame variable si[0]", substrs=["first = ", "four", "second = 4"])
-
-        # check that MightHaveChildren() gets it right
-        self.assertTrue(
-            self.frame().FindVariable("si").MightHaveChildren(),
-            "si.MightHaveChildren() says False for non empty!",
-        )
-
-        # check that the expression parser does not make use of
-        # synthetic children instead of running code
-        # TOT clang has a fix for this, which makes the expression command here succeed
-        # since this would make the test fail or succeed depending on clang version in use
-        # this is safer commented for the time being
-        # self.expect("expression si[0]", matching=False, error=True,
-        #            substrs = ['first = ', 'zero'])
-
-        self.runCmd("c")
-
-        self.expect("frame variable si", substrs=["map has 0 items", "{}"])
-
-        self.runCmd("frame variable is --show-types")
-
-        self.expect("frame variable is", substrs=["map has 0 items", "{}"])
-
-        self.runCmd("c")
-
-        self.expect(
-            "frame variable is",
-            substrs=[
-                "map has 4 items",
-                '[0] = (first = 1, second = "is")',
-                '[1] = (first = 2, second = "smart")',
-                '[2] = (first = 3, second = "!!!")',
-                '[3] = (first = 85, second = "goofy")',
-            ],
-        )
-
-        self.expect(
-            "expression is",
-            substrs=[
-                "map has 4 items",
-                '[0] = (first = 1, second = "is")',
-                '[1] = (first = 2, second = "smart")',
-                '[2] = (first = 3, second = "!!!")',
-                '[3] = (first = 85, second = "goofy")',
-            ],
-        )
-
-        # check access-by-index
-        self.expect("frame variable is[0]", substrs=["first = ", "second ="])
-
-        # check that MightHaveChildren() gets it right
-        self.assertTrue(
-            self.frame().FindVariable("is").MightHaveChildren(),
-            "is.MightHaveChildren() says False for non empty!",
-        )
-
-        # check that the expression parser does not make use of
-        # synthetic children instead of running code
-        # TOT clang has a fix for this, which makes the expression command here succeed
-        # since this would make the test fail or succeed depending on clang version in use
-        # this is safer commented for the time being
-        # self.expect("expression is[0]", matching=False, error=True,
-        #            substrs = ['first = ', 'goofy'])
-
-        self.runCmd("c")
-
-        self.expect("frame variable is", substrs=["map has 0 items", "{}"])
-
-        self.runCmd("frame variable ss --show-types")
-
-        self.expect("frame variable ss", substrs=["map has 0 items", "{}"])
-
-        self.runCmd("c")
-
-        self.expect(
-            "frame variable ss",
-            substrs=[
-                "map has 4 items",
-                '[0] = (first = "a Mac..", second = "..is always a Mac!")',
-                '[1] = (first = "casa", second = "house")',
-                '[2] = (first = "ciao", second = "hello")',
-                '[3] = (first = "gatto", second = "cat")',
-            ],
-        )
-
-        self.expect(
-            "expression ss",
-            substrs=[
-                "map has 4 items",
-                '[0] = (first = "a Mac..", second = "..is always a Mac!")',
-                '[1] = (first = "casa", second = "house")',
-                '[2] = (first = "ciao", second = "hello")',
-                '[3] = (first = "gatto", second = "cat")',
-            ],
-        )
-
-        # check access-by-index
-        self.expect("frame variable ss[3]", substrs=["gatto", "cat"])
-
-        # check that MightHaveChildren() gets it right
-        self.assertTrue(
-            self.frame().FindVariable("ss").MightHaveChildren(),
-            "ss.MightHaveChildren() says False for non empty!",
-        )
-
-        # check that the expression parser does not make use of
-        # synthetic children instead of running code
-        # TOT clang has a fix for this, which makes the expression command here succeed
-        # since this would make the test fail or succeed depending on clang version in use
-        # this is safer commented for the time being
-        # self.expect("expression ss[3]", matching=False, error=True,
-        #            substrs = ['gatto'])
-
-        self.runCmd("c")
-
-        self.expect("frame variable ss", substrs=["map has 0 items", "{}"])
diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libstdcpp/map/main.cpp b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libstdcpp/map/main.cpp
deleted file mode 100644
index d5e5b212782d8..0000000000000
--- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libstdcpp/map/main.cpp
+++ /dev/null
@@ -1,55 +0,0 @@
-#include <map>
-#include <string>
-
-#define intint_map std::map<int, int> 
-#define strint_map std::map<std::string, int> 
-#define intstr_map std::map<int, std::string> 
-#define strstr_map std::map<std::string, std::string> 
-
-
-int main()
-{
-    intint_map ii;
-    
-    ii[0] = 0; // Set break point at this line.
-    ii[1] = 1;
-    ii[2] = 0;// Set break point at this line.
-    ii[3] = 1;
-    ii[4] = 0;// Set break point at this line.
-    ii[5] = 1;
-    ii[6] = 0;
-    ii[7] = 1;
-    ii[85] = 1234567;
-    
-    ii.clear();// Set break point at this line.
-    
-    strint_map si;
-    
-    si["zero"] = 0;// Set break point at this line.
-    si["one"] = 1;// Set break point at this line.
-    si["two"] = 2;
-    si["three"] = 3;
-    si["four"] = 4;
-
-    si.clear();// Set break point at this line.
-    
-    intstr_map is;
-    
-    is[85] = "goofy";// Set break point at this line.
-    is[1] = "is";
-    is[2] = "smart";
-    is[3] = "!!!";
-    
-    is.clear();// Set break point at this line.
-    
-    strstr_map ss;
-    
-    ss["ciao"] = "hello";// Set break point at this line.
-    ss["casa"] = "house";
-    ss["gatto"] = "cat";
-    ss["a Mac.."] = "..is always a Mac!";
-    
-    ss.clear();// Set break point at this line.
-    
-    return 0;// Set break point at this line.
-}



More information about the lldb-commits mailing list