xref: /llvm-project/lldb/test/API/lang/cpp/virtual-functions/main.cpp (revision 99451b4453688a94c6014cac233d371ab4cc342d)
1*99451b44SJordan Rupprecht // Tests virtual function calls. As virtual destructors influence
2*99451b44SJordan Rupprecht // vtables this tests also needs to cover all combinations of
3*99451b44SJordan Rupprecht // virtual destructors in the derived/base class.
4*99451b44SJordan Rupprecht 
5*99451b44SJordan Rupprecht struct BaseWithVirtDtor {
~BaseWithVirtDtorBaseWithVirtDtor6*99451b44SJordan Rupprecht   virtual ~BaseWithVirtDtor() {}
fooBaseWithVirtDtor7*99451b44SJordan Rupprecht   virtual int foo() { return 1; }
8*99451b44SJordan Rupprecht };
9*99451b44SJordan Rupprecht 
10*99451b44SJordan Rupprecht struct BaseWithoutVirtDtor {
fooBaseWithoutVirtDtor11*99451b44SJordan Rupprecht   virtual int foo() { return 2; }
12*99451b44SJordan Rupprecht };
13*99451b44SJordan Rupprecht 
14*99451b44SJordan Rupprecht struct DerivedWithVirtDtor : BaseWithVirtDtor {
~DerivedWithVirtDtorDerivedWithVirtDtor15*99451b44SJordan Rupprecht   virtual ~DerivedWithVirtDtor() {}
fooDerivedWithVirtDtor16*99451b44SJordan Rupprecht   virtual int foo() { return 3; }
17*99451b44SJordan Rupprecht };
18*99451b44SJordan Rupprecht 
19*99451b44SJordan Rupprecht struct DerivedWithoutVirtDtor : BaseWithoutVirtDtor {
fooDerivedWithoutVirtDtor20*99451b44SJordan Rupprecht   virtual int foo() { return 4; }
21*99451b44SJordan Rupprecht };
22*99451b44SJordan Rupprecht 
23*99451b44SJordan Rupprecht struct DerivedWithBaseVirtDtor : BaseWithVirtDtor {
fooDerivedWithBaseVirtDtor24*99451b44SJordan Rupprecht   virtual int foo() { return 5; }
25*99451b44SJordan Rupprecht };
26*99451b44SJordan Rupprecht 
27*99451b44SJordan Rupprecht struct DerivedWithVirtDtorButNoBaseDtor : BaseWithoutVirtDtor {
~DerivedWithVirtDtorButNoBaseDtorDerivedWithVirtDtorButNoBaseDtor28*99451b44SJordan Rupprecht   virtual ~DerivedWithVirtDtorButNoBaseDtor() {}
fooDerivedWithVirtDtorButNoBaseDtor29*99451b44SJordan Rupprecht   virtual int foo() { return 6; }
30*99451b44SJordan Rupprecht };
31*99451b44SJordan Rupprecht 
32*99451b44SJordan Rupprecht struct DerivedWithOverload : BaseWithVirtDtor {
~DerivedWithOverloadDerivedWithOverload33*99451b44SJordan Rupprecht   virtual ~DerivedWithOverload() {}
fooDerivedWithOverload34*99451b44SJordan Rupprecht   virtual int foo(int i) { return 7; }
35*99451b44SJordan Rupprecht };
36*99451b44SJordan Rupprecht 
37*99451b44SJordan Rupprecht struct DerivedWithOverloadAndUsing : BaseWithVirtDtor {
~DerivedWithOverloadAndUsingDerivedWithOverloadAndUsing38*99451b44SJordan Rupprecht   virtual ~DerivedWithOverloadAndUsing() {}
39*99451b44SJordan Rupprecht   using BaseWithVirtDtor::foo;
fooDerivedWithOverloadAndUsing40*99451b44SJordan Rupprecht   virtual int foo(int i) { return 8; }
41*99451b44SJordan Rupprecht };
42*99451b44SJordan Rupprecht 
main()43*99451b44SJordan Rupprecht int main() {
44*99451b44SJordan Rupprecht   // Declare base classes.
45*99451b44SJordan Rupprecht   BaseWithVirtDtor base_with_dtor;
46*99451b44SJordan Rupprecht   BaseWithoutVirtDtor base_without_dtor;
47*99451b44SJordan Rupprecht 
48*99451b44SJordan Rupprecht   // Declare all the derived classes.
49*99451b44SJordan Rupprecht   DerivedWithVirtDtor derived_with_dtor;
50*99451b44SJordan Rupprecht   DerivedWithoutVirtDtor derived_without_dtor;
51*99451b44SJordan Rupprecht   DerivedWithBaseVirtDtor derived_with_base_dtor;
52*99451b44SJordan Rupprecht   DerivedWithVirtDtorButNoBaseDtor derived_with_dtor_but_no_base_dtor;
53*99451b44SJordan Rupprecht   DerivedWithOverload derived_with_overload;
54*99451b44SJordan Rupprecht   DerivedWithOverloadAndUsing derived_with_overload_and_using;
55*99451b44SJordan Rupprecht 
56*99451b44SJordan Rupprecht   // The previous classes as their base class type.
57*99451b44SJordan Rupprecht   BaseWithVirtDtor &derived_with_dtor_as_base = derived_with_dtor;
58*99451b44SJordan Rupprecht   BaseWithoutVirtDtor &derived_without_as_base = derived_without_dtor;
59*99451b44SJordan Rupprecht   BaseWithVirtDtor &derived_with_base_dtor_as_base = derived_with_base_dtor;
60*99451b44SJordan Rupprecht   BaseWithoutVirtDtor &derived_with_dtor_but_no_base_dtor_as_base = derived_with_dtor_but_no_base_dtor;
61*99451b44SJordan Rupprecht 
62*99451b44SJordan Rupprecht   // Call functions so that they are compiled.
63*99451b44SJordan Rupprecht   int i = base_with_dtor.foo() + base_without_dtor.foo() +
64*99451b44SJordan Rupprecht           derived_with_dtor.foo() + derived_without_dtor.foo() +
65*99451b44SJordan Rupprecht           derived_with_base_dtor.foo() + derived_with_overload.foo(1)
66*99451b44SJordan Rupprecht           + derived_with_overload_and_using.foo(2)
67*99451b44SJordan Rupprecht           + derived_with_overload_and_using.foo();
68*99451b44SJordan Rupprecht 
69*99451b44SJordan Rupprecht   return i; // break here
70*99451b44SJordan Rupprecht }
71