dmd/compiler/test/runnable_cxx/extra-files/cpp22287.cpp
2022-07-09 18:53:07 +02:00

337 lines
5.1 KiB
C++

#include <assert.h>
class X
{
public:
virtual ~X();
int i;
};
X::~X()
{
}
class Y : public X
{
};
class A
{
public:
virtual ~A();
virtual int f1() const;
int i;
};
class I
{
public:
virtual int f2() const = 0;
virtual X *f4() = 0;
};
class B : public A, public I
{
public:
virtual int f1() const;
virtual int f2() const;
virtual int f3() const;
virtual X *f4();
};
class C : public B
{
public:
virtual int f1() const;
virtual int f2() const;
virtual int f3() const;
virtual Y *f4();
};
#ifdef _WIN32
class D : public B
{
public:
virtual int f1() const;
virtual int f2() const;
virtual int f3() const;
virtual Y *f4();
};
class E : public B
{
public:
virtual int f1() const;
virtual int f2() const;
virtual int f3() const;
virtual Y *f4();
};
#endif
A::~A()
{
}
int A::f1() const
{
return i + 11;
}
int B::f1() const
{
return i + 21;
}
int B::f2() const
{
return i + 22;
}
int B::f3() const
{
return i + 23;
}
X *B::f4()
{
X *r = new X;
r->i = i + 24;
return r;
}
int C::f1() const
{
return i + 31;
}
int C::f2() const
{
return i + 32;
}
int C::f3() const
{
return i + 33;
}
Y *C::f4()
{
Y *r = new Y;
r->i = i + 34;
return r;
}
I *createIFromCPP(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;
}
#ifdef _WIN32
case 'D':
{
D *d = new D();
d->i = i;
return d;
}
case 'E':
{
E *e = new E();
e->i = i;
return e;
}
#endif
default:
return 0;
}
}
B *createBFromCPP(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;
}
#ifdef _WIN32
case 'D':
{
D *d = new D();
d->i = i;
return d;
}
case 'E':
{
E *e = new E();
e->i = i;
return e;
}
#endif
default:
return 0;
}
}
C *createCFromCPP(int i)
{
C *c = new C();
c->i = i;
return c;
}
#ifdef _WIN32
D *createDFromCPP(int i)
{
D *d = new D();
d->i = i;
return d;
}
E *createEFromCPP(int i)
{
E *e = new E();
e->i = i;
return e;
}
#endif
I *createIFromD(char type, int i);
B *createBFromD(char type, int i);
C *createCFromD(int i);
#ifdef _WIN32
D *createDFromD(int i);
E *createEFromD(int i);
#endif
void runCPPTests()
{
{
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);
}
#ifdef _WIN32
{
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);
}
#endif
{
I *i = createIFromD('B', 100);
assert(i->f2() == 122);
assert(i->f4()->i == 124);
}
{
I *i = createIFromD('C', 100);
assert(i->f2() == 132);
assert(i->f4()->i == 134);
}
#ifdef _WIN32
{
I *i = createIFromD('D', 100);
assert(i->f2() == 142);
assert(i->f4()->i == 144);
}
{
I *i = createIFromD('E', 100);
assert(i->f2() == 152);
assert(i->f4()->i == 154);
}
#endif
{
B *b = createBFromD('B', 100);
assert(b->f1() == 121);
assert(b->f2() == 122);
assert(b->f3() == 123);
assert(b->f4()->i == 124);
}
{
B *b = createBFromD('C', 100);
assert(b->f1() == 131);
assert(b->f2() == 132);
assert(b->f3() == 133);
assert(b->f4()->i == 134);
}
#ifdef _WIN32
{
B *b = createBFromD('D', 100);
assert(b->f1() == 141);
assert(b->f2() == 142);
assert(b->f3() == 143);
assert(b->f4()->i == 144);
}
{
B *b = createBFromD('E', 100);
assert(b->f1() == 151);
assert(b->f2() == 152);
assert(b->f3() == 153);
assert(b->f4()->i == 154);
}
#endif
{
C *c = createCFromD(100);
assert(c->f1() == 131);
assert(c->f2() == 132);
assert(c->f3() == 133);
assert(c->f4()->i == 134);
}
#ifdef _WIN32
{
D *d = createDFromD(100);
assert(d->f1() == 141);
assert(d->f2() == 142);
assert(d->f3() == 143);
assert(d->f4()->i == 144);
}
{
E *e = createEFromD(100);
assert(e->f1() == 151);
assert(e->f2() == 152);
assert(e->f3() == 153);
assert(e->f4()->i == 154);
}
#endif
}