Skip to content

[lldb][test] Consolidate libstdc++ and libc++ vector formatter tests into generic test #146885

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Jul 3, 2025

Conversation

Michael137
Copy link
Member

The libstdc++ test was a subset of the tests in libc++. This test moves the libc++ test into generic and removes the libstdc++ tests. I retained the -D_GLIBCXX_DEBUG test cases though.

Split out from #146740

@Michael137 Michael137 requested a review from labath July 3, 2025 13:28
@Michael137 Michael137 requested a review from JDevlieghere as a code owner July 3, 2025 13:28
@llvmbot llvmbot added the lldb label Jul 3, 2025
@llvmbot
Copy link
Member

llvmbot commented Jul 3, 2025

@llvm/pr-subscribers-lldb

Author: Michael Buch (Michael137)

Changes

The libstdc++ test was a subset of the tests in libc++. This test moves the libc++ test into generic and removes the libstdc++ tests. I retained the -D_GLIBCXX_DEBUG test cases though.

Split out from #146740


Full diff: https://github.com/llvm/llvm-project/pull/146885.diff

7 Files Affected:

  • (renamed) lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/vector/Makefile (-3)
  • (renamed) lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/vector/TestDataFormatterStdVector.py (+36-7)
  • (added) lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/vector/main.cpp (+40)
  • (removed) lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/vector/Makefile (-6)
  • (removed) lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/vector/main.cpp (-41)
  • (removed) lldb/test/API/functionalities/data-formatter/data-formatter-stl/libstdcpp/vector/TestDataFormatterStdVector.py (-220)
  • (removed) lldb/test/API/functionalities/data-formatter/data-formatter-stl/libstdcpp/vector/main.cpp (-31)
diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libstdcpp/vector/Makefile b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/vector/Makefile
similarity index 57%
rename from lldb/test/API/functionalities/data-formatter/data-formatter-stl/libstdcpp/vector/Makefile
rename to lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/vector/Makefile
index 654e4b15bd568..99998b20bcb05 100644
--- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libstdcpp/vector/Makefile
+++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/vector/Makefile
@@ -1,6 +1,3 @@
 CXX_SOURCES := main.cpp
 
-CXXFLAGS := -O0
-USE_LIBSTDCPP := 1
-
 include Makefile.rules
diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/vector/TestDataFormatterLibcxxVector.py b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/vector/TestDataFormatterStdVector.py
similarity index 84%
rename from lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/vector/TestDataFormatterLibcxxVector.py
rename to lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/vector/TestDataFormatterStdVector.py
index 13341a9b274be..ba8b10450f4fc 100644
--- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/vector/TestDataFormatterLibcxxVector.py
+++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/vector/TestDataFormatterStdVector.py
@@ -2,14 +2,13 @@
 Test lldb data formatter subsystem.
 """
 
-
 import lldb
 from lldbsuite.test.decorators import *
 from lldbsuite.test.lldbtest import *
 from lldbsuite.test import lldbutil
 
 
-class LibcxxVectorDataFormatterTestCase(TestBase):
+class StdVectorDataFormatterTestCase(TestBase):
     def check_numbers(self, var_name, show_ptr=False):
         patterns = []
         substrs = [
@@ -52,10 +51,8 @@ def check_numbers(self, var_name, show_ptr=False):
         self.expect("frame variable " + var_name + "[2]", substrs=["123"])
         self.expect("frame variable " + var_name + "[3]", substrs=["1234"])
 
-    @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.target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint(
             self, "break here", lldb.SBFileSpec("main.cpp", False)
         )
@@ -170,10 +167,25 @@ def cleanup():
 
         self.expect("frame variable strings", substrs=["vector has 0 items"])
 
+    @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()
+
     @add_test_categories(["libc++"])
-    def test_ref_and_ptr(self):
+    def test_libcxx(self):
+        self.build(dictionary={"USE_LIBCPP": 1})
+        self.do_test()
+
+    def do_test_ref_and_ptr(self):
         """Test that that file and class static variables display correctly."""
-        self.build()
         (self.target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint(
             self, "Stop here to check by ref", lldb.SBFileSpec("main.cpp", False)
         )
@@ -186,3 +198,20 @@ def test_ref_and_ptr(self):
         self.expect("frame variable ptr", substrs=["ptr =", " size=7"])
 
         self.expect("expression ptr", substrs=["$", "size=7"])
+
+    @add_test_categories(["libstdcxx"])
+    def test_ref_and_ptr_libstdcxx(self):
+        self.build(dictionary={"USE_LIBSTDCPP": 1})
+        self.do_test_ref_and_ptr()
+
+    @add_test_categories(["libstdcxx"])
+    def test_ref_and_ptr_libstdcxx_debug(self):
+        self.build(
+            dictionary={"USE_LIBSTDCPP": 1, "CXXFLAGS_EXTRAS": "-D_GLIBCXX_DEBUG"}
+        )
+        self.do_test_ref_and_ptr()
+
+    @add_test_categories(["libc++"])
+    def test_ref_and_ptr_libcxx(self):
+        self.build(dictionary={"USE_LIBCPP": 1})
+        self.do_test_ref_and_ptr()
diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/vector/main.cpp b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/vector/main.cpp
new file mode 100644
index 0000000000000..19cd1893bd22a
--- /dev/null
+++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/vector/main.cpp
@@ -0,0 +1,40 @@
+#include <stdio.h>
+#include <string>
+#include <vector>
+typedef std::vector<int> int_vect;
+typedef std::vector<std::string> string_vect;
+
+template <class T>
+void by_ref_and_ptr(std::vector<T> &ref, std::vector<T> *ptr) {
+  // Stop here to check by ref
+  return;
+}
+
+int main() {
+  int_vect numbers;
+  (numbers.push_back(1));  // break here
+  (numbers.push_back(12)); // break here
+  (numbers.push_back(123));
+  (numbers.push_back(1234));
+  (numbers.push_back(12345)); // break here
+  (numbers.push_back(123456));
+  (numbers.push_back(1234567));
+  by_ref_and_ptr(numbers, &numbers);
+
+  printf("break here");
+  numbers.clear();
+
+  (numbers.push_back(7)); // break here
+
+  string_vect strings;
+  (strings.push_back(std::string("goofy")));
+  (strings.push_back(std::string("is")));
+  (strings.push_back(std::string("smart")));
+  printf("break here");
+  (strings.push_back(std::string("!!!")));
+
+  printf("break here");
+  strings.clear();
+
+  return 0; // break here
+}
diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/vector/Makefile b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/vector/Makefile
deleted file mode 100644
index 564cbada74e08..0000000000000
--- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/vector/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/libcxx/vector/main.cpp b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/vector/main.cpp
deleted file mode 100644
index 0e1dbe4f03e2b..0000000000000
--- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/vector/main.cpp
+++ /dev/null
@@ -1,41 +0,0 @@
-#include <stdio.h>
-#include <string>
-#include <vector>
-typedef std::vector<int> int_vect;
-typedef std::vector<std::string> string_vect;
-
-template <class T>
-void by_ref_and_ptr(std::vector<T> &ref, std::vector<T> *ptr) {
-  // Stop here to check by ref
-  return;  
-}
-
-int main()
-{
-    int_vect numbers;
-    (numbers.push_back(1));  // break here
-    (numbers.push_back(12));  // break here
-    (numbers.push_back(123));
-    (numbers.push_back(1234));
-    (numbers.push_back(12345)); // break here
-    (numbers.push_back(123456));
-    (numbers.push_back(1234567));
-    by_ref_and_ptr(numbers, &numbers);
-    
-    printf("break here");
-    numbers.clear();
-    
-    (numbers.push_back(7)); // break here
-
-    string_vect strings;
-    (strings.push_back(std::string("goofy")));
-    (strings.push_back(std::string("is")));
-    (strings.push_back(std::string("smart")));
-    printf("break here");
-    (strings.push_back(std::string("!!!")));
-     
-    printf("break here");
-    strings.clear();
-    
-    return 0;  // break here
-}
diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libstdcpp/vector/TestDataFormatterStdVector.py b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libstdcpp/vector/TestDataFormatterStdVector.py
deleted file mode 100644
index 6cfd17a39304e..0000000000000
--- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libstdcpp/vector/TestDataFormatterStdVector.py
+++ /dev/null
@@ -1,220 +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 StdVectorDataFormatterTestCase(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(build_args)
-
-    def with_run_command(self, 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)
-
-        # empty vectors (and storage pointers SHOULD BOTH BE NULL..)
-        self.expect("frame variable numbers", substrs=["numbers = size=0"])
-
-        self.runCmd("c")
-
-        # first value added
-        self.expect(
-            "frame variable numbers", substrs=["numbers = size=1", "[0] = 1", "}"]
-        )
-
-        # add some more data
-        self.runCmd("c")
-
-        self.expect(
-            "frame variable numbers",
-            substrs=[
-                "numbers = size=4",
-                "[0] = 1",
-                "[1] = 12",
-                "[2] = 123",
-                "[3] = 1234",
-                "}",
-            ],
-        )
-
-        self.expect(
-            "expression numbers",
-            substrs=[
-                "$",
-                "size=4",
-                "[0] = 1",
-                "[1] = 12",
-                "[2] = 123",
-                "[3] = 1234",
-                "}",
-            ],
-        )
-
-        # check access to synthetic children
-        self.runCmd(
-            'type summary add --summary-string "item 0 is ${var[0]}" std::int_vect int_vect'
-        )
-        self.expect("frame variable numbers", substrs=["item 0 is 1"])
-
-        self.runCmd(
-            'type summary add --summary-string "item 0 is ${svar[0]}" std::int_vect int_vect'
-        )
-        # import time
-        # time.sleep(19)
-        self.expect("frame variable numbers", substrs=["item 0 is 1"])
-        # move on with synths
-        self.runCmd("type summary delete std::int_vect")
-        self.runCmd("type summary delete int_vect")
-
-        # add some more data
-        self.runCmd("c")
-
-        self.expect(
-            "frame variable numbers",
-            substrs=[
-                "numbers = size=7",
-                "[0] = 1",
-                "[1] = 12",
-                "[2] = 123",
-                "[3] = 1234",
-                "[4] = 12345",
-                "[5] = 123456",
-                "[6] = 1234567",
-                "}",
-            ],
-        )
-
-        self.expect(
-            "expression numbers",
-            substrs=[
-                "$",
-                "size=7",
-                "[0] = 1",
-                "[1] = 12",
-                "[2] = 123",
-                "[3] = 1234",
-                "[4] = 12345",
-                "[5] = 123456",
-                "[6] = 1234567",
-                "}",
-            ],
-        )
-
-        # check access-by-index
-        self.expect("frame variable numbers[0]", substrs=["1"])
-        self.expect("frame variable numbers[1]", substrs=["12"])
-        self.expect("frame variable numbers[2]", substrs=["123"])
-        self.expect("frame variable numbers[3]", substrs=["1234"])
-
-        # but check that expression does not rely on us
-        # (when expression gets to call into STL code correctly, we will have to find
-        # another way to check this)
-        self.expect(
-            "expression numbers[6]", matching=False, error=True, substrs=["1234567"]
-        )
-
-        # check that MightHaveChildren() gets it right
-        self.assertTrue(
-            self.frame().FindVariable("numbers").MightHaveChildren(),
-            "numbers.MightHaveChildren() says False for non empty!",
-        )
-
-        # clear out the vector and see that we do the right thing once again
-        self.runCmd("c")
-
-        self.expect("frame variable numbers", substrs=["numbers = size=0"])
-
-        self.runCmd("c")
-
-        # first value added
-        self.expect(
-            "frame variable numbers", substrs=["numbers = size=1", "[0] = 7", "}"]
-        )
-
-        # check if we can display strings
-        self.runCmd("c")
-
-        self.expect("frame variable strings", substrs=["goofy", "is", "smart"])
-
-        self.expect("expression strings", substrs=["goofy", "is", "smart"])
-
-        # test summaries based on synthetic children
-        self.runCmd(
-            'type summary add std::string_vect string_vect --summary-string "vector has ${svar%#} items" -e'
-        )
-        self.expect(
-            "frame variable strings",
-            substrs=["vector has 3 items", "goofy", "is", "smart"],
-        )
-
-        self.expect(
-            "expression strings", substrs=["vector has 3 items", "goofy", "is", "smart"]
-        )
-
-        self.runCmd("c")
-
-        self.expect("frame variable strings", substrs=["vector has 4 items"])
-
-        # check access-by-index
-        self.expect("frame variable strings[0]", substrs=["goofy"])
-        self.expect("frame variable strings[1]", substrs=["is"])
-
-        # but check that expression does not rely on us
-        # (when expression gets to call into STL code correctly, we will have to find
-        # another way to check this)
-        self.expect(
-            "expression strings[0]", matching=False, error=True, substrs=["goofy"]
-        )
-
-        # check that MightHaveChildren() gets it right
-        self.assertTrue(
-            self.frame().FindVariable("strings").MightHaveChildren(),
-            "strings.MightHaveChildren() says False for non empty!",
-        )
-
-        self.runCmd("c")
-
-        self.expect("frame variable strings", substrs=["vector has 0 items"])
diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libstdcpp/vector/main.cpp b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libstdcpp/vector/main.cpp
deleted file mode 100644
index 010917995e401..0000000000000
--- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libstdcpp/vector/main.cpp
+++ /dev/null
@@ -1,31 +0,0 @@
-#include <string>
-#include <vector>
-typedef std::vector<int> int_vect;
-typedef std::vector<std::string> string_vect;
-
-int main()
-{
-    int_vect numbers;
-    numbers.push_back(1);  // Set break point at this line.
-    numbers.push_back(12);  // Set break point at this line.
-    numbers.push_back(123);
-    numbers.push_back(1234);
-    numbers.push_back(12345);  // Set break point at this line.
-    numbers.push_back(123456);
-    numbers.push_back(1234567);
-    
-    numbers.clear();  // Set break point at this line.
-    
-    numbers.push_back(7);  // Set break point at this line.
-
-    string_vect strings;  // Set break point at this line.
-    strings.push_back(std::string("goofy"));
-    strings.push_back(std::string("is"));
-    strings.push_back(std::string("smart"));
-    
-    strings.push_back(std::string("!!!"));  // Set break point at this line.
-    
-    strings.clear();  // Set break point at this line.
-    
-    return 0;// Set break point at this line.
-}


int main() {
int_vect numbers;
(numbers.push_back(1)); // break here
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure what are the parens for, but I wouldn't want my name to go down in history with them :P

…into generic test

The libstdc++ test was a subset of the tests in libc++. This test moves
the libc++ test into `generic` and removes the `libstdc++` tests. I
retained the `-D_GLIBCXX_DEBUG` test cases though.

Split out from llvm#146740
@Michael137 Michael137 merged commit a88e286 into llvm:main Jul 3, 2025
9 checks passed
@Michael137 Michael137 deleted the lldb/consolidate-stl-tests-vector branch July 3, 2025 14:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants