TestCPPThis.py revision d60b54fbccf3a9bc816cc7fa8fe8362a40d91f38
1"""
2Tests that C++ member and static variables are available where they should be.
3"""
4import lldb
5from lldbtest import *
6import lldbutil
7
8class CPPThisTestCase(TestBase):
9
10    mydir = os.path.join("lang", "cpp", "this")
11
12    @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
13    #rdar://problem/9962849
14    #@expectedFailureClang
15    @dsym_test
16    def test_with_dsym_and_run_command(self):
17        """Test that the appropriate member variables are available when stopped in C++ static, inline, and const methods"""
18        self.buildDsym()
19        self.static_method_commands()
20
21    #rdar://problem/9962849
22    @expectedFailureFreeBSD('llvm.org/pr16697') # Expression fails with 'there is no JIT compiled function'
23    @expectedFailureGcc # llvm.org/pr15439 The 'this' pointer isn't available during expression evaluation when stopped in an inlined member function.
24    @expectedFailureIcc # ICC doesn't emit correct DWARF inline debug info for inlined member functions
25    @dwarf_test
26    def test_with_dwarf_and_run_command(self):
27        """Test that the appropriate member variables are available when stopped in C++ static, inline, and const methods"""
28        self.buildDwarf()
29        self.static_method_commands()
30
31    def setUp(self):
32        TestBase.setUp(self)
33
34    def set_breakpoint(self, line):
35        lldbutil.run_break_set_by_file_and_line (self, "main.cpp", line, num_expected_locations=1, loc_exact=False)
36
37    def static_method_commands(self):
38        """Test that the appropriate member variables are available when stopped in C++ static, inline, and const methods"""
39        self.runCmd("file a.out", CURRENT_EXECUTABLE_SET)
40
41        self.set_breakpoint(line_number('main.cpp', '// breakpoint 1'))
42        self.set_breakpoint(line_number('main.cpp', '// breakpoint 2'))
43        self.set_breakpoint(line_number('main.cpp', '// breakpoint 3'))
44        self.set_breakpoint(line_number('main.cpp', '// breakpoint 4'))
45
46        self.runCmd("process launch", RUN_SUCCEEDED)
47
48        self.expect("expression -- m_a = 2",
49                    startstr = "(int) $0 = 2")
50
51        self.runCmd("process continue")
52
53        # This would be disallowed if we enforced const.  But we don't.
54        self.expect("expression -- m_a = 2",
55                    startstr = "(int) $1 = 2")
56
57        self.expect("expression -- (int)getpid(); m_a",
58                    startstr = "(int) $2 = 2")
59
60        self.runCmd("process continue")
61
62        self.expect("expression -- s_a",
63                    startstr = "(int) $3 = 5")
64
65        self.runCmd("process continue")
66
67        self.expect("expression -- m_a",
68                    startstr = "(int) $4 = 2")
69
70if __name__ == '__main__':
71    import atexit
72    lldb.SBDebugger.Initialize()
73    atexit.register(lambda: lldb.SBDebugger.Terminate())
74    unittest2.main()
75