1"""
2Check that types only get completed when necessary.
3"""
4
5
6
7import lldb
8from lldbsuite.test.decorators import *
9from lldbsuite.test.lldbtest import *
10from lldbsuite.test import lldbutil
11
12
13class TypeCompletionTestCase(TestBase):
14
15    mydir = TestBase.compute_mydir(__file__)
16
17    @expectedFailureAll(
18        compiler="icc",
19        bugnumber="often fails with 'NameAndAddress should be valid.")
20    # Fails with gcc 4.8.1 with llvm.org/pr15301 LLDB prints incorrect sizes
21    # of STL containers
22    def test_with_run_command(self):
23        """Check that types only get completed when necessary."""
24        self.build()
25        self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET)
26
27        lldbutil.run_break_set_by_source_regexp(
28            self, "// Set break point at this line.")
29
30        self.runCmd("run", RUN_SUCCEEDED)
31
32        # The stop reason of the thread should be breakpoint.
33        self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
34                    substrs=['stopped',
35                             'stop reason = breakpoint'])
36
37        # This is the function to remove the custom formats in order to have a
38        # clean slate for the next test case.
39        def cleanup():
40            self.runCmd('type category enable -l c++', check=False)
41
42        self.runCmd('type category disable -l c++', check=False)
43
44        # Execute the cleanup function during test case tear down.
45        self.addTearDownHook(cleanup)
46
47        p_vector = self.dbg.GetSelectedTarget().GetProcess(
48        ).GetSelectedThread().GetSelectedFrame().FindVariable('p')
49        p_type = p_vector.GetType()
50        self.assertFalse(
51            p_type.IsTypeComplete(),
52            'vector<T> complete but it should not be')
53
54        self.runCmd("continue")
55
56        p_vector = self.dbg.GetSelectedTarget().GetProcess(
57        ).GetSelectedThread().GetSelectedFrame().FindVariable('p')
58        p_type = p_vector.GetType()
59        self.assertFalse(
60            p_type.IsTypeComplete(),
61            'vector<T> complete but it should not be')
62
63        self.runCmd("continue")
64
65        self.runCmd("frame variable p --show-types")
66
67        p_vector = self.dbg.GetSelectedTarget().GetProcess(
68        ).GetSelectedThread().GetSelectedFrame().FindVariable('p')
69        p_type = p_vector.GetType()
70        self.assertTrue(
71            p_type.IsTypeComplete(),
72            'vector<T> should now be complete')
73        name_address_type = p_type.GetTemplateArgumentType(0)
74        self.assertTrue(
75            name_address_type.IsValid(),
76            'NameAndAddress should be valid')
77        self.assertFalse(
78            name_address_type.IsTypeComplete(),
79            'NameAndAddress complete but it should not be')
80
81        self.runCmd("continue")
82
83        self.runCmd("frame variable guy --show-types")
84
85        p_vector = self.dbg.GetSelectedTarget().GetProcess(
86        ).GetSelectedThread().GetSelectedFrame().FindVariable('p')
87        p_type = p_vector.GetType()
88        self.assertTrue(
89            p_type.IsTypeComplete(),
90            'vector<T> should now be complete')
91        name_address_type = p_type.GetTemplateArgumentType(0)
92        self.assertTrue(
93            name_address_type.IsValid(),
94            'NameAndAddress should be valid')
95        self.assertTrue(
96            name_address_type.IsTypeComplete(),
97            'NameAndAddress should now be complete')
98        field0 = name_address_type.GetFieldAtIndex(0)
99        self.assertTrue(
100            field0.IsValid(),
101            'NameAndAddress::m_name should be valid')
102        string = field0.GetType().GetPointeeType()
103        self.assertTrue(string.IsValid(), 'CustomString should be valid')
104        self.assertFalse(string.IsTypeComplete(),
105                         'CustomString complete but it should not be')
106
107        self.runCmd("continue")
108
109        p_vector = self.dbg.GetSelectedTarget().GetProcess(
110        ).GetSelectedThread().GetSelectedFrame().FindVariable('p')
111        p_type = p_vector.GetType()
112        self.assertTrue(
113            p_type.IsTypeComplete(),
114            'vector<T> should now be complete')
115        name_address_type = p_type.GetTemplateArgumentType(0)
116        self.assertTrue(
117            name_address_type.IsValid(),
118            'NameAndAddress should be valid')
119        self.assertTrue(
120            name_address_type.IsTypeComplete(),
121            'NameAndAddress should now be complete')
122        field0 = name_address_type.GetFieldAtIndex(0)
123        self.assertTrue(
124            field0.IsValid(),
125            'NameAndAddress::m_name should be valid')
126        string = field0.GetType().GetPointeeType()
127        self.assertTrue(string.IsValid(), 'CustomString should be valid')
128        self.assertFalse(string.IsTypeComplete(),
129                         'CustomString complete but it should not be')
130
131        self.runCmd('type category enable -l c++', check=False)
132        self.runCmd('frame variable guy --show-types --ptr-depth=1')
133
134        p_vector = self.dbg.GetSelectedTarget().GetProcess(
135        ).GetSelectedThread().GetSelectedFrame().FindVariable('p')
136        p_type = p_vector.GetType()
137        self.assertTrue(
138            p_type.IsTypeComplete(),
139            'vector<T> should now be complete')
140        name_address_type = p_type.GetTemplateArgumentType(0)
141        self.assertTrue(
142            name_address_type.IsValid(),
143            'NameAndAddress should be valid')
144        self.assertTrue(
145            name_address_type.IsTypeComplete(),
146            'NameAndAddress should now be complete')
147        field0 = name_address_type.GetFieldAtIndex(0)
148        self.assertTrue(
149            field0.IsValid(),
150            'NameAndAddress::m_name should be valid')
151        string = field0.GetType().GetPointeeType()
152        self.assertTrue(string.IsValid(), 'CustomString should be valid')
153        self.assertTrue(
154            string.IsTypeComplete(),
155            'CustomString should now be complete')
156