Author: Raphael Isemann Date: 2021-10-14T20:32:07+02:00 New Revision: 78e17e23aa0fe525d00a2e8f0c7469f9a6b94f40
URL: https://github.com/llvm/llvm-project/commit/78e17e23aa0fe525d00a2e8f0c7469f9a6b94f40 DIFF: https://github.com/llvm/llvm-project/commit/78e17e23aa0fe525d00a2e8f0c7469f9a6b94f40.diff LOG: [lldb] Rewrite TestDiamond and document some bugs. Added: lldb/test/API/lang/cpp/diamond/TestCppDiamond.py Modified: lldb/test/API/lang/cpp/diamond/main.cpp Removed: lldb/test/API/lang/cpp/diamond/TestDiamond.py ################################################################################ diff --git a/lldb/test/API/lang/cpp/diamond/TestCppDiamond.py b/lldb/test/API/lang/cpp/diamond/TestCppDiamond.py new file mode 100644 index 0000000000000..4a561be425775 --- /dev/null +++ b/lldb/test/API/lang/cpp/diamond/TestCppDiamond.py @@ -0,0 +1,84 @@ +""" +Test diamond inheritance. +""" + +import lldb +from lldbsuite.test.lldbtest import * +from lldbsuite.test.decorators import * +import lldbsuite.test.lldbutil as lldbutil + + +class TestCase(TestBase): + + mydir = TestBase.compute_mydir(__file__) + + @no_debug_info_test + def test_with_sbvalue(self): + """ + Test that virtual base classes work in when SBValue objects are + used to explore the class. + """ + self.build() + lldbutil.run_to_source_breakpoint(self, "// breakpoint 1", lldb.SBFileSpec("main.cpp")) + + j1 = self.frame().FindVariable("j1") + j1_Derived1 = j1.GetChildAtIndex(0) + j1_Derived2 = j1.GetChildAtIndex(1) + j1_Derived1_VBase = j1_Derived1.GetChildAtIndex(0) + j1_Derived2_VBase = j1_Derived2.GetChildAtIndex(0) + j1_Derived1_VBase_m_value = j1_Derived1_VBase.GetChildAtIndex(0) + j1_Derived2_VBase_m_value = j1_Derived2_VBase.GetChildAtIndex(0) + + self.assertEqual( + j1_Derived1_VBase.GetLoadAddress(), j1_Derived2_VBase.GetLoadAddress(), + "ensure virtual base class is the same between Derived1 and Derived2") + self.assertEqual(j1_Derived1_VBase_m_value.GetValueAsUnsigned( + 1), j1_Derived2_VBase_m_value.GetValueAsUnsigned(2), "ensure m_value in VBase is the same") + self.assertEqual(self.frame().FindVariable("d").GetChildAtIndex(0).GetChildAtIndex( + 0).GetValueAsUnsigned(0), 12345, "ensure Derived2 from j1 is correct") + + # This reassigns 'd' to point to 'j2'. + self.thread().StepOver() + + self.assertEqual(self.frame().FindVariable("d").GetChildAtIndex(0).GetChildAtIndex( + 0).GetValueAsUnsigned(0), 12346, "ensure Derived2 from j2 is correct") + + @no_debug_info_test + def test(self): + self.build() + lldbutil.run_to_source_breakpoint(self, "// breakpoint 1", lldb.SBFileSpec("main.cpp")) + + # All the children of j1. + children = [ + ValueCheck(type="Derived1", children=[ + ValueCheck(type="VBase", children=[ + ValueCheck(type="int", name="m_value", value="12345") + ]) + ]), + ValueCheck(type="Derived2", children=[ + ValueCheck(type="VBase", children=[ + ValueCheck(type="int", name="m_value", value="12345") + ]) + ]), + ValueCheck(type="long", value="1"), + ] + # Try using the class with expression evaluator/variable paths. + self.expect_expr("j1", result_type="Joiner1", result_children=children) + self.expect_var_path("j1", type="Joiner1", children=children) + + # Use the expression evaluator to access the members. + self.expect_expr("j1.x", result_type="long", result_value="1") + self.expect_expr("j1.m_value", result_type="int", result_value="12345") + + # Use variable paths to access the members. + self.expect_var_path("j1.x", type="long", value="1") + + @expectedFailureAll + @no_debug_info_test + def test(self): + self.build() + lldbutil.run_to_source_breakpoint(self, "// breakpoint 1", lldb.SBFileSpec("main.cpp")) + # FIXME: This is completely broken and 'succeeds' with an error that + # there is noch such value/member in Joiner1. Move this up to the test + # above when fixed. + self.expect_var_path("j1.m_value", type="int", value="12345") diff --git a/lldb/test/API/lang/cpp/diamond/TestDiamond.py b/lldb/test/API/lang/cpp/diamond/TestDiamond.py deleted file mode 100644 index a77864bd841ad..0000000000000 --- a/lldb/test/API/lang/cpp/diamond/TestDiamond.py +++ /dev/null @@ -1,51 +0,0 @@ -""" -Tests that bool types work -""" -import lldb -from lldbsuite.test.lldbtest import * -import lldbsuite.test.lldbutil as lldbutil - - -class CPPTestDiamondInheritance(TestBase): - - mydir = TestBase.compute_mydir(__file__) - - def test_with_run_command(self): - """Test that virtual base classes work in when SBValue objects are used to explore the variable value""" - self.build() - exe = self.getBuildArtifact("a.out") - - target = self.dbg.CreateTarget(exe) - self.assertTrue(target, VALID_TARGET) - self.set_breakpoint(line_number('main.cpp', '// breakpoint 1')) - self.set_breakpoint(line_number('main.cpp', '// breakpoint 2')) - process = target.LaunchSimple( - None, None, self.get_process_working_directory()) - self.assertTrue(process, PROCESS_IS_VALID) - thread = lldbutil.get_stopped_thread( - process, lldb.eStopReasonBreakpoint) - self.assertIsNotNone(thread) - frame = thread.GetFrameAtIndex(0) - j1 = frame.FindVariable("j1") - j1_Derived1 = j1.GetChildAtIndex(0) - j1_Derived2 = j1.GetChildAtIndex(1) - j1_Derived1_VBase = j1_Derived1.GetChildAtIndex(0) - j1_Derived2_VBase = j1_Derived2.GetChildAtIndex(0) - j1_Derived1_VBase_m_value = j1_Derived1_VBase.GetChildAtIndex(0) - j1_Derived2_VBase_m_value = j1_Derived2_VBase.GetChildAtIndex(0) - self.assertEqual( - j1_Derived1_VBase.GetLoadAddress(), j1_Derived2_VBase.GetLoadAddress(), - "ensure virtual base class is the same between Derived1 and Derived2") - self.assertTrue(j1_Derived1_VBase_m_value.GetValueAsUnsigned( - 1) == j1_Derived2_VBase_m_value.GetValueAsUnsigned(2), "ensure m_value in VBase is the same") - self.assertTrue(frame.FindVariable("d").GetChildAtIndex(0).GetChildAtIndex( - 0).GetValueAsUnsigned(0) == 12345, "ensure Derived2 from j1 is correct") - thread.StepOver() - self.assertTrue(frame.FindVariable("d").GetChildAtIndex(0).GetChildAtIndex( - 0).GetValueAsUnsigned(0) == 12346, "ensure Derived2 from j2 is correct") - - def set_breakpoint(self, line): - # Some compilers (for example GCC 4.4.7 and 4.6.1) emit multiple locations for the statement with the ternary - # operator in the test program, while others emit only 1. - lldbutil.run_break_set_by_file_and_line( - self, "main.cpp", line, num_expected_locations=-1, loc_exact=False) diff --git a/lldb/test/API/lang/cpp/diamond/main.cpp b/lldb/test/API/lang/cpp/diamond/main.cpp index 8f9714d33172c..fdf2f3d326747 100644 --- a/lldb/test/API/lang/cpp/diamond/main.cpp +++ b/lldb/test/API/lang/cpp/diamond/main.cpp @@ -1,77 +1,29 @@ -#include <stdio.h> - static int g_next_value = 12345; -class VBase -{ -public: - VBase() : m_value(g_next_value++) {} - virtual ~VBase() {} - void Print() - { - printf("%p: %s\n%p: m_value = 0x%8.8x\n", this, __PRETTY_FUNCTION__, &m_value, m_value); - } - int m_value; +struct VBase { + VBase() : m_value(g_next_value++) {} + virtual ~VBase() {} + int m_value; }; -class Derived1 : public virtual VBase -{ -public: - Derived1() {}; - void Print () - { - printf("%p: %s\n", this, __PRETTY_FUNCTION__); - VBase::Print(); - } - +struct Derived1 : public virtual VBase { }; -class Derived2 : public virtual VBase -{ -public: - Derived2() {}; - - void Print () - { - printf("%p: %s\n", this, __PRETTY_FUNCTION__); - VBase::Print(); - } +struct Derived2 : public virtual VBase { }; -class Joiner1 : public Derived1, public Derived2 -{ -public: - Joiner1() : - m_joiner1(3456), - m_joiner2(6789) {} - void Print () - { - printf("%p: %s \n%p: m_joiner1 = 0x%8.8x\n%p: m_joiner2 = 0x%8.8x\n", - this, - __PRETTY_FUNCTION__, - &m_joiner1, - m_joiner1, - &m_joiner2, - m_joiner2); - Derived1::Print(); - Derived2::Print(); - } - int m_joiner1; - int m_joiner2; +struct Joiner1 : public Derived1, public Derived2 { + long x = 1; }; -class Joiner2 : public Derived2 -{ - int m_stuff[32]; +struct Joiner2 : public Derived2 { + long y = 2; }; -int main(int argc, const char * argv[]) -{ - Joiner1 j1; - Joiner2 j2; - j1.Print(); - j2.Print(); - Derived2 *d = &j1; - d = &j2; // breakpoint 1 - return 0; // breakpoint 2 +int main(int argc, const char *argv[]) { + Joiner1 j1; + Joiner2 j2; + Derived2 *d = &j1; + d = &j2; // breakpoint 1 + return 0; // breakpoint 2 } _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits