2 Test that C++ template classes that have integer parameters work correctly.
4 We must reconstruct the types correctly so the template types are correct
5 and display correctly, and also make sure the expression parser works and
6 is able the find all needed functions when evaluating expressions
9 from lldbsuite.test.decorators import *
10 from lldbsuite.test.lldbtest import *
11 from lldbsuite.test import lldbutil
14 class TemplateArgsTestCase(TestBase):
16 mydir = TestBase.compute_mydir(__file__)
18 def prepareProcess(self):
21 # Create a target by the debugger.
22 exe = os.path.join(os.getcwd(), "a.out")
23 target = self.dbg.CreateTarget(exe)
24 self.assertTrue(target, VALID_TARGET)
26 # Set breakpoints inside and outside methods that take pointers to the
28 line = line_number('main.cpp', '// Breakpoint 1')
29 lldbutil.run_break_set_by_file_and_line(
30 self, "main.cpp", line, num_expected_locations=1, loc_exact=True)
35 # Now launch the process, and do not stop at entry point.
36 process = target.LaunchSimple(
37 arguments, environment, self.get_process_working_directory())
38 self.assertTrue(process, PROCESS_IS_VALID)
40 # Get the thread of the process
42 process.GetState() == lldb.eStateStopped,
44 thread = lldbutil.get_stopped_thread(
45 process, lldb.eStopReasonBreakpoint)
47 # Get frame for current thread
48 return thread.GetSelectedFrame()
50 @expectedFailureAll(oslist=["windows"])
51 def test_integer_args(self):
52 frame = self.prepareProcess()
54 testpos = frame.FindVariable('testpos')
57 'make sure we find a local variabble named "testpos"')
58 self.assertTrue(testpos.GetType().GetName() == 'TestObj<1>')
60 expr_result = frame.EvaluateExpression("testpos.getArg()")
62 expr_result.IsValid(),
63 'got a valid expression result from expression "testpos.getArg()"')
64 self.assertTrue(expr_result.GetValue() == "1", "testpos.getArg() == 1")
66 expr_result.GetType().GetName() == "int",
67 'expr_result.GetType().GetName() == "int"')
69 testneg = frame.FindVariable('testneg')
72 'make sure we find a local variabble named "testneg"')
73 self.assertTrue(testneg.GetType().GetName() == 'TestObj<-1>')
75 expr_result = frame.EvaluateExpression("testneg.getArg()")
77 expr_result.IsValid(),
78 'got a valid expression result from expression "testneg.getArg()"')
80 expr_result.GetValue() == "-1",
81 "testneg.getArg() == -1")
83 expr_result.GetType().GetName() == "int",
84 'expr_result.GetType().GetName() == "int"')
86 # Gcc does not generate the necessary DWARF attribute for enum template
88 @expectedFailureAll(bugnumber="llvm.org/pr28354", compiler="gcc")
89 @expectedFailureAll(oslist=["windows"])
90 def test_enum_args(self):
91 frame = self.prepareProcess()
93 # Make sure "member" can be displayed and also used in an expression
95 member = frame.FindVariable('member')
98 'make sure we find a local variabble named "member"')
99 self.assertTrue(member.GetType().GetName() ==
100 'EnumTemplate<EnumType::Member>')
102 expr_result = frame.EvaluateExpression("member.getMember()")
104 expr_result.IsValid(),
105 'got a valid expression result from expression "member.getMember()"')
107 expr_result.GetValue() == "123",
108 "member.getMember() == 123")
110 expr_result.GetType().GetName() == "int",
111 'expr_result.GetType().GetName() == "int"')
113 # Make sure "subclass" can be displayed and also used in an expression
115 subclass = frame.FindVariable('subclass')
118 'make sure we find a local variabble named "subclass"')
119 self.assertTrue(subclass.GetType().GetName() ==
120 'EnumTemplate<EnumType::Subclass>')
122 expr_result = frame.EvaluateExpression("subclass.getMember()")
124 expr_result.IsValid(),
125 'got a valid expression result from expression "subclass.getMember()"')
127 expr_result.GetValue() == "246",
128 "subclass.getMember() == 246")
130 expr_result.GetType().GetName() == "int",
131 'expr_result.GetType().GetName() == "int"')