1// { dg-do run } 2// GROUPS passed copy-ctors 3/* 4bad: 5sibelius402> a.out 6a=5 a.virtMember()=30 7BaseClass::Increm --> {i=5, virtMember()=30} 8a=7 a.virtMember()=30 9b=7 b.virtMember()=30 10BaseClass::Increm --> {i=7, virtMember()=999} 11b=9 b.virtMember()=30 12sibelius403> 13 14 good: 15 16sibelius406> a.out 17a=5 a.virtMember()=30 18BaseClass::Increm --> {i=5, virtMember()=30} 19a=7 a.virtMember()=30 20b=7 b.virtMember()=30 21BaseClass::Increm --> {i=7, virtMember()=30} 22b=9 b.virtMember()=30 23*/ 24 25extern "C" int printf (const char *, ...); 26extern "C" void exit (int); 27 28void die () { printf ("FAIL\n"); exit (1); } 29 30class BaseClass { 31 32 friend int operator != (const BaseClass irv, int x); 33 34 int i; 35 36public: 37 38 BaseClass( const BaseClass& ir ) : i(ir.i) {}; 39 BaseClass() : i(5) {}; 40 41 virtual int virtMember() { return( 999 ); }; 42 43 void Increm( int r ); 44}; 45 46void BaseClass::Increm( int r ) 47{ 48 if ((i == 5 && virtMember () == 30) 49 || (i == 7 && virtMember () == 30)) 50 i += r; 51 else 52 die (); 53} 54 55class DerivedClass : public BaseClass { 56public: 57 int virtMember() { return( 30 ); }; 58}; 59 60int operator != (const BaseClass irv, int x) { return irv.i != x; } 61 62int 63main () 64{ 65 DerivedClass a; 66 67 if (a != 5 || a.virtMember () != 30) 68 die (); 69 70 a.Increm(2); 71 72 if (a != 7 || a.virtMember () != 30) 73 die (); 74 75 DerivedClass b = a; 76 77 if (b != 7 || a.virtMember () != 30) 78 die (); 79 80 b.Increm(2); 81 82 if (b != 9 || a.virtMember () != 30) 83 die (); 84 85 printf ("PASS\n"); 86} 87