xref: /llvm-project/lldb/test/API/lang/cpp/virtual-functions/TestCppVirtualFunctions.py (revision 2238dcc39358353cac21df75c3c3286ab20b8f53)
1import lldb
2from lldbsuite.test.decorators import *
3from lldbsuite.test.lldbtest import *
4from lldbsuite.test import lldbutil
5
6
7class TestCase(TestBase):
8    def common_setup(self):
9        self.build()
10        lldbutil.run_to_source_breakpoint(
11            self, "// break here", lldb.SBFileSpec("main.cpp")
12        )
13
14    def test_call_on_base(self):
15        self.common_setup()
16        self.expect_expr("base_with_dtor.foo()", result_type="int", result_value="1")
17        self.expect_expr("base_without_dtor.foo()", result_type="int", result_value="2")
18
19    def test_call_on_derived(self):
20        self.common_setup()
21        self.expect_expr("derived_with_dtor.foo()", result_type="int", result_value="3")
22        self.expect_expr(
23            "derived_without_dtor.foo()", result_type="int", result_value="4"
24        )
25        self.expect_expr(
26            "derived_with_base_dtor.foo()", result_type="int", result_value="5"
27        )
28        self.expect_expr(
29            "derived_with_dtor_but_no_base_dtor.foo()",
30            result_type="int",
31            result_value="6",
32        )
33
34    def test_call_on_derived_as_base(self):
35        self.common_setup()
36        self.expect_expr(
37            "derived_with_dtor_as_base.foo()", result_type="int", result_value="3"
38        )
39        self.expect_expr(
40            "derived_without_as_base.foo()", result_type="int", result_value="4"
41        )
42        self.expect_expr(
43            "derived_with_base_dtor_as_base.foo()", result_type="int", result_value="5"
44        )
45        self.expect_expr(
46            "derived_with_dtor_but_no_base_dtor_as_base.foo()",
47            result_type="int",
48            result_value="6",
49        )
50
51    def test_call_overloaded(self):
52        self.common_setup()
53        self.expect(
54            "expr derived_with_overload.foo()",
55            error=True,
56            substrs=["too few arguments to function call, expected 1, have 0"],
57        )
58        self.expect_expr(
59            "derived_with_overload.foo(1)", result_type="int", result_value="7"
60        )
61        self.expect_expr(
62            "derived_with_overload_and_using.foo(1)",
63            result_type="int",
64            result_value="8",
65        )
66        # FIXME: It seems the using declaration doesn't import the overload from the base class.
67        self.expect(
68            "expr derived_with_overload_and_using.foo()",
69            error=True,
70            substrs=["too few arguments to function call, expected 1, have 0"],
71        )
72