mirror of
https://github.com/dlang/dmd.git
synced 2025-04-26 21:21:48 +03:00
327 lines
5 KiB
D
327 lines
5 KiB
D
// EXTRA_CPP_SOURCES: cpp22287.cpp
|
|
|
|
extern(C++):
|
|
|
|
class X
|
|
{
|
|
public:
|
|
~this();
|
|
int i;
|
|
}
|
|
|
|
class Y : X
|
|
{
|
|
}
|
|
|
|
class A
|
|
{
|
|
~this();
|
|
int f1() const;
|
|
|
|
int i;
|
|
}
|
|
|
|
interface I
|
|
{
|
|
int f2() const;
|
|
X f4();
|
|
}
|
|
|
|
class B : A, I
|
|
{
|
|
override int f1() const;
|
|
override int f2() const;
|
|
int f3() const;
|
|
override X f4();
|
|
}
|
|
|
|
class C : B
|
|
{
|
|
override int f1() const;
|
|
override int f2() const;
|
|
override int f3() const;
|
|
override Y f4();
|
|
}
|
|
|
|
version(Windows)
|
|
{
|
|
class D : B
|
|
{
|
|
override int f1() const
|
|
{
|
|
return i + 41;
|
|
}
|
|
|
|
override int f2() const
|
|
{
|
|
return i + 42;
|
|
}
|
|
|
|
override int f3() const
|
|
{
|
|
return i + 43;
|
|
}
|
|
|
|
override Y f4()
|
|
{
|
|
Y r = new Y;
|
|
r.i = i + 44;
|
|
return r;
|
|
}
|
|
}
|
|
|
|
mixin template MixinE()
|
|
{
|
|
override int f1() const
|
|
{
|
|
return i + 51;
|
|
}
|
|
|
|
override int f2() const
|
|
{
|
|
return i + 52;
|
|
}
|
|
|
|
override int f3() const
|
|
{
|
|
return i + 53;
|
|
}
|
|
|
|
override Y f4()
|
|
{
|
|
Y r = new Y;
|
|
r.i = i + 54;
|
|
return r;
|
|
}
|
|
}
|
|
|
|
class E : B
|
|
{
|
|
mixin MixinE;
|
|
}
|
|
}
|
|
|
|
I createIFromCPP(char type, int i);
|
|
B createBFromCPP(char type, int i);
|
|
C createCFromCPP(int i);
|
|
version(Windows)
|
|
{
|
|
D createDFromCPP(int i);
|
|
E createEFromCPP(int i);
|
|
}
|
|
|
|
I createIFromD(char type, int i)
|
|
{
|
|
switch (type)
|
|
{
|
|
case 'B':
|
|
{
|
|
B b = new B();
|
|
b.i = i;
|
|
return b;
|
|
}
|
|
case 'C':
|
|
{
|
|
C c = new C();
|
|
c.i = i;
|
|
return c;
|
|
}
|
|
version(Windows)
|
|
{
|
|
case 'D':
|
|
{
|
|
D d = new D();
|
|
d.i = i;
|
|
return d;
|
|
}
|
|
case 'E':
|
|
{
|
|
E e = new E();
|
|
e.i = i;
|
|
return e;
|
|
}
|
|
}
|
|
default:
|
|
return null;
|
|
}
|
|
}
|
|
|
|
B createBFromD(char type, int i)
|
|
{
|
|
switch (type)
|
|
{
|
|
case 'B':
|
|
{
|
|
B b = new B();
|
|
b.i = i;
|
|
return b;
|
|
}
|
|
case 'C':
|
|
{
|
|
C c = new C();
|
|
c.i = i;
|
|
return c;
|
|
}
|
|
version(Windows)
|
|
{
|
|
case 'D':
|
|
{
|
|
D d = new D();
|
|
d.i = i;
|
|
return d;
|
|
}
|
|
case 'E':
|
|
{
|
|
E e = new E();
|
|
e.i = i;
|
|
return e;
|
|
}
|
|
}
|
|
default:
|
|
return null;
|
|
}
|
|
}
|
|
|
|
C createCFromD(int i)
|
|
{
|
|
C c = new C();
|
|
c.i = i;
|
|
return c;
|
|
}
|
|
|
|
version(Windows)
|
|
{
|
|
D createDFromD(int i)
|
|
{
|
|
D d = new D();
|
|
d.i = i;
|
|
return d;
|
|
}
|
|
|
|
E createEFromD(int i)
|
|
{
|
|
E e = new E();
|
|
e.i = i;
|
|
return e;
|
|
}
|
|
}
|
|
|
|
void runCPPTests();
|
|
|
|
extern(D) void main()
|
|
{
|
|
{
|
|
B b = new B();
|
|
b.i = 100;
|
|
assert(b.f1() == 121);
|
|
assert(b.f2() == 122);
|
|
assert(b.f3() == 123);
|
|
assert(b.f4().i == 124);
|
|
}
|
|
{
|
|
C c = new C();
|
|
c.i = 100;
|
|
assert(c.f1() == 131);
|
|
assert(c.f2() == 132);
|
|
assert(c.f3() == 133);
|
|
assert(c.f4().i == 134);
|
|
}
|
|
version(Windows)
|
|
{
|
|
{
|
|
D d = new D();
|
|
d.i = 100;
|
|
assert(d.f1() == 141);
|
|
assert(d.f2() == 142);
|
|
assert(d.f3() == 143);
|
|
assert(d.f4().i == 144);
|
|
}
|
|
{
|
|
E e = new E();
|
|
e.i = 100;
|
|
assert(e.f1() == 151);
|
|
assert(e.f2() == 152);
|
|
assert(e.f3() == 153);
|
|
assert(e.f4().i == 154);
|
|
}
|
|
}
|
|
{
|
|
I i = createIFromCPP('B', 100);
|
|
assert(i.f2() == 122);
|
|
assert(i.f4().i == 124);
|
|
}
|
|
{
|
|
I i = createIFromCPP('C', 100);
|
|
assert(i.f2() == 132);
|
|
assert(i.f4().i == 134);
|
|
}
|
|
version(Windows)
|
|
{
|
|
{
|
|
I i = createIFromCPP('D', 100);
|
|
assert(i.f2() == 142);
|
|
assert(i.f4().i == 144);
|
|
}
|
|
{
|
|
I i = createIFromCPP('E', 100);
|
|
assert(i.f2() == 152);
|
|
assert(i.f4().i == 154);
|
|
}
|
|
}
|
|
{
|
|
B b = createBFromCPP('B', 100);
|
|
assert(b.f1() == 121);
|
|
assert(b.f2() == 122);
|
|
assert(b.f3() == 123);
|
|
assert(b.f4().i == 124);
|
|
}
|
|
{
|
|
B b = createBFromCPP('C', 100);
|
|
assert(b.f1() == 131);
|
|
assert(b.f2() == 132);
|
|
assert(b.f3() == 133);
|
|
assert(b.f4().i == 134);
|
|
}
|
|
version(Windows)
|
|
{
|
|
{
|
|
B b = createBFromCPP('D', 100);
|
|
assert(b.f1() == 141);
|
|
assert(b.f2() == 142);
|
|
assert(b.f3() == 143);
|
|
assert(b.f4().i == 144);
|
|
}
|
|
{
|
|
B b = createBFromCPP('E', 100);
|
|
assert(b.f1() == 151);
|
|
assert(b.f2() == 152);
|
|
assert(b.f3() == 153);
|
|
assert(b.f4().i == 154);
|
|
}
|
|
}
|
|
{
|
|
C c = createCFromCPP(100);
|
|
assert(c.f1() == 131);
|
|
assert(c.f2() == 132);
|
|
assert(c.f3() == 133);
|
|
assert(c.f4().i == 134);
|
|
}
|
|
version(Windows)
|
|
{
|
|
{
|
|
D d = createDFromCPP(100);
|
|
assert(d.f1() == 141);
|
|
assert(d.f2() == 142);
|
|
assert(d.f3() == 143);
|
|
assert(d.f4().i == 144);
|
|
}
|
|
{
|
|
E e = createEFromCPP(100);
|
|
assert(e.f1() == 151);
|
|
assert(e.f2() == 152);
|
|
assert(e.f3() == 153);
|
|
assert(e.f4().i == 154);
|
|
}
|
|
}
|
|
runCPPTests();
|
|
}
|