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