https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83692
Bug ID: 83692 Summary: Rejects valid constexpr with unrelated code fixing problem Product: gcc Version: 8.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: david at doublewise dot net Target Milestone: --- The following program fails to compile struct integer { constexpr int value() const { return m_value; } int m_value; }; struct outer { integer m_x{0}; constexpr outer() { if (m_x.value() != 0) throw 0; m_x.m_value = integer{1}.value(); if (m_x.value() != 1) throw 0; } }; constexpr outer o{}; Giving the error message: 17 : <source>:17:19: in 'constexpr' expansion of 'outer()' 13 : <source>:13:37: error: expression '<throw-expression>' is not a constant expression if (m_x.value() != 1) throw 0; ^ Compiler returned: 1 Seemingly insignificant changes in the code lead to the error disappearing: for instance, removing the first if statement (which is not rejected as invalid) causes the second if statement to be accepted.