]> git.ipfire.org Git - thirdparty/gcc.git/commit
c++: Evaluate immediate invocation call arguments with mce_true [PR119150]
authorJakub Jelinek <jakub@redhat.com>
Wed, 12 Mar 2025 23:42:54 +0000 (00:42 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 27 Mar 2025 23:40:15 +0000 (00:40 +0100)
commit13fd7c971fb573b2f1721c3684b34a65133b7085
tree7ce57bde67e80e917353334b7799aeba59a5f043
parent4164c2542952d82e7cdb06d28c8707ac131b5644
c++: Evaluate immediate invocation call arguments with mce_true [PR119150]

Since Marek's r14-4140 which moved immediate invocation evaluation
from build_over_call to cp_fold_r, the following testcase is miscompiled.

The a = foo (bar ()); case is actually handled right, that is handled
in cp_fold_r and the whole CALL_EXPR is at that point evaluated by
cp_fold_immediate_r with cxx_constant_value (stmt, tf_none);
and that uses mce_true for evaluation of the argument as well as the actual
call.

But in the bool b = foo (bar ()); case we actually try to evaluate this
as non-manifestly constant-evaluated.  And while
          /* 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;
ensures that if consteval and __builtin_is_constant_evaluated () is true
inside of that call, this happens after arguments to the function
have been already constant evaluated in cxx_bind_parameters_in_call.
The call_ctx in that case also includes new call_ctx.call, something that
shouldn't be used for the arguments, so the following patch just arranges
to call cxx_bind_parameters_in_call with manifestly_constant_evaluated =
mce_true.

2025-03-13  Jakub Jelinek  <jakub@redhat.com>

PR c++/119150
* constexpr.cc (cxx_eval_call_expression): For
DECL_IMMEDIATE_FUNCTION_P (fun) set manifestly_const_eval in new_ctx
and new_call to mce_true and set ctx to &new_ctx.

* g++.dg/cpp2a/consteval41.C: New test.

(cherry picked from commit ebf6e6241f5658a3cae462b1314f4a8f2bc71760)
gcc/cp/constexpr.cc
gcc/testsuite/g++.dg/cpp2a/consteval41.C [new file with mode: 0644]