1"""
2Test that recursive types are handled correctly.
3"""
4
5
6
7import lldb
8import lldbsuite.test.lldbutil as lldbutil
9from lldbsuite.test.lldbtest import *
10
11
12class RecursiveTypesTestCase(TestBase):
13
14    def setUp(self):
15        # Call super's setUp().
16        TestBase.setUp(self)
17
18        # Find the line number to break for main.c.
19        self.line = line_number('recursive_type_main.cpp',
20                                '// Test at this line.')
21
22        self.d1 = {
23            'CXX_SOURCES': 'recursive_type_main.cpp recursive_type_1.cpp'}
24        self.d2 = {
25            'CXX_SOURCES': 'recursive_type_main.cpp recursive_type_2.cpp'}
26
27    def test_recursive_type_1(self):
28        """Test that recursive structs are displayed correctly."""
29        self.build(dictionary=self.d1)
30        self.setTearDownCleanup(dictionary=self.d1)
31        self.print_struct()
32
33    def test_recursive_type_2(self):
34        """Test that recursive structs are displayed correctly."""
35        self.build(dictionary=self.d2)
36        self.setTearDownCleanup(dictionary=self.d2)
37        self.print_struct()
38
39    def print_struct(self):
40        self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET)
41
42        lldbutil.run_break_set_by_file_and_line(
43            self,
44            "recursive_type_main.cpp",
45            self.line,
46            num_expected_locations=-1,
47            loc_exact=True)
48
49        self.runCmd("run", RUN_SUCCEEDED)
50
51        self.runCmd("print tpi")
52        self.runCmd("print *tpi")
53