https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105321

--- Comment #2 from Marek Polacek <mpolacek at gcc dot gnu.org> ---
As you mention, this slightly modified test compiles fine:

bool handle_error();

constexpr int echo(int value, bool yes = false) noexcept
{
    return (!yes || handle_error()), value;
}

static_assert(echo(10) == 10, "");

In the original test we have

<retval> = (void) (VIEW_CONVERT_EXPR<bool>(yes) || handle_error ());,
VIEW_CONVERT_EXPR<int>(value);

which has a COMPOUND_EXPR, so we get to
cxx_eval_constant_expression/COMPOUND_EXPR.  The problem here is that we call 

7044             /* Check that the LHS is constant and then discard it.  */
7045             cxx_eval_constant_expression (ctx, op0,
7046                                           true, non_constant_p,
overflow_p,
7047                                           jump_target);

where lval is always true, so the PARM_DECL 'yes' is not evaluated.

In the working test, we evaluate "!yes" in cxx_eval_unary_expression which
evaluates its operand with

3217   tree arg = cxx_eval_constant_expression (ctx, orig_arg, /*lval*/false,
3218                                            non_constant_p, overflow_p);

where lval is false, so the PARM_DECL is evaluated into a constant.

Reply via email to