1"""Test that forward declaration of a data structure gets resolved correctly."""
2
3import os, time
4import unittest2
5import lldb
6from lldbtest import *
7import lldbutil
8
9class ForwardDeclarationTestCase(TestBase):
10
11    mydir = os.path.join("lang", "c", "forward")
12
13    @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
14    @dsym_test
15    def test_with_dsym_and_run_command(self):
16        """Display *bar_ptr when stopped on a function with forward declaration of struct bar."""
17        self.buildDsym()
18        self.forward_declaration()
19
20    # rdar://problem/8648070
21    # 'expression *bar_ptr' seg faults
22    # rdar://problem/8546815
23    # './dotest.py -v -t forward' fails for test_with_dwarf_and_run_command
24    @dwarf_test
25    def test_with_dwarf_and_run_command(self):
26        """Display *bar_ptr when stopped on a function with forward declaration of struct bar."""
27        self.buildDwarf()
28        self.forward_declaration()
29
30    def forward_declaration(self):
31        """Display *bar_ptr when stopped on a function with forward declaration of struct bar."""
32        exe = os.path.join(os.getcwd(), "a.out")
33        self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
34
35        # Break inside the foo function which takes a bar_ptr argument.
36        lldbutil.run_break_set_by_symbol (self, "foo", num_expected_locations=1, sym_exact=True)
37
38        self.runCmd("run", RUN_SUCCEEDED)
39
40        # The stop reason of the thread should be breakpoint.
41        self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
42            substrs = ['stopped',
43                       'stop reason = breakpoint'])
44
45        # The breakpoint should have a hit count of 1.
46        self.expect("breakpoint list -f", BREAKPOINT_HIT_ONCE,
47            substrs = [' resolved, hit count = 1'])
48
49        # This should display correctly.
50        # Note that the member fields of a = 1 and b = 2 is by design.
51        self.expect("frame variable --show-types *bar_ptr", VARIABLES_DISPLAYED_CORRECTLY,
52            substrs = ['(bar) *bar_ptr = ',
53                       '(int) a = 1',
54                       '(int) b = 2'])
55
56        # And so should this.
57        self.expect("expression --show-types -- *bar_ptr", VARIABLES_DISPLAYED_CORRECTLY,
58            substrs = ['(bar)',
59                       '(int) a = 1',
60                       '(int) b = 2'])
61
62
63if __name__ == '__main__':
64    import atexit
65    lldb.SBDebugger.Initialize()
66    atexit.register(lambda: lldb.SBDebugger.Terminate())
67    unittest2.main()
68