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