https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119150
Jakub Jelinek <jakub at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |jakub at gcc dot gnu.org --- Comment #4 from Jakub Jelinek <jakub at gcc dot gnu.org> --- As consteval bool foo (bool x) { return x; } constexpr bool bar () { if consteval { return true; } else { return false; } } int main () { bool a = false; a = foo (bar ()); if (!a) __builtin_abort (); bool b = foo (bar ()); if (!b) __builtin_abort (); } shows, the bug is cxx_eval_call_expression, when we are doing non-manifestly constant-evaluated constexpr evaluation, we set /* Make sure we fold std::is_constant_evaluated to true in an immediate function. */ if (DECL_IMMEDIATE_FUNCTION_P (fun)) call_ctx.manifestly_const_eval = mce_true; but evaluate arguments of the immediate function before that. In the a case, there is no constant evaluation done before cp_fold_function and so the evaluation is correct in that case.