Volker Reichelt <[EMAIL PROTECTED]> writes: | Yesterday the output of the following program changed | (probably due to the fix for PR19076):
Thanks for raising this issue. | | ====================================================================== | 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 - 3.4.0 return 0, GCC 3.4.1 - 3.4.4-20050222 return 2, | and now mainline again returns 0. I would say that is the behaviour I would expect. I don't understand the answer 2. I'll check with the C++ Core Working Group. | So the question is: What is the correct return value? | | Btw, we really should have this in the testsuite. | | In any case, we have a wrong-code regression here, either on the | 3.4 branch or on mainline. But before I open a PR I'd like to sort | out which is the correct behavior. | | When the result changed in 3.4.1 I bugged Nathan (who caused this | change) about it, and he claimed that '2' is the correct result. | Intel's compiler indeed returns 2. Well, I definitely needs an answer better than "that is what Intel's compiler does" :-) -- Gaby