199451b44SJordan Rupprecht""" 299451b44SJordan RupprechtTest that C++ template classes that have integer parameters work correctly. 399451b44SJordan Rupprecht 499451b44SJordan RupprechtWe must reconstruct the types correctly so the template types are correct 599451b44SJordan Rupprechtand display correctly, and also make sure the expression parser works and 699451b44SJordan Rupprechtis able the find all needed functions when evaluating expressions 799451b44SJordan Rupprecht""" 899451b44SJordan Rupprechtimport lldb 999451b44SJordan Rupprechtfrom lldbsuite.test.decorators import * 1099451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 1199451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil 1299451b44SJordan Rupprecht 1399451b44SJordan Rupprecht 1499451b44SJordan Rupprechtclass TemplateArgsTestCase(TestBase): 1599451b44SJordan Rupprecht def prepareProcess(self): 1699451b44SJordan Rupprecht self.build() 1799451b44SJordan Rupprecht 1899451b44SJordan Rupprecht # Create a target by the debugger. 1999451b44SJordan Rupprecht exe = self.getBuildArtifact("a.out") 2099451b44SJordan Rupprecht target = self.dbg.CreateTarget(exe) 2199451b44SJordan Rupprecht self.assertTrue(target, VALID_TARGET) 2299451b44SJordan Rupprecht 2399451b44SJordan Rupprecht # Set breakpoints inside and outside methods that take pointers to the 2499451b44SJordan Rupprecht # containing struct. 252238dcc3SJonas Devlieghere line = line_number("main.cpp", "// Breakpoint 1") 2699451b44SJordan Rupprecht lldbutil.run_break_set_by_file_and_line( 272238dcc3SJonas Devlieghere self, "main.cpp", line, num_expected_locations=1, loc_exact=True 282238dcc3SJonas Devlieghere ) 2999451b44SJordan Rupprecht 3099451b44SJordan Rupprecht arguments = None 3199451b44SJordan Rupprecht environment = None 3299451b44SJordan Rupprecht 3399451b44SJordan Rupprecht # Now launch the process, and do not stop at entry point. 3499451b44SJordan Rupprecht process = target.LaunchSimple( 352238dcc3SJonas Devlieghere arguments, environment, self.get_process_working_directory() 362238dcc3SJonas Devlieghere ) 3799451b44SJordan Rupprecht self.assertTrue(process, PROCESS_IS_VALID) 3899451b44SJordan Rupprecht 3999451b44SJordan Rupprecht # Get the thread of the process 402238dcc3SJonas Devlieghere self.assertEqual(process.GetState(), lldb.eStateStopped, PROCESS_STOPPED) 412238dcc3SJonas Devlieghere thread = lldbutil.get_stopped_thread(process, lldb.eStopReasonBreakpoint) 4299451b44SJordan Rupprecht 4399451b44SJordan Rupprecht # Get frame for current thread 4499451b44SJordan Rupprecht return thread.GetSelectedFrame() 4599451b44SJordan Rupprecht 4699451b44SJordan Rupprecht def test_integer_args(self): 4799451b44SJordan Rupprecht frame = self.prepareProcess() 4899451b44SJordan Rupprecht 492238dcc3SJonas Devlieghere testpos = frame.FindVariable("testpos") 5099451b44SJordan Rupprecht self.assertTrue( 512238dcc3SJonas Devlieghere testpos.IsValid(), 'make sure we find a local variabble named "testpos"' 522238dcc3SJonas Devlieghere ) 53*80fcecb1SJonas Devlieghere self.assertEqual(testpos.GetType().GetName(), "TestObj<1>") 5499451b44SJordan Rupprecht 5599451b44SJordan Rupprecht expr_result = frame.EvaluateExpression("testpos.getArg()") 5699451b44SJordan Rupprecht self.assertTrue( 5799451b44SJordan Rupprecht expr_result.IsValid(), 582238dcc3SJonas Devlieghere 'got a valid expression result from expression "testpos.getArg()"', 592238dcc3SJonas Devlieghere ) 60*80fcecb1SJonas Devlieghere self.assertEqual(expr_result.GetValue(), "1", "testpos.getArg() == 1") 610ed758b2SDave Lee self.assertEqual( 622238dcc3SJonas Devlieghere expr_result.GetType().GetName(), 632238dcc3SJonas Devlieghere "int", 642238dcc3SJonas Devlieghere 'expr_result.GetType().GetName() == "int"', 652238dcc3SJonas Devlieghere ) 6699451b44SJordan Rupprecht 672238dcc3SJonas Devlieghere testneg = frame.FindVariable("testneg") 6899451b44SJordan Rupprecht self.assertTrue( 692238dcc3SJonas Devlieghere testneg.IsValid(), 'make sure we find a local variabble named "testneg"' 702238dcc3SJonas Devlieghere ) 71*80fcecb1SJonas Devlieghere self.assertEqual(testneg.GetType().GetName(), "TestObj<-1>") 7299451b44SJordan Rupprecht 7399451b44SJordan Rupprecht expr_result = frame.EvaluateExpression("testneg.getArg()") 7499451b44SJordan Rupprecht self.assertTrue( 7599451b44SJordan Rupprecht expr_result.IsValid(), 762238dcc3SJonas Devlieghere 'got a valid expression result from expression "testneg.getArg()"', 772238dcc3SJonas Devlieghere ) 782238dcc3SJonas Devlieghere self.assertEqual(expr_result.GetValue(), "-1", "testneg.getArg() == -1") 790ed758b2SDave Lee self.assertEqual( 802238dcc3SJonas Devlieghere expr_result.GetType().GetName(), 812238dcc3SJonas Devlieghere "int", 822238dcc3SJonas Devlieghere 'expr_result.GetType().GetName() == "int"', 832238dcc3SJonas Devlieghere ) 8499451b44SJordan Rupprecht 8599451b44SJordan Rupprecht @expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr24489") 8699451b44SJordan Rupprecht def test_template_template_args(self): 8799451b44SJordan Rupprecht frame = self.prepareProcess() 8899451b44SJordan Rupprecht 892238dcc3SJonas Devlieghere c1 = frame.FindVariable("c1") 902238dcc3SJonas Devlieghere self.assertTrue(c1.IsValid(), 'make sure we find a local variabble named "c1"') 91*80fcecb1SJonas Devlieghere self.assertEqual(c1.GetType().GetName(), "C<float, T1>") 922238dcc3SJonas Devlieghere f1 = ( 932238dcc3SJonas Devlieghere c1.GetChildMemberWithName("V") 942238dcc3SJonas Devlieghere .GetChildAtIndex(0) 952238dcc3SJonas Devlieghere .GetChildMemberWithName("f") 962238dcc3SJonas Devlieghere ) 97*80fcecb1SJonas Devlieghere self.assertEqual(f1.GetType().GetName(), "float") 98*80fcecb1SJonas Devlieghere self.assertEqual(f1.GetValue(), "1.5") 9999451b44SJordan Rupprecht 1002238dcc3SJonas Devlieghere c2 = frame.FindVariable("c2") 1012238dcc3SJonas Devlieghere self.assertTrue(c2.IsValid(), 'make sure we find a local variabble named "c2"') 102*80fcecb1SJonas Devlieghere self.assertEqual(c2.GetType().GetName(), "C<double, T1, T2>") 1032238dcc3SJonas Devlieghere f2 = ( 1042238dcc3SJonas Devlieghere c2.GetChildMemberWithName("V") 1052238dcc3SJonas Devlieghere .GetChildAtIndex(0) 1062238dcc3SJonas Devlieghere .GetChildMemberWithName("f") 1072238dcc3SJonas Devlieghere ) 108*80fcecb1SJonas Devlieghere self.assertEqual(f2.GetType().GetName(), "double") 109*80fcecb1SJonas Devlieghere self.assertEqual(f2.GetValue(), "1.5") 1102238dcc3SJonas Devlieghere f3 = ( 1112238dcc3SJonas Devlieghere c2.GetChildMemberWithName("V") 1122238dcc3SJonas Devlieghere .GetChildAtIndex(1) 1132238dcc3SJonas Devlieghere .GetChildMemberWithName("f") 1142238dcc3SJonas Devlieghere ) 115*80fcecb1SJonas Devlieghere self.assertEqual(f3.GetType().GetName(), "double") 116*80fcecb1SJonas Devlieghere self.assertEqual(f3.GetValue(), "2.5") 1172238dcc3SJonas Devlieghere f4 = ( 1182238dcc3SJonas Devlieghere c2.GetChildMemberWithName("V") 1192238dcc3SJonas Devlieghere .GetChildAtIndex(1) 1202238dcc3SJonas Devlieghere .GetChildMemberWithName("i") 1212238dcc3SJonas Devlieghere ) 122*80fcecb1SJonas Devlieghere self.assertEqual(f4.GetType().GetName(), "int") 123*80fcecb1SJonas Devlieghere self.assertEqual(f4.GetValue(), "42") 12499451b44SJordan Rupprecht 12599451b44SJordan Rupprecht # Gcc does not generate the necessary DWARF attribute for enum template 12699451b44SJordan Rupprecht # parameters. 12799451b44SJordan Rupprecht @expectedFailureAll(bugnumber="llvm.org/pr28354", compiler="gcc") 1282238dcc3SJonas Devlieghere @skipIf(dwarf_version=["<", "4"]) 12999451b44SJordan Rupprecht def test_enum_args(self): 13099451b44SJordan Rupprecht frame = self.prepareProcess() 13199451b44SJordan Rupprecht 13299451b44SJordan Rupprecht # Make sure "member" can be displayed and also used in an expression 13399451b44SJordan Rupprecht # correctly 1342238dcc3SJonas Devlieghere member = frame.FindVariable("member") 13599451b44SJordan Rupprecht self.assertTrue( 1362238dcc3SJonas Devlieghere member.IsValid(), 'make sure we find a local variabble named "member"' 1372238dcc3SJonas Devlieghere ) 1382238dcc3SJonas Devlieghere self.assertEqual(member.GetType().GetName(), "EnumTemplate<EnumType::Member>") 13999451b44SJordan Rupprecht 14099451b44SJordan Rupprecht expr_result = frame.EvaluateExpression("member.getMember()") 14199451b44SJordan Rupprecht self.assertTrue( 14299451b44SJordan Rupprecht expr_result.IsValid(), 1432238dcc3SJonas Devlieghere 'got a valid expression result from expression "member.getMember()"', 1442238dcc3SJonas Devlieghere ) 1452238dcc3SJonas Devlieghere self.assertEqual(expr_result.GetValue(), "123", "member.getMember() == 123") 1460ed758b2SDave Lee self.assertEqual( 1472238dcc3SJonas Devlieghere expr_result.GetType().GetName(), 1482238dcc3SJonas Devlieghere "int", 1492238dcc3SJonas Devlieghere 'expr_result.GetType().GetName() == "int"', 1502238dcc3SJonas Devlieghere ) 15199451b44SJordan Rupprecht 15299451b44SJordan Rupprecht # Make sure "subclass" can be displayed and also used in an expression 15399451b44SJordan Rupprecht # correctly 1542238dcc3SJonas Devlieghere subclass = frame.FindVariable("subclass") 15599451b44SJordan Rupprecht self.assertTrue( 1562238dcc3SJonas Devlieghere subclass.IsValid(), 'make sure we find a local variabble named "subclass"' 1572238dcc3SJonas Devlieghere ) 1582238dcc3SJonas Devlieghere self.assertEqual( 1592238dcc3SJonas Devlieghere subclass.GetType().GetName(), "EnumTemplate<EnumType::Subclass>" 1602238dcc3SJonas Devlieghere ) 16199451b44SJordan Rupprecht 16299451b44SJordan Rupprecht expr_result = frame.EvaluateExpression("subclass.getMember()") 16399451b44SJordan Rupprecht self.assertTrue( 16499451b44SJordan Rupprecht expr_result.IsValid(), 1652238dcc3SJonas Devlieghere 'got a valid expression result from expression "subclass.getMember()"', 1662238dcc3SJonas Devlieghere ) 1672238dcc3SJonas Devlieghere self.assertEqual(expr_result.GetValue(), "246", "subclass.getMember() == 246") 1680ed758b2SDave Lee self.assertEqual( 1692238dcc3SJonas Devlieghere expr_result.GetType().GetName(), 1702238dcc3SJonas Devlieghere "int", 1712238dcc3SJonas Devlieghere 'expr_result.GetType().GetName() == "int"', 1722238dcc3SJonas Devlieghere ) 173