[pushed,3/4] c++: fix in-charge parm in constexpr
Checks
Commit Message
Tested x86_64-pc-linux-gnu, applying to trunk.
-- 8< --
I was puzzled by the proposed patch for PR71093 specifically ignoring the
in-charge parameter; the problem turned out to be that when
cxx_eval_call_expression jumps from the clone to the cloned function, it
assumes that the latter has the same parameters, and so the in-charge parm
doesn't get an argument. Since a class with vbases can't have constexpr
'tors there isn't actually a need for an in-charge parameter in a
destructor, but we used to use it for deleting destructors and never removed
it. I have a patch to do that for GCC 15, but for now let's work around it.
gcc/cp/ChangeLog:
* constexpr.cc (cxx_eval_call_expression): Handle missing in-charge
argument.
---
gcc/cp/constexpr.cc | 13 +++++++++++++
1 file changed, 13 insertions(+)
@@ -3169,6 +3169,19 @@ cxx_eval_call_expression (const constexpr_ctx *ctx, tree t,
ctx->global->put_value (remapped, arg);
remapped = DECL_CHAIN (remapped);
}
+ for (; remapped; remapped = TREE_CHAIN (remapped))
+ if (DECL_NAME (remapped) == in_charge_identifier)
+ {
+ /* FIXME destructors unnecessarily have in-charge parameters
+ even in classes without vbases, map it to 0 for now. */
+ gcc_assert (!CLASSTYPE_VBASECLASSES (DECL_CONTEXT (fun)));
+ ctx->global->put_value (remapped, integer_zero_node);
+ }
+ else
+ {
+ gcc_assert (seen_error ());
+ *non_constant_p = true;
+ }
/* Add the RESULT_DECL to the values map, too. */
gcc_assert (!DECL_BY_REFERENCE (res));
ctx->global->put_value (res, NULL_TREE);