// { 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");
}
