[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