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