1*99451b44SJordan Rupprecht"""
2*99451b44SJordan RupprechtTests that C++ member and static variables are available where they should be.
3*99451b44SJordan Rupprecht"""
4*99451b44SJordan Rupprechtimport lldb
5*99451b44SJordan Rupprechtfrom lldbsuite.test.decorators import *
6*99451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
7*99451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil
8*99451b44SJordan Rupprecht
9*99451b44SJordan Rupprecht
10*99451b44SJordan Rupprechtclass CPPThisTestCase(TestBase):
11*99451b44SJordan Rupprecht
12*99451b44SJordan Rupprecht    # rdar://problem/9962849
13*99451b44SJordan Rupprecht    @expectedFailureAll(
14*99451b44SJordan Rupprecht        compiler="gcc",
15*99451b44SJordan Rupprecht        bugnumber="llvm.org/pr15439 The 'this' pointer isn't available during expression evaluation when stopped in an inlined member function")
16*99451b44SJordan Rupprecht    @expectedFailureAll(
17*99451b44SJordan Rupprecht        compiler="icc",
18*99451b44SJordan Rupprecht        bugnumber="ICC doesn't emit correct DWARF inline debug info for inlined member functions.")
19*99451b44SJordan Rupprecht    @expectedFailureAll(
20*99451b44SJordan Rupprecht        oslist=["windows"],
21*99451b44SJordan Rupprecht        bugnumber="llvm.org/pr24489: Name lookup not working correctly on Windows")
22*99451b44SJordan Rupprecht    def test_with_run_command(self):
23*99451b44SJordan Rupprecht        """Test that the appropriate member variables are available when stopped in C++ static, inline, and const methods"""
24*99451b44SJordan Rupprecht        self.build()
25*99451b44SJordan Rupprecht        self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET)
26*99451b44SJordan Rupprecht
27*99451b44SJordan Rupprecht        self.set_breakpoint(line_number('main.cpp', '// breakpoint 1'))
28*99451b44SJordan Rupprecht        self.set_breakpoint(line_number('main.cpp', '// breakpoint 2'))
29*99451b44SJordan Rupprecht        self.set_breakpoint(line_number('main.cpp', '// breakpoint 3'))
30*99451b44SJordan Rupprecht        self.set_breakpoint(line_number('main.cpp', '// breakpoint 4'))
31*99451b44SJordan Rupprecht
32*99451b44SJordan Rupprecht        self.runCmd("process launch", RUN_SUCCEEDED)
33*99451b44SJordan Rupprecht
34*99451b44SJordan Rupprecht        self.expect("expression -- m_a = 2",
35*99451b44SJordan Rupprecht                    startstr="(int) $0 = 2")
36*99451b44SJordan Rupprecht
37*99451b44SJordan Rupprecht        self.runCmd("process continue")
38*99451b44SJordan Rupprecht
39*99451b44SJordan Rupprecht        # This would be disallowed if we enforced const.  But we don't.
40*99451b44SJordan Rupprecht        self.expect("expression -- m_a = 2",
41*99451b44SJordan Rupprecht                    startstr="(int) $1 = 2")
42*99451b44SJordan Rupprecht
43*99451b44SJordan Rupprecht        self.expect("expression -- (int)getpid(); m_a",
44*99451b44SJordan Rupprecht                    startstr="(int) $2 = 2")
45*99451b44SJordan Rupprecht
46*99451b44SJordan Rupprecht        self.runCmd("process continue")
47*99451b44SJordan Rupprecht
48*99451b44SJordan Rupprecht        self.expect("expression -- s_a",
49*99451b44SJordan Rupprecht                    startstr="(int) $3 = 5")
50*99451b44SJordan Rupprecht
51*99451b44SJordan Rupprecht        self.runCmd("process continue")
52*99451b44SJordan Rupprecht
53*99451b44SJordan Rupprecht        self.expect("expression -- m_a",
54*99451b44SJordan Rupprecht                    startstr="(int) $4 = 2")
55*99451b44SJordan Rupprecht
56*99451b44SJordan Rupprecht    def set_breakpoint(self, line):
57*99451b44SJordan Rupprecht        lldbutil.run_break_set_by_file_and_line(
58*99451b44SJordan Rupprecht            self, "main.cpp", line, num_expected_locations=1, loc_exact=False)
59