https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105321
Bug ID: 105321 Summary: "non-constant condition" issued for function containing a short-circuited unevaluated non-constant expression Product: gcc Version: 11.2.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: bekenn at gmail dot com Target Milestone: --- bool handle_error(); constexpr int echo(int value, bool yes = true) noexcept { return (yes || handle_error()), value; } static_assert(echo(10) == 10, ""); --- <source>:8:24: error: non-constant condition for static assertion 8 | static_assert(echo(10) == 10, ""); | ~~~~~~~~~^~~~~ <source>:8:19: in 'constexpr' expansion of 'echo(10, 1)' <source>:3:36: error: 'yes' is not a constant expression 3 | constexpr int echo(int value, bool yes = true) noexcept | ~~~~~^~~~~~~~~~ https://godbolt.org/z/vsd9xdW5c --- It appears that the || operator isn't short-circuiting correctly during constant evaluation. This seems to be very particular; if I replace `yes` with a more complicated expression (such as `!no`), the problem disappears. This issue shows up in every version of GCC I've tried, including 11.2 and the current "trunk" release on Compiler Explorer.