OSDN Git Service

* call.c (add_candidates): Add first_arg and return_type parms.
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / g++.old-deja / g++.brendan / copy5.C
1 // { dg-do run  }
2 // GROUPS passed copy-ctors
3 /*
4 bad:
5 sibelius402> a.out
6 a=5  a.virtMember()=30
7 BaseClass::Increm --> {i=5, virtMember()=30}
8 a=7  a.virtMember()=30
9 b=7  b.virtMember()=30
10 BaseClass::Increm --> {i=7, virtMember()=999}
11 b=9  b.virtMember()=30
12 sibelius403> 
13
14  good:
15
16 sibelius406> a.out
17 a=5  a.virtMember()=30
18 BaseClass::Increm --> {i=5, virtMember()=30}
19 a=7  a.virtMember()=30
20 b=7  b.virtMember()=30
21 BaseClass::Increm --> {i=7, virtMember()=30}
22 b=9  b.virtMember()=30
23 */
24
25 extern "C" int printf (const char *, ...);
26 extern "C" void exit (int);
27
28 void die () { printf ("FAIL\n"); exit (1); }
29
30 class BaseClass {
31
32   friend int operator != (const BaseClass irv, int x);
33
34   int i;
35
36 public:
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
46 void 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
55 class DerivedClass : public BaseClass {
56 public:
57   int virtMember() { return( 30 ); }
58 };
59
60 int operator != (const BaseClass irv, int x) { return irv.i != x; }
61
62 int
63 main ()
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 }