// { dg-do run }
|
// { dg-do run }
|
// GROUPS passed copy-ctors
|
// GROUPS passed copy-ctors
|
/*
|
/*
|
bad:
|
bad:
|
sibelius402> a.out
|
sibelius402> a.out
|
a=5 a.virtMember()=30
|
a=5 a.virtMember()=30
|
BaseClass::Increm --> {i=5, virtMember()=30}
|
BaseClass::Increm --> {i=5, virtMember()=30}
|
a=7 a.virtMember()=30
|
a=7 a.virtMember()=30
|
b=7 b.virtMember()=30
|
b=7 b.virtMember()=30
|
BaseClass::Increm --> {i=7, virtMember()=999}
|
BaseClass::Increm --> {i=7, virtMember()=999}
|
b=9 b.virtMember()=30
|
b=9 b.virtMember()=30
|
sibelius403>
|
sibelius403>
|
|
|
good:
|
good:
|
|
|
sibelius406> a.out
|
sibelius406> a.out
|
a=5 a.virtMember()=30
|
a=5 a.virtMember()=30
|
BaseClass::Increm --> {i=5, virtMember()=30}
|
BaseClass::Increm --> {i=5, virtMember()=30}
|
a=7 a.virtMember()=30
|
a=7 a.virtMember()=30
|
b=7 b.virtMember()=30
|
b=7 b.virtMember()=30
|
BaseClass::Increm --> {i=7, virtMember()=30}
|
BaseClass::Increm --> {i=7, virtMember()=30}
|
b=9 b.virtMember()=30
|
b=9 b.virtMember()=30
|
*/
|
*/
|
|
|
extern "C" int printf (const char *, ...);
|
extern "C" int printf (const char *, ...);
|
extern "C" void exit (int);
|
extern "C" void exit (int);
|
|
|
void die () { printf ("FAIL\n"); exit (1); }
|
void die () { printf ("FAIL\n"); exit (1); }
|
|
|
class BaseClass {
|
class BaseClass {
|
|
|
friend int operator != (const BaseClass irv, int x);
|
friend int operator != (const BaseClass irv, int x);
|
|
|
int i;
|
int i;
|
|
|
public:
|
public:
|
|
|
BaseClass( const BaseClass& ir ) : i(ir.i) {};
|
BaseClass( const BaseClass& ir ) : i(ir.i) {};
|
BaseClass() : i(5) {};
|
BaseClass() : i(5) {};
|
|
|
virtual int virtMember() { return( 999 ); };
|
virtual int virtMember() { return( 999 ); };
|
|
|
void Increm( int r );
|
void Increm( int r );
|
};
|
};
|
|
|
void BaseClass::Increm( int r )
|
void BaseClass::Increm( int r )
|
{
|
{
|
if ((i == 5 && virtMember () == 30)
|
if ((i == 5 && virtMember () == 30)
|
|| (i == 7 && virtMember () == 30))
|
|| (i == 7 && virtMember () == 30))
|
i += r;
|
i += r;
|
else
|
else
|
die ();
|
die ();
|
}
|
}
|
|
|
class DerivedClass : public BaseClass {
|
class DerivedClass : public BaseClass {
|
public:
|
public:
|
int virtMember() { return( 30 ); };
|
int virtMember() { return( 30 ); };
|
};
|
};
|
|
|
int operator != (const BaseClass irv, int x) { return irv.i != x; }
|
int operator != (const BaseClass irv, int x) { return irv.i != x; }
|
|
|
int
|
int
|
main ()
|
main ()
|
{
|
{
|
DerivedClass a;
|
DerivedClass a;
|
|
|
if (a != 5 || a.virtMember () != 30)
|
if (a != 5 || a.virtMember () != 30)
|
die ();
|
die ();
|
|
|
a.Increm(2);
|
a.Increm(2);
|
|
|
if (a != 7 || a.virtMember () != 30)
|
if (a != 7 || a.virtMember () != 30)
|
die ();
|
die ();
|
|
|
DerivedClass b = a;
|
DerivedClass b = a;
|
|
|
if (b != 7 || a.virtMember () != 30)
|
if (b != 7 || a.virtMember () != 30)
|
die ();
|
die ();
|
|
|
b.Increm(2);
|
b.Increm(2);
|
|
|
if (b != 9 || a.virtMember () != 30)
|
if (b != 9 || a.virtMember () != 30)
|
die ();
|
die ();
|
|
|
printf ("PASS\n");
|
printf ("PASS\n");
|
}
|
}
|
|
|