blob: 8e15131901525c05854839bb63679e8d7ad46dc9 (
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
|
// { 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;
}
|