g++ release 4.1.1 compiles the following invalid code without detecting an error. It does correctly find the error with -pedantic. Interestingly (perhaps), it also correctly detects the ambiguous call where the argument involved is const - as demonstrated by the second compilation below with the macro C2 defined: sjh@mill:~/c++/compiler$ g++ -c conversion.ambig.c sjh@mill:~/c++/compiler$ cat conversion.ambig.c class Source; class Destination { public: Destination() {} Destination (const Source& source) {} }; class Source { public: Source() {} operator Destination() const { return Destination();} }; Source source; Destination wolf = source; // ambiguous #ifdef C2 const Source source2; Destination wolf2 = source2; // ambiguous #endif sjh@mill:~/c++/compiler$ g++ -D C2 conversion.ambig.c conversion.ambig.c:22: error: conversion from 'const Source' to 'Destination' is ambiguous conversion.ambig.c:14: note: candidates are: Source::operator Destination() const conversion.ambig.c:7: note: Destination::Destination(const Source&) sjh@mill:~/c++/compiler$ sjh@mill:~/c++/compiler$ sjh@mill:~/c++/compiler$ gcc -v Using built-in specs. Target: i686-pc-linux-gnu Configured with: /home/sjh/gcc/gcc-4.1.1/configure --prefix=/home/sjh/gcc/prefix/ --enable-languages=c,c++ Thread model: posix gcc version 4.1.1 sjh@mill:~/c++/compiler$
I changed the summary since this is undocumented extension and we reject it with -pedantic already, I don't know if this is useful extension or not.
According to 1.4/8 implementations with extensions are required to "diagnose programs that use extensions that are ill-formed according to this International Standard." This code is ill-formed so presumably g++ should print a warning. I don't know the motivation for the extension but would highlight the question of whether it was intentional that it affects non-const arguments but not const.
Confirmed. Not a useful extension because confusing: ----------------- struct A; struct B { B (const A&); }; struct A { operator B() const; }; A a; B b1 = a; // xpass ----------------------- g/x> /home/bangerth/bin/gcc-4.2-pre/bin/c++ -c x.cc g/x> /home/bangerth/bin/gcc-4.2-pre/bin/c++ -c x.cc -pedantic x.cc:12: error: conversion from ‘A’ to ‘B’ is ambiguous x.cc:8: note: candidates are: A::operator B() const x.cc:4: note: B::B(const A&)
This showed up on my search for documentation issues, but from the discussion it appears it's a missing-diagnostic issue instead. I've confirmed the test case still behaves as described on trunk.