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.