summaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.old-deja/g++.brendan/copy8.C
blob: 096052342350e925e95d00155be0baacc69f9f3b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
// { dg-do run  }
// GROUPS passed copy-ctors
/*
This report is for GCC 2.3.3 running on a Sun/4.  The bug is that when
a class instance is passed-by-value, GCC does not correctly copy the value.
At the end of this report is an example program that demonstrates the bug.  
It should print:

	construct A('x')
	copy A('x')
	destruct A('x')
	destruct A('x')

and in fact does for IBM's xlC C++.  However, for GCC 2.3.3, it fails
to print the second line ["copy A('x')"], which indicates that it failed
to call the copy-constructor for class A when it should have.  Below is a 
typescript that lists the program, shows how I compiled it, and shows the 
incorrect output.
*/

extern "C" int printf (const char *, ...);
extern "C" void exit (int);

int count = 0;

void
die (int x)
{
  if (x != ++count)
    {
      printf ("FAIL\n");
      exit (1);
    }
}

class A { // Class with explicit & instrumented copy-constructor and destructor.
public:
    const char * id;
    A( const char * id1 ) : id(id1) { die (1); }

    // Copy constructor
    A( const A& a ) : id(a.id) { die (2); }

    // Destructor
    ~A() { count++; if (count != 3 && count != 4) die (-1); }
};

class X { // Class without explicit copy-constructor
private:
    A a;
public:
    X( const char * id ) : a(id) {}
};

void Func( X x ) {      // Function with call-by-value argument
}

int
main() {
    X x("x");           // Construct instance of x.

    // The next line should call the copy-constructor for X since x is
    // being passed by value.  For GCC 2.3.3 on a Sun/4, it does not.
    Func(x);

    printf ("PASS\n");
    return 0;
}