Author: Michael Buch Date: 2025-07-08T09:01:10+01:00 New Revision: fd997d86f060c8110a6b5151e8f21c4e4e17ba4a
URL: https://github.com/llvm/llvm-project/commit/fd997d86f060c8110a6b5151e8f21c4e4e17ba4a DIFF: https://github.com/llvm/llvm-project/commit/fd997d86f060c8110a6b5151e8f21c4e4e17ba4a.diff LOG: [lldb][test] Combine libstdc++ and libc++ tuple tests into generic test (#147139) This combines the libc++ and libstdc++ test cases. The main difference was that the libstdcpp tests had some tuple indexing tests that libc++ didn't have. The libstdc++ formatter didn't support size summaries for std::tuple. So I added a `ContainerSizeSummaryProvider` for it (like we do for libc++). Additionally, the synthetic frontend would only apply to non-empty tuples, so I adjusted the regex to match empty ones too. We do this for libc++ already. Split out from https://github.com/llvm/llvm-project/pull/146740 Added: lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/tuple/Makefile lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/tuple/TestDataFormatterStdTuple.py lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/tuple/main.cpp Modified: lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp Removed: lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/tuple/Makefile lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/tuple/TestDataFormatterLibcxxTuple.py lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/tuple/main.cpp lldb/test/API/functionalities/data-formatter/data-formatter-stl/libstdcpp/tuple/Makefile lldb/test/API/functionalities/data-formatter/data-formatter-stl/libstdcpp/tuple/TestDataFormatterStdTuple.py lldb/test/API/functionalities/data-formatter/data-formatter-stl/libstdcpp/tuple/main.cpp ################################################################################ diff --git a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp index 06412e34eb777..e64b3ebabd740 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp @@ -1504,6 +1504,10 @@ static void LoadLibStdcppFormatters(lldb::TypeCategoryImplSP cpp_category_sp) { "^std::((__debug::)?|(__cxx11::)?)list<.+>(( )?&)?$", stl_summary_flags, true); + AddCXXSummary(cpp_category_sp, ContainerSizeSummaryProvider, + "libstdc++ std::tuple summary provider", + "^std::tuple<.*>(( )?&)?$", stl_summary_flags, true); + cpp_category_sp->AddTypeSummary( "^std::((__debug::)?|(__cxx11::)?)forward_list<.+>(( )?&)?$", eFormatterMatchRegex, @@ -1546,7 +1550,7 @@ static void LoadLibStdcppFormatters(lldb::TypeCategoryImplSP cpp_category_sp) { AddCXXSynthetic( cpp_category_sp, lldb_private::formatters::LibStdcppTupleSyntheticFrontEndCreator, - "std::tuple synthetic children", "^std::tuple<.+>(( )?&)?$", + "std::tuple synthetic children", "^std::tuple<.*>(( )?&)?$", stl_synth_flags, true); static constexpr const char *const libstdcpp_std_coroutine_handle_regex = diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/tuple/Makefile b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/tuple/Makefile similarity index 75% rename from lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/tuple/Makefile rename to lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/tuple/Makefile index 680e1abfbef58..99998b20bcb05 100644 --- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/tuple/Makefile +++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/tuple/Makefile @@ -1,4 +1,3 @@ CXX_SOURCES := main.cpp -USE_LIBCPP := 1 include Makefile.rules diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/tuple/TestDataFormatterStdTuple.py b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/tuple/TestDataFormatterStdTuple.py new file mode 100644 index 0000000000000..ade502e12b928 --- /dev/null +++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/tuple/TestDataFormatterStdTuple.py @@ -0,0 +1,76 @@ +""" +Test lldb data formatter subsystem. +""" + +import lldb +from lldbsuite.test.decorators import * +from lldbsuite.test.lldbtest import * +from lldbsuite.test import lldbutil + + +class TestDataFormatterStdTuple(TestBase): + def setUp(self): + TestBase.setUp(self) + self.line = line_number("main.cpp", "// break here") + self.namespace = "std" + + def do_test(self): + """Test that std::tuple is displayed correctly""" + lldbutil.run_to_source_breakpoint( + self, "// break here", lldb.SBFileSpec("main.cpp", False) + ) + + tuple_name = self.namespace + "::tuple" + self.expect("frame variable empty", substrs=[tuple_name, "size=0", "{}"]) + + self.expect( + "frame variable one_elt", + substrs=[tuple_name, "size=1", "{", "[0] = 47", "}"], + ) + + self.expect( + "frame variable three_elts", + substrs=[ + tuple_name, + "size=3", + "{", + "[0] = 1", + "[1] = 47", + '[2] = "foo"', + "}", + ], + ) + + frame = self.frame() + self.assertTrue(frame.IsValid()) + + self.assertEqual( + 47, frame.GetValueForVariablePath("one_elt[0]").GetValueAsUnsigned() + ) + self.assertFalse(frame.GetValueForVariablePath("one_elt[1]").IsValid()) + + self.assertEqual( + '"foobar"', frame.GetValueForVariablePath("string_elt[0]").GetSummary() + ) + self.assertFalse(frame.GetValueForVariablePath("string_elt[1]").IsValid()) + + self.assertEqual( + 1, frame.GetValueForVariablePath("three_elts[0]").GetValueAsUnsigned() + ) + self.assertEqual( + 47, frame.GetValueForVariablePath("three_elts[1]").GetValueAsUnsigned() + ) + self.assertEqual( + '"foo"', frame.GetValueForVariablePath("three_elts[2]").GetSummary() + ) + self.assertFalse(frame.GetValueForVariablePath("three_elts[3]").IsValid()) + + @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() diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/tuple/main.cpp b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/tuple/main.cpp similarity index 80% rename from lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/tuple/main.cpp rename to lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/tuple/main.cpp index beb44cd960005..d49dbe8a5f1af 100644 --- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/tuple/main.cpp +++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/tuple/main.cpp @@ -1,9 +1,10 @@ -#include <tuple> #include <string> +#include <tuple> int main() { std::tuple<> empty; std::tuple<int> one_elt{47}; + std::tuple<std::string> string_elt{"foobar"}; std::tuple<int, long, std::string> three_elts{1, 47l, "foo"}; return 0; // break here } diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/tuple/TestDataFormatterLibcxxTuple.py b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/tuple/TestDataFormatterLibcxxTuple.py deleted file mode 100644 index 5b6dfaf5e5d9d..0000000000000 --- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/tuple/TestDataFormatterLibcxxTuple.py +++ /dev/null @@ -1,45 +0,0 @@ -""" -Test lldb data formatter subsystem. -""" - - -import lldb -from lldbsuite.test.decorators import * -from lldbsuite.test.lldbtest import * -from lldbsuite.test import lldbutil - - -class TestDataFormatterLibcxxTuple(TestBase): - def setUp(self): - TestBase.setUp(self) - self.line = line_number("main.cpp", "// break here") - self.namespace = "std" - - @add_test_categories(["libc++"]) - def test(self): - """Test that std::tuple is displayed correctly""" - self.build() - lldbutil.run_to_source_breakpoint( - self, "// break here", lldb.SBFileSpec("main.cpp", False) - ) - - tuple_name = self.namespace + "::tuple" - self.expect("frame variable empty", substrs=[tuple_name, "size=0", "{}"]) - - self.expect( - "frame variable one_elt", - substrs=[tuple_name, "size=1", "{", "[0] = 47", "}"], - ) - - self.expect( - "frame variable three_elts", - substrs=[ - tuple_name, - "size=3", - "{", - "[0] = 1", - "[1] = 47", - '[2] = "foo"', - "}", - ], - ) diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libstdcpp/tuple/Makefile b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libstdcpp/tuple/Makefile deleted file mode 100644 index bf8e6b8703f36..0000000000000 --- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libstdcpp/tuple/Makefile +++ /dev/null @@ -1,5 +0,0 @@ -CXX_SOURCES := main.cpp - -USE_LIBSTDCPP := 1 - -include Makefile.rules diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libstdcpp/tuple/TestDataFormatterStdTuple.py b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libstdcpp/tuple/TestDataFormatterStdTuple.py deleted file mode 100644 index 1433b5bc1acb8..0000000000000 --- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libstdcpp/tuple/TestDataFormatterStdTuple.py +++ /dev/null @@ -1,47 +0,0 @@ -""" -Test lldb data formatter subsystem. -""" - - -import lldb -from lldbsuite.test.decorators import * -from lldbsuite.test.lldbtest import * -from lldbsuite.test import lldbutil - - -class StdTupleDataFormatterTestCase(TestBase): - @add_test_categories(["libstdcxx"]) - @expectedFailureAll(bugnumber="llvm.org/pr50861", compiler="gcc") - def test_with_run_command(self): - self.build() - 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"], - ) - - frame = self.frame() - self.assertTrue(frame.IsValid()) - - self.expect("frame variable ti", substrs=["[0] = 1"]) - self.expect("frame variable ts", substrs=['[0] = "foobar"']) - self.expect("frame variable tt", substrs=["[0] = 1", '[1] = "baz"', "[2] = 2"]) - - self.assertEqual(1, frame.GetValueForVariablePath("ti[0]").GetValueAsUnsigned()) - self.assertFalse(frame.GetValueForVariablePath("ti[1]").IsValid()) - - self.assertEqual( - '"foobar"', frame.GetValueForVariablePath("ts[0]").GetSummary() - ) - self.assertFalse(frame.GetValueForVariablePath("ts[1]").IsValid()) - - self.assertEqual(1, frame.GetValueForVariablePath("tt[0]").GetValueAsUnsigned()) - self.assertEqual('"baz"', frame.GetValueForVariablePath("tt[1]").GetSummary()) - self.assertEqual(2, frame.GetValueForVariablePath("tt[2]").GetValueAsUnsigned()) - self.assertFalse(frame.GetValueForVariablePath("tt[3]").IsValid()) diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libstdcpp/tuple/main.cpp b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libstdcpp/tuple/main.cpp deleted file mode 100644 index 7247742ee6bb5..0000000000000 --- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libstdcpp/tuple/main.cpp +++ /dev/null @@ -1,9 +0,0 @@ -#include <memory> -#include <string> - -int main() { - std::tuple<int> ti{1}; - std::tuple<std::string> ts{"foobar"}; - std::tuple<int, std::string, int> tt{1, "baz", 2}; - return 0; // Set break point at this line. -} _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits