1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
|
%module(ruby_minherit="1") using_member_multiple_inherit
%warnfilter(SWIGWARN_JAVA_MULTIPLE_INHERITANCE,
SWIGWARN_CSHARP_MULTIPLE_INHERITANCE,
SWIGWARN_D_MULTIPLE_INHERITANCE,
SWIGWARN_PHP_MULTIPLE_INHERITANCE) MultMiddleA; /* C#, D, Java, PHP multiple inheritance */
%warnfilter(SWIGWARN_JAVA_MULTIPLE_INHERITANCE,
SWIGWARN_CSHARP_MULTIPLE_INHERITANCE,
SWIGWARN_D_MULTIPLE_INHERITANCE,
SWIGWARN_PHP_MULTIPLE_INHERITANCE) MultMiddleB; /* C#, D, Java, PHP multiple inheritance */
%inline %{
// Single inheritance three deep, only using declarations
struct Susing1 {
protected:
void usingmethod(int i) {}
};
struct Susing2 : Susing1 {
protected:
using Susing1::usingmethod;
};
struct Susing3 : Susing2 {
using Susing2::usingmethod;
};
// Single inheritance three deep, overload using and methods
struct Using1 {
protected:
void usingmethod(int i) {}
};
struct Using2 : Using1 {
protected:
// method declaration before using declaration
void usingmethod(int i, int j) {}
using Using1::usingmethod;
};
struct Using3 : Using2 {
void usingmethod(int i, int j, int k) {}
using Using2::usingmethod;
};
struct Musing2 : Using1 {
protected:
// using declaration before method declaration
using Using1::usingmethod;
void usingmethod(int i, int j) {}
};
struct Musing3 : Musing2 {
using Musing2::usingmethod;
void usingmethod(int i, int j, int k) {}
};
struct Dusing2 : Using1 {
protected:
using Using1::usingmethod;
void usingmethod(int i, int j) {}
};
struct Dusing3 : Dusing2 {
// redundant using declarations
using Using1::usingmethod;
using Dusing2::usingmethod;
};
// Multiple inheritance, multiple using declarations
struct Mult1 {
protected:
void multmethod(int i) {}
};
struct Mult2 {
protected:
void multmethod(const char *c) {}
};
struct MultMiddleA : Mult1, Mult2 {
public: // Note!
void multmethod(int i, int j) {}
using Mult1::multmethod;
using Mult2::multmethod;
};
#if !defined(SWIGD) // TODO: Fix bug adding incorrect override
struct MultBottomA : MultMiddleA {
void multmethod(int i, int j, int k) {}
using MultMiddleA::multmethod;
};
#endif
void cplusplus_testA() {
MultMiddleA m;
m.multmethod(123);
m.multmethod("hi");
m.multmethod(123, 234);
}
struct MultMiddleB : Mult1, Mult2 {
protected: // Note!
void multmethod(int i, int j) {}
using Mult1::multmethod;
using Mult2::multmethod;
};
struct MultBottomB : MultMiddleB {
void multmethod(int i, int j, int k) {}
using MultMiddleB::multmethod;
};
void cplusplus_testB() {
MultBottomB m;
m.multmethod(123);
m.multmethod("hi");
m.multmethod(123, 234);
m.multmethod(123, 345, 567);
}
// Multiple inheritance, with no override on parent class.
// This checks a corner case with fvirtual and using
// See #2872
class Vusing {
public:
virtual void usingmethod(int i) {}
virtual ~Vusing() {};
};
class Vusing1 : public Vusing {
public:
virtual void usingmethod(int i) {}
virtual ~Vusing1() {};
};
class Vusing2 : public Vusing1 {
public:
virtual ~Vusing2() {};
using Vusing1::usingmethod;
virtual void usingmethod(const char* c) {};
};
/* TODO: fix when using declaration is declared before method, for example change MultMiddleA to:
struct MultMiddleB : Mult1, Mult2 {
protected: // Note!
using Mult1::multmethod;
using Mult2::multmethod;
void multmethod(int i, int j) {}
};
*/
%}
|