// { dg-do run } // GROUPS passed copy-ctors /* g++ 2.3.3 will prefer using type conversions over the implicitly generated copy constructor. This is wrong. If you explicitly define a copy constructor, it will use it. However, the implicit copy constructor MUST be called whenever an explicit one would have been called also. See below: g++ converts from and back into unsigned, instead of using the implicit copy constructor: here is the version: Reading specs from /usr/lib/gcc-lib/i386-linux/2.3.3/specs gcc version 2.3.3 /usr/lib/gcc-lib/i386-linux/2.3.3/cpp -lang-c++ -v -undef -D__GNUC__=2 -D__GNUG__=2 -D__cplusplus -Dunix -Di386 -Dlinux -D__unix__ -D__i386__ -D__linux__ -D__unix -D__i386 -D__linux bug2.cc /usr/tmp/cca02008.i GNU CPP version 2.3.3 (80386, BSD syntax) /usr/lib/gcc-lib/i386-linux/2.3.3/cc1plus /usr/tmp/cca02008.i -quiet -dumpbase bug2.cc -version -o /usr/tmp/cca02008.s GNU C++ version 2.3.3 (80386, BSD syntax) compiled by GNU C version 2.3.3. as -o /usr/tmp/cca020081.o /usr/tmp/cca02008.s ld /usr/lib/crt0.o -nojump -L/usr/lib/gcc-lib/i386-linux/2.3.3 /usr/tmp/cca020081.o -lg++ -lgcc -lc -lgcc Ok, and here is the output: test k: constructing from scratch test l=k: type conversion into unsigned constructing from unsigned */ extern "C" int printf (const char *, ...); extern "C" void exit (int); int count = 0; void die () { printf ("FAIL\n"); exit (1); } struct test { test() { if (count != 0) die (); } test(unsigned) { die (); } operator unsigned() { die (); return 0; } }; int main() { test k; test l=k; printf ("PASS\n"); return 0; }