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