https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91705
Bug ID: 91705 Summary: operator++ broken in constexpr floating point code Product: gcc Version: 9.1.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: john at johnmaddock dot co.uk Target Milestone: --- The following short program was accepted by gcc-8, but results in an error with gcc-9.1: template <class T> constexpr T test_increment(T t) { return ++t; } int main() { constexpr double t = test_increment(2.0f); static_assert(t == 3); } With: /home/john/t.cpp: In function ‘int main()’: /home/john/t.cpp:15:38: in ‘constexpr’ expansion of ‘test_increment<float>(2.0e+0f)’ /home/john/t.cpp:15:43: error: ‘((float)1 + 2.0e+0f)’ is not a constant expression 15 | constexpr double t = test_increment(2.0f); | ^ /home/john/t.cpp:16:19: error: non-constant condition for static assertion 16 | static_assert(t == 3); The problem is present for all floating point types (float, double, long double and __float128), but not integers. Replacing ++t with t+1 fixes the problem.