Consider the following program: ==================================================================== template <typename T> int ref (T&) { return 0; } template <typename T> int ref (const T&) { return 1; } template <typename T> int ref (const volatile T&) { return 2; } template <typename T> int ref (volatile T&) { return 4; }
template <typename T> int ptr (T*) { return 0; } template <typename T> int ptr (const T*) { return 8; } template <typename T> int ptr (const volatile T*) { return 16; } template <typename T> int ptr (volatile T*) { return 32; } void foo() {} int main() { return ref(foo) + ptr(&foo); } ==================================================================== GCC 2.95.3 through 3.4.0 return 0, GCC 3.4.1 through 3.4.3 return 2. But the 4.0 branch and mainline again return 0. The current reading of the standard suggests that 2 is indeed the correct answer (quoting Gaby: In summary, cv-qualifiers although ignored and void of semantics for function types, do actually play a significant role in "winning" the partial ordering tournoi, and after that disappear.) Hence, we have a wrong-code bug in 4.0 branch and mainline. However, since the situation between pointers and references is unsymmetric in this case, Gaby is going to raise the issue in the core language list. So, I'm suspending this until we have a definite answer. See also http://gcc.gnu.org/ml/gcc/2005-02/msg00834.html -- Summary: [4.0/4.1 regression] cv-qualified function references and overload resolution Product: gcc Version: 4.0.0 Status: UNCONFIRMED Keywords: wrong-code Severity: normal Priority: P2 Component: c++ AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: reichelt at gcc dot gnu dot org CC: gcc-bugs at gcc dot gnu dot org,gdr at integrable- solutions dot net http://gcc.gnu.org/bugzilla/show_bug.cgi?id=20966