aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2023-12-12 19:20:27 -0500
committerJason Merrill <jason@redhat.com>2023-12-13 11:25:19 -0500
commite0659b5417b7f8a090ad2ed4dea830f11ef9c877 (patch)
tree38a497e8c000e47edf6f31e0504b61021e0adae6 /gcc
parent958940eb3511e341e57606f5a2f5399bc89533cb (diff)
downloadgcc-e0659b5417b7f8a090ad2ed4dea830f11ef9c877.zip
gcc-e0659b5417b7f8a090ad2ed4dea830f11ef9c877.tar.gz
gcc-e0659b5417b7f8a090ad2ed4dea830f11ef9c877.tar.bz2
c++: fix in-charge parm in constexpr
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.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/constexpr.cc13
1 files changed, 13 insertions, 0 deletions
diff --git a/gcc/cp/constexpr.cc b/gcc/cp/constexpr.cc
index 4cf9dd7..9d9e96c 100644
--- a/gcc/cp/constexpr.cc
+++ b/gcc/cp/constexpr.cc
@@ -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);