199451b44SJordan Rupprecht"""
299451b44SJordan RupprechtMake sure if we have two classes with the same base name the
399451b44SJordan Rupprechtdynamic value calculator doesn't confuse them
499451b44SJordan Rupprecht"""
599451b44SJordan Rupprecht
699451b44SJordan Rupprecht
799451b44SJordan Rupprecht
899451b44SJordan Rupprechtimport lldb
999451b44SJordan Rupprechtimport lldbsuite.test.lldbutil as lldbutil
1099451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
1199451b44SJordan Rupprecht
1299451b44SJordan Rupprecht
1399451b44SJordan Rupprechtclass DynamicValueSameBaseTestCase(TestBase):
1499451b44SJordan Rupprecht
15*c6ad6901SVenkata Ramanaiah Nalamothu    # If your test case doesn't stress debug info, then
1699451b44SJordan Rupprecht    # set this to true.  That way it won't be run once for
1799451b44SJordan Rupprecht    # each debug info format.
1899451b44SJordan Rupprecht    NO_DEBUG_INFO_TESTCASE = True
1999451b44SJordan Rupprecht
2099451b44SJordan Rupprecht    def test_same_basename_this(self):
2199451b44SJordan Rupprecht        """Test that the we use the full name to resolve dynamic types."""
2299451b44SJordan Rupprecht        self.build()
2399451b44SJordan Rupprecht        self.main_source_file = lldb.SBFileSpec("main.cpp")
2499451b44SJordan Rupprecht        self.sample_test()
2599451b44SJordan Rupprecht
2699451b44SJordan Rupprecht    def sample_test(self):
2799451b44SJordan Rupprecht        (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint(self,
2899451b44SJordan Rupprecht                                   "Break here to get started", self.main_source_file)
2999451b44SJordan Rupprecht
3099451b44SJordan Rupprecht        # Set breakpoints in the two class methods and run to them:
3199451b44SJordan Rupprecht        namesp_bkpt = target.BreakpointCreateBySourceRegex("namesp function did something.", self.main_source_file)
3299451b44SJordan Rupprecht        self.assertEqual(namesp_bkpt.GetNumLocations(), 1, "Namespace breakpoint invalid")
3399451b44SJordan Rupprecht
3499451b44SJordan Rupprecht        virtual_bkpt = target.BreakpointCreateBySourceRegex("Virtual function did something.", self.main_source_file)
3599451b44SJordan Rupprecht        self.assertEqual(virtual_bkpt.GetNumLocations(), 1, "Virtual breakpoint invalid")
3699451b44SJordan Rupprecht
3799451b44SJordan Rupprecht        threads = lldbutil.continue_to_breakpoint(process, namesp_bkpt)
3899451b44SJordan Rupprecht        self.assertEqual(len(threads), 1, "Didn't stop at namespace breakpoint")
3999451b44SJordan Rupprecht
4099451b44SJordan Rupprecht        frame = threads[0].frame[0]
4199451b44SJordan Rupprecht        namesp_this = frame.FindVariable("this", lldb.eDynamicCanRunTarget)
4299451b44SJordan Rupprecht        # Clang specifies the type of this as "T *", gcc as "T * const". This
4399451b44SJordan Rupprecht        # erases the difference.
4499451b44SJordan Rupprecht        namesp_type = namesp_this.GetType().GetUnqualifiedType()
4599451b44SJordan Rupprecht        self.assertEqual(namesp_type.GetName(), "namesp::Virtual *", "Didn't get the right dynamic type")
4699451b44SJordan Rupprecht
4799451b44SJordan Rupprecht        threads = lldbutil.continue_to_breakpoint(process, virtual_bkpt)
4899451b44SJordan Rupprecht        self.assertEqual(len(threads), 1, "Didn't stop at virtual breakpoint")
4999451b44SJordan Rupprecht
5099451b44SJordan Rupprecht        frame = threads[0].frame[0]
5199451b44SJordan Rupprecht        virtual_this = frame.FindVariable("this", lldb.eDynamicCanRunTarget)
5299451b44SJordan Rupprecht        virtual_type = virtual_this.GetType().GetUnqualifiedType()
5399451b44SJordan Rupprecht        self.assertEqual(virtual_type.GetName(), "Virtual *", "Didn't get the right dynamic type")
5499451b44SJordan Rupprecht
5599451b44SJordan Rupprecht
5699451b44SJordan Rupprecht
57