]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c++: fix in-charge parm in constexpr
authorJason Merrill <jason@redhat.com>
Wed, 13 Dec 2023 00:20:27 +0000 (19:20 -0500)
committerJason Merrill <jason@redhat.com>
Wed, 13 Dec 2023 16:25:19 +0000 (11:25 -0500)
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

index 4cf9dd71b053156b5e46a00a8c94c0167fb6f116..9d9e96c2afdd207c2e18225f5f2aadc68d981244 100644 (file)
@@ -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);