copy8.C revision 1.1.1.1
1// { dg-do run  }
2// GROUPS passed copy-ctors
3/*
4This report is for GCC 2.3.3 running on a Sun/4.  The bug is that when
5a class instance is passed-by-value, GCC does not correctly copy the value.
6At the end of this report is an example program that demonstrates the bug.
7It should print:
8
9	construct A('x')
10	copy A('x')
11	destruct A('x')
12	destruct A('x')
13
14and in fact does for IBM's xlC C++.  However, for GCC 2.3.3, it fails
15to print the second line ["copy A('x')"], which indicates that it failed
16to call the copy-constructor for class A when it should have.  Below is a
17typescript that lists the program, shows how I compiled it, and shows the
18incorrect output.
19*/
20
21extern "C" int printf (const char *, ...);
22extern "C" void exit (int);
23
24int count = 0;
25
26void
27die (int x)
28{
29  if (x != ++count)
30    {
31      printf ("FAIL\n");
32      exit (1);
33    }
34}
35
36class A { // Class with explicit & instrumented copy-constructor and destructor.
37public:
38    const char * id;
39    A( const char * id1 ) : id(id1) { die (1); }
40
41    // Copy constructor
42    A( const A& a ) : id(a.id) { die (2); }
43
44    // Destructor
45    ~A() { count++; if (count != 3 && count != 4) die (-1); }
46};
47
48class X { // Class without explicit copy-constructor
49private:
50    A a;
51public:
52    X( const char * id ) : a(id) {}
53};
54
55void Func( X x ) {      // Function with call-by-value argument
56}
57
58int
59main() {
60    X x("x");           // Construct instance of x.
61
62    // The next line should call the copy-constructor for X since x is
63    // being passed by value.  For GCC 2.3.3 on a Sun/4, it does not.
64    Func(x);
65
66    printf ("PASS\n");
67    return 0;
68}
69