From: Danil Stefaniuc Date: Sat, 30 Oct 2021 19:53:19 +0000 (-0700) Subject: [formatters] Add a libstdcpp formatter for multimap and unify modify tests across... X-Git-Tag: upstream/15.0.7~27107 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=f869e0be445800e71f9a74a60b4f5611d3cff7d0;p=platform%2Fupstream%2Fllvm.git [formatters] Add a libstdcpp formatter for multimap and unify modify tests across stdlibs This diff adds a data formatter for libstdcpp's multimap. Besides, it improves and unifies the tests for multimap for libcxx and libstdcpp for maintainability. Reviewed By: wallace Differential Revision: https://reviews.llvm.org/D112752 --- diff --git a/lldb/examples/synthetic/gnu_libstdcpp.py b/lldb/examples/synthetic/gnu_libstdcpp.py index 21c89754c082..dd07195d6ec8 100644 --- a/lldb/examples/synthetic/gnu_libstdcpp.py +++ b/lldb/examples/synthetic/gnu_libstdcpp.py @@ -315,10 +315,10 @@ class StdVectorSynthProvider: return True """ - Set and Map have the same underlying data structure, - therefore we can use exactly the same implementation for the formatter. + This formatter can be applied to all + map-like structures (map, multimap, set, multiset) """ -class StdSetOrMapSynthProvider: +class StdMapLikeSynthProvider: def __init__(self, valobj, dict): logger = lldb.formatters.Logger.Logger() diff --git a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp index 626c5a5a8282..7b64faa6d6ed 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp @@ -902,12 +902,17 @@ static void LoadLibStdcppFormatters(lldb::TypeCategoryImplSP cpp_category_sp) { RegularExpression("^std::map<.+> >(( )?&)?$"), SyntheticChildrenSP(new ScriptedSyntheticChildren( stl_synth_flags, - "lldb.formatters.cpp.gnu_libstdcpp.StdSetOrMapSynthProvider"))); + "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider"))); cpp_category_sp->GetRegexTypeSyntheticsContainer()->Add( RegularExpression("^std::set<.+> >(( )?&)?$"), SyntheticChildrenSP(new ScriptedSyntheticChildren( stl_deref_flags, - "lldb.formatters.cpp.gnu_libstdcpp.StdSetOrMapSynthProvider"))); + "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider"))); + cpp_category_sp->GetRegexTypeSyntheticsContainer()->Add( + RegularExpression("^std::multimap<.+> >(( )?&)?$"), + SyntheticChildrenSP(new ScriptedSyntheticChildren( + stl_deref_flags, + "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider"))); cpp_category_sp->GetRegexTypeSyntheticsContainer()->Add( RegularExpression("^std::(__cxx11::)?list<.+>(( )?&)?$"), SyntheticChildrenSP(new ScriptedSyntheticChildren( @@ -931,6 +936,10 @@ static void LoadLibStdcppFormatters(lldb::TypeCategoryImplSP cpp_category_sp) { RegularExpression("^std::set<.+> >(( )?&)?$"), TypeSummaryImplSP( new StringSummaryFormat(stl_summary_flags, "size=${svar%#}"))); + cpp_category_sp->GetRegexTypeSummariesContainer()->Add( + RegularExpression("^std::multimap<.+> >(( )?&)?$"), + TypeSummaryImplSP( + new StringSummaryFormat(stl_summary_flags, "size=${svar%#}"))); cpp_category_sp->GetRegexTypeSummariesContainer()->Add( RegularExpression("^std::(__cxx11::)?list<.+>(( )?&)?$"), TypeSummaryImplSP( diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/multimap/Makefile b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/multimap/Makefile new file mode 100644 index 000000000000..99998b20bcb0 --- /dev/null +++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/multimap/Makefile @@ -0,0 +1,3 @@ +CXX_SOURCES := main.cpp + +include Makefile.rules diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/multimap/TestDataFormatterGenericMultiMap.py b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/multimap/TestDataFormatterGenericMultiMap.py new file mode 100644 index 000000000000..b90964951fee --- /dev/null +++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/multimap/TestDataFormatterGenericMultiMap.py @@ -0,0 +1,329 @@ +""" +Test lldb data formatter subsystem. +""" + + + +import lldb +from lldbsuite.test.lldbtest import * +from lldbsuite.test.decorators import * +from lldbsuite.test.lldbtest import * +from lldbsuite.test import lldbutil + +USE_LIBSTDCPP = "USE_LIBSTDCPP" +USE_LIBCPP = "USE_LIBCPP" + +class GenericMultiMapDataFormatterTestCase(TestBase): + + mydir = TestBase.compute_mydir(__file__) + + def setUp(self): + TestBase.setUp(self) + self.namespace = 'std' + + def findVariable(self, name): + var = self.frame().FindVariable(name) + self.assertTrue(var.IsValid()) + return var + + def getVariableType(self, name): + var = self.findVariable(name) + return var.GetType().GetDisplayTypeName() + + def check(self, var_name, size): + var = self.findVariable(var_name) + self.assertEqual(var.GetNumChildren(), size) + children = [] + for i in range(size): + child = var.GetChildAtIndex(i) + children.append(ValueCheck(value=child.GetValue())) + self.expect_var_path(var_name, type=self.getVariableType(var_name), children=children) + + def do_test_with_run_command(self, stdlib_type): + """Test that that file and class static variables display correctly.""" + self.build(dictionary={stdlib_type: "1"}) + self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET) + + bkpt = self.target().FindBreakpointByID( + 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) + self.runCmd( + "settings set target.max-children-count 256", + check=False) + + # Execute the cleanup function during test case tear down. + self.addTearDownHook(cleanup) + + multimap = self.namespace + "::multimap" + self.expect('frame variable ii', + substrs=[multimap, 'size=0', + '{}']) + + lldbutil.continue_to_breakpoint(self.process(), bkpt) + + self.expect( + 'frame variable ii', + substrs=[ + multimap, + 'size=2', + '[0] = (first = 0, second = 0)', + '[1] = (first = 1, second = 1)', + ]) + + self.check("ii", 2) + + lldbutil.continue_to_breakpoint(self.process(), bkpt) + + self.expect('frame variable ii', + substrs=[multimap, 'size=4', + '[2] = ', + 'first = 2', + 'second = 0', + '[3] = ', + 'first = 3', + 'second = 1']) + + self.check("ii", 4) + + lldbutil.continue_to_breakpoint(self.process(), bkpt) + + self.expect("frame variable ii", + substrs=[multimap, 'size=8', + '[5] = ', + 'first = 5', + 'second = 0', + '[7] = ', + 'first = 7', + 'second = 1']) + + self.check("ii", 8) + + self.expect("p ii", + substrs=[multimap, 'size=8', + '[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 =']) + + # 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']) + + lldbutil.continue_to_breakpoint(self.process(), bkpt) + + self.expect('frame variable ii', + substrs=[multimap, 'size=0', + '{}']) + + self.expect('frame variable si', + substrs=[multimap, 'size=0', + '{}']) + + lldbutil.continue_to_breakpoint(self.process(), bkpt) + + self.expect('frame variable si', + substrs=[multimap, 'size=1', + '[0] = ', + 'first = \"zero\"', + 'second = 0']) + + lldbutil.continue_to_breakpoint(self.process(), bkpt) + + self.expect( + "frame variable si", + substrs=[ + multimap, + 'size=4', + '[0] = (first = "one", second = 1)', + '[1] = (first = "three", second = 3)', + '[2] = (first = "two", second = 2)', + '[3] = (first = "zero", second = 0)', + ]) + + self.expect("p si", + substrs=[multimap, 'size=4', + '[0] = (first = "one", second = 1)', + '[1] = (first = "three", second = 3)', + '[2] = (first = "two", second = 2)', + '[3] = (first = "zero", second = 0)', + ]) + + # check that MightHaveChildren() gets it right + self.assertTrue( + self.frame().FindVariable("si").MightHaveChildren(), + "si.MightHaveChildren() says False for non empty!") + + # check access-by-index + self.expect("frame variable si[0]", + substrs=['first = ', 'one', + 'second = 1']) + + # 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']) + + lldbutil.continue_to_breakpoint(self.process(), bkpt) + + self.expect('frame variable si', + substrs=[multimap, 'size=0', + '{}']) + + lldbutil.continue_to_breakpoint(self.process(), bkpt) + + self.expect('frame variable is', + substrs=[multimap, 'size=0', + '{}']) + + lldbutil.continue_to_breakpoint(self.process(), bkpt) + + self.expect( + "frame variable is", + substrs=[ + multimap, + 'size=4', + '[0] = (first = 1, second = "is")', + '[1] = (first = 2, second = "smart")', + '[2] = (first = 3, second = "!!!")', + '[3] = (first = 85, second = "goofy")', + ]) + + self.expect( + "p is", + substrs=[ + multimap, + 'size=4', + '[0] = (first = 1, second = "is")', + '[1] = (first = 2, second = "smart")', + '[2] = (first = 3, second = "!!!")', + '[3] = (first = 85, second = "goofy")', + ]) + + # check that MightHaveChildren() gets it right + self.assertTrue( + self.frame().FindVariable("is").MightHaveChildren(), + "is.MightHaveChildren() says False for non empty!") + + # check access-by-index + self.expect("frame variable is[0]", + substrs=['first = ', + 'second =']) + + # 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']) + + lldbutil.continue_to_breakpoint(self.process(), bkpt) + + self.expect('frame variable is', + substrs=[multimap, 'size=0', + '{}']) + + self.check("is", 0) + + lldbutil.continue_to_breakpoint(self.process(), bkpt) + + self.expect('frame variable ss', + substrs=[multimap, 'size=0', + '{}']) + + self.check("ss", 0) + + lldbutil.continue_to_breakpoint(self.process(), bkpt) + + self.expect( + "frame variable ss", + substrs=[ + multimap, + 'size=3', + '[0] = (first = "casa", second = "house")', + '[1] = (first = "ciao", second = "hello")', + '[2] = (first = "gatto", second = "cat")', + ]) + + self.check("ss", 3) + + self.expect( + "p ss", + substrs=[ + multimap, + 'size=3', + '[0] = (first = "casa", second = "house")', + '[1] = (first = "ciao", second = "hello")', + '[2] = (first = "gatto", second = "cat")', + ]) + + # check that MightHaveChildren() gets it right + self.assertTrue( + self.frame().FindVariable("ss").MightHaveChildren(), + "ss.MightHaveChildren() says False for non empty!") + + # check access-by-index + self.expect("frame variable ss[2]", + substrs=['gatto', 'cat']) + + # 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']) + + lldbutil.continue_to_breakpoint(self.process(), bkpt) + + self.expect('frame variable ss', + substrs=[multimap, 'size=0', + '{}']) + + self.check("ss", 0) + + @add_test_categories(["libstdcxx"]) + def test_with_run_command_libstdcpp(self): + self.do_test_with_run_command(USE_LIBSTDCPP) + + @add_test_categories(["libc++"]) + def test_with_run_command_libcpp(self): + self.do_test_with_run_command(USE_LIBCPP) + diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/multimap/main.cpp b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/multimap/main.cpp new file mode 100644 index 000000000000..27bdc0a57729 --- /dev/null +++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/multimap/main.cpp @@ -0,0 +1,77 @@ +#include +#include + +#define intint_map std::multimap +#define strint_map std::multimap +#define intstr_map std::multimap +#define strstr_map std::multimap + +int g_the_foo = 0; + +int thefoo_rw(int arg = 1) +{ + if (arg < 0) + arg = 0; + if (!arg) + arg = 1; + g_the_foo += arg; + return g_the_foo; +} + +int main() +{ + intint_map ii; + + ii.emplace(0,0); // Set break point at this line. + ii.emplace(1,1); + thefoo_rw(1); // Set break point at this line. + ii.emplace(2,0); + ii.emplace(3,1); + thefoo_rw(1); // Set break point at this line. + ii.emplace(4,0); + ii.emplace(5,1); + ii.emplace(6,0); + ii.emplace(7,1); + thefoo_rw(1); // Set break point at this line. + ii.emplace(85,1234567); + + ii.clear(); + + strint_map si; + thefoo_rw(1); // Set break point at this line. + + si.emplace("zero",0); + thefoo_rw(1); // Set break point at this line. + si.emplace("one",1); + si.emplace("two",2); + si.emplace("three",3); + thefoo_rw(1); // Set break point at this line. + si.emplace("four",4); + + si.clear(); + thefoo_rw(1); // Set break point at this line. + + intstr_map is; + thefoo_rw(1); // Set break point at this line. + is.emplace(85,"goofy"); + is.emplace(1,"is"); + is.emplace(2,"smart"); + is.emplace(3,"!!!"); + thefoo_rw(1); // Set break point at this line. + + is.clear(); + thefoo_rw(1); // Set break point at this line. + + strstr_map ss; + thefoo_rw(1); // Set break point at this line. + + ss.emplace("ciao","hello"); + ss.emplace("casa","house"); + ss.emplace("gatto","cat"); + thefoo_rw(1); // Set break point at this line. + ss.emplace("a Mac..","..is always a Mac!"); + + ss.clear(); + thefoo_rw(1); // Set break point at this line. + return 0; +} diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/multimap/Makefile b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/multimap/Makefile deleted file mode 100644 index 564cbada74e0..000000000000 --- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/multimap/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/multimap/TestDataFormatterLibccMultiMap.py b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/multimap/TestDataFormatterLibccMultiMap.py deleted file mode 100644 index 3fd25752da5a..000000000000 --- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/multimap/TestDataFormatterLibccMultiMap.py +++ /dev/null @@ -1,287 +0,0 @@ -""" -Test lldb data formatter subsystem. -""" - - - -import lldb -from lldbsuite.test.lldbtest import * -from lldbsuite.test.decorators import * -from lldbsuite.test.lldbtest import * -from lldbsuite.test import lldbutil - - -class LibcxxMultiMapDataFormatterTestCase(TestBase): - - mydir = TestBase.compute_mydir(__file__) - - def setUp(self): - TestBase.setUp(self) - self.namespace = 'std' - - @add_test_categories(["libc++"]) - def test_with_run_command(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( - 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) - self.runCmd( - "settings set target.max-children-count 256", - check=False) - - # Execute the cleanup function during test case tear down. - self.addTearDownHook(cleanup) - - multimap = self.namespace + "::multimap" - self.expect('frame variable ii', - substrs=[multimap, 'size=0', - '{}']) - - lldbutil.continue_to_breakpoint(self.process(), bkpt) - - self.expect( - 'frame variable ii', - substrs=[ - multimap, - 'size=2', - '[0] = (first = 0, second = 0)', - '[1] = (first = 1, second = 1)', - ]) - - lldbutil.continue_to_breakpoint(self.process(), bkpt) - - self.expect('frame variable ii', - substrs=[multimap, 'size=4', - '[2] = ', - 'first = 2', - 'second = 0', - '[3] = ', - 'first = 3', - 'second = 1']) - - lldbutil.continue_to_breakpoint(self.process(), bkpt) - - self.expect("frame variable ii", - substrs=[multimap, 'size=8', - '[5] = ', - 'first = 5', - 'second = 0', - '[7] = ', - 'first = 7', - 'second = 1']) - - self.expect("p ii", - substrs=[multimap, 'size=8', - '[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 =']) - - # 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']) - - lldbutil.continue_to_breakpoint(self.process(), bkpt) - - self.expect('frame variable ii', - substrs=[multimap, 'size=0', - '{}']) - - self.expect('frame variable si', - substrs=[multimap, 'size=0', - '{}']) - - lldbutil.continue_to_breakpoint(self.process(), bkpt) - - self.expect('frame variable si', - substrs=[multimap, 'size=1', - '[0] = ', - 'first = \"zero\"', - 'second = 0']) - - lldbutil.continue_to_breakpoint(self.process(), bkpt) - - self.expect( - "frame variable si", - substrs=[ - multimap, - 'size=4', - '[0] = (first = "one", second = 1)', - '[1] = (first = "three", second = 3)', - '[2] = (first = "two", second = 2)', - '[3] = (first = "zero", second = 0)', - ]) - - self.expect("p si", - substrs=[multimap, 'size=4', - '[0] = (first = "one", second = 1)', - '[1] = (first = "three", second = 3)', - '[2] = (first = "two", second = 2)', - '[3] = (first = "zero", second = 0)', - ]) - - # check that MightHaveChildren() gets it right - self.assertTrue( - self.frame().FindVariable("si").MightHaveChildren(), - "si.MightHaveChildren() says False for non empty!") - - # check access-by-index - self.expect("frame variable si[0]", - substrs=['first = ', 'one', - 'second = 1']) - - # 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']) - - lldbutil.continue_to_breakpoint(self.process(), bkpt) - - self.expect('frame variable si', - substrs=[multimap, 'size=0', - '{}']) - - lldbutil.continue_to_breakpoint(self.process(), bkpt) - - self.expect('frame variable is', - substrs=[multimap, 'size=0', - '{}']) - - lldbutil.continue_to_breakpoint(self.process(), bkpt) - - self.expect( - "frame variable is", - substrs=[ - multimap, - 'size=4', - '[0] = (first = 1, second = "is")', - '[1] = (first = 2, second = "smart")', - '[2] = (first = 3, second = "!!!")', - '[3] = (first = 85, second = "goofy")', - ]) - - self.expect( - "p is", - substrs=[ - multimap, - 'size=4', - '[0] = (first = 1, second = "is")', - '[1] = (first = 2, second = "smart")', - '[2] = (first = 3, second = "!!!")', - '[3] = (first = 85, second = "goofy")', - ]) - - # check that MightHaveChildren() gets it right - self.assertTrue( - self.frame().FindVariable("is").MightHaveChildren(), - "is.MightHaveChildren() says False for non empty!") - - # check access-by-index - self.expect("frame variable is[0]", - substrs=['first = ', - 'second =']) - - # 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']) - - lldbutil.continue_to_breakpoint(self.process(), bkpt) - - self.expect('frame variable is', - substrs=[multimap, 'size=0', - '{}']) - - lldbutil.continue_to_breakpoint(self.process(), bkpt) - - self.expect('frame variable ss', - substrs=[multimap, 'size=0', - '{}']) - - lldbutil.continue_to_breakpoint(self.process(), bkpt) - - self.expect( - "frame variable ss", - substrs=[ - multimap, - 'size=3', - '[0] = (first = "casa", second = "house")', - '[1] = (first = "ciao", second = "hello")', - '[2] = (first = "gatto", second = "cat")', - ]) - - self.expect( - "p ss", - substrs=[ - multimap, - 'size=3', - '[0] = (first = "casa", second = "house")', - '[1] = (first = "ciao", second = "hello")', - '[2] = (first = "gatto", second = "cat")', - ]) - - # check that MightHaveChildren() gets it right - self.assertTrue( - self.frame().FindVariable("ss").MightHaveChildren(), - "ss.MightHaveChildren() says False for non empty!") - - # check access-by-index - self.expect("frame variable ss[2]", - substrs=['gatto', 'cat']) - - # 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']) - - lldbutil.continue_to_breakpoint(self.process(), bkpt) - - self.expect('frame variable ss', - substrs=[multimap, 'size=0', - '{}']) diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/multimap/main.cpp b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/multimap/main.cpp deleted file mode 100644 index 27bdc0a57729..000000000000 --- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/multimap/main.cpp +++ /dev/null @@ -1,77 +0,0 @@ -#include -#include - -#define intint_map std::multimap -#define strint_map std::multimap -#define intstr_map std::multimap -#define strstr_map std::multimap - -int g_the_foo = 0; - -int thefoo_rw(int arg = 1) -{ - if (arg < 0) - arg = 0; - if (!arg) - arg = 1; - g_the_foo += arg; - return g_the_foo; -} - -int main() -{ - intint_map ii; - - ii.emplace(0,0); // Set break point at this line. - ii.emplace(1,1); - thefoo_rw(1); // Set break point at this line. - ii.emplace(2,0); - ii.emplace(3,1); - thefoo_rw(1); // Set break point at this line. - ii.emplace(4,0); - ii.emplace(5,1); - ii.emplace(6,0); - ii.emplace(7,1); - thefoo_rw(1); // Set break point at this line. - ii.emplace(85,1234567); - - ii.clear(); - - strint_map si; - thefoo_rw(1); // Set break point at this line. - - si.emplace("zero",0); - thefoo_rw(1); // Set break point at this line. - si.emplace("one",1); - si.emplace("two",2); - si.emplace("three",3); - thefoo_rw(1); // Set break point at this line. - si.emplace("four",4); - - si.clear(); - thefoo_rw(1); // Set break point at this line. - - intstr_map is; - thefoo_rw(1); // Set break point at this line. - is.emplace(85,"goofy"); - is.emplace(1,"is"); - is.emplace(2,"smart"); - is.emplace(3,"!!!"); - thefoo_rw(1); // Set break point at this line. - - is.clear(); - thefoo_rw(1); // Set break point at this line. - - strstr_map ss; - thefoo_rw(1); // Set break point at this line. - - ss.emplace("ciao","hello"); - ss.emplace("casa","house"); - ss.emplace("gatto","cat"); - thefoo_rw(1); // Set break point at this line. - ss.emplace("a Mac..","..is always a Mac!"); - - ss.clear(); - thefoo_rw(1); // Set break point at this line. - return 0; -}