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 Rupprechtint 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