https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65786
Bug ID: 65786 Summary: Wrong code when using decltype to specify the return type Product: gcc Version: 4.9.2 Status: UNCONFIRMED Severity: critical Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: josopait at goopax dot com In the program below, the assignment of the return value is messed up. While the C++-14 style of fully automatic type deduction works fine, the mymax11 function call produces some random numbers. The output is: 1 2 -2100190336 or similar. The last line is different for every program execution. I am using gcc 4.9.2 on x86_64 Linux. I don't get this bug if I use -m32. #include <iostream> using namespace std; struct testclass { int data; inline operator const int&() const { return data; } testclass& operator = (const int& in) { data = in; return *this; } }; template <typename A, typename B> auto mymax14(const A& a, const B& b) { return std::max((int)a, (int)b); } template <typename A, typename B> auto mymax11(const A& a, const B& b) -> decltype(std::max((int)a, (int)b)) { return std::max((int)a, (int)b); } int main() { testclass d; d = 1; cout << d.data << endl; // ok, d.data==1 d = mymax14(d, 2); cout << d.data << endl; // ok, d.data==2 d = mymax11(d, 2); cout << d.data << endl; // bad: d.data == some random number. return 0; }