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). Jakub