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