On 9/20/24 12:40 AM, Jakub Jelinek wrote:
On Fri, Sep 20, 2024 at 06:18:15PM -0400, Marek Polacek wrote:
--- a/gcc/cp/cp-gimplify.cc
+++ b/gcc/cp/cp-gimplify.cc
@@ -1473,6 +1473,20 @@ cp_fold_r (tree *stmt_p, int *walk_subtrees, void *data_)
         that case, strip it in favor of this one.  */
        if (tree &init = TARGET_EXPR_INITIAL (stmt))
        {
+         tree fn;
+         if ((data->flags & ff_genericize)
+             /* Give the user an option to opt out.  */
+             && !((fn = current_function_decl)
+                  && lookup_attribute ("noinline",
+                                       DECL_ATTRIBUTES (fn))))
+           {
+             tree folded = maybe_constant_init (init, TARGET_EXPR_SLOT (stmt));
+             if (folded != init && TREE_CONSTANT (folded))
+               {
+                 init = folded;
+                 break;
+               }
+           }

The CALL_EXPR case in cp_fold uses !flag_no_inline instead, that makes more
sense to me.
Because checking "noinline" attribute (which means don't inline this
function) on current_function_decl rather than on functions being "inlined"
(the constexpr functions being non-manifestly constant evaluated) is just
weird.
If we really wanted, we could honor "noinline" during constant evaluation
on the CALL_EXPR/AGGR_INIT_EXPR fndecls, but dunno if whenever doing the
non-manifestly constant evaluated cases or just in special cases like these
two (CALL_EXPR in cp_fold, this in cp_fold_r).

Checking noinline in non-manifestly constant-evaluated cases might make sense.

But I suspect there isn't even a call in pr78687; the only thing I can see that maybe_constant could do anything with is the option_2() value-init, and that should just be a TARGET_EXPR around a CONSTRUCTOR already. Mysterious.

Jason

Reply via email to