http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57901
Bug ID: 57901 Summary: [C++11][constexpr] Cannot call-by-value such that class has non-trivial (constexpr) move constructor Product: gcc Version: 4.8.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: bolero.murakami at gmail dot com Code: //-------- struct Z { Z() = default; Z(Z const&) = default; constexpr Z(Z&&) {} /* non-trivial (constexpr) move ctor */ }; template<typename T> constexpr int fn0(T v) { return 0; } template<typename T> constexpr int fn (T v) { return fn0(v); } constexpr auto t0 = fn0(Z()); // OK! constexpr auto t = fn (Z()); // error! (GCC 4.8.1, -std=c++11) //-------- Error message: in constexpr expansion of ‘fn<Z>(Z())’ error: ‘v’ is not a constant expression constexpr auto t = fn(Z()); ^ Class Z is literal type. However, compilation error when it is call-by-value(more than once). I tested this code in gcc-4.7.3, is passed. The problem is reproduced in gcc-4.8.0, gcc-4.8.1