diff options
author | Jason Merrill <jason@redhat.com> | 2023-12-12 19:20:27 -0500 |
---|---|---|
committer | Jason Merrill <jason@redhat.com> | 2023-12-13 11:25:19 -0500 |
commit | e0659b5417b7f8a090ad2ed4dea830f11ef9c877 (patch) | |
tree | 38a497e8c000e47edf6f31e0504b61021e0adae6 | |
parent | 958940eb3511e341e57606f5a2f5399bc89533cb (diff) | |
download | gcc-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.
-rw-r--r-- | gcc/cp/constexpr.cc | 13 |
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); |