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