xref: /llvm-project/lldb/test/API/lang/cpp/template/TestTemplateArgs.py (revision 80fcecb13c388ff087a27a4b0e7ca3dd8c98eaa4)
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