mirror of https://github.com/swig/swig
139 lines
3.3 KiB
OpenEdge ABL
139 lines
3.3 KiB
OpenEdge ABL
%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) {}
|
|
};
|
|
*/
|
|
%}
|