c++: no clobber for C++20 destroying delete [PR91859]
authorJason Merrill <jason@redhat.com>
Fri, 28 May 2021 21:05:23 +0000 (17:05 -0400)
committerJason Merrill <jason@redhat.com>
Tue, 1 Jun 2021 15:38:21 +0000 (11:38 -0400)
commitcf2b7020ee8e9745ede527b0a3b2e0ffbafd492b
tree2cba3de452cbeda1c79403c5f1d50c957dd43118
parent620cd7861e1266991c9c2a82e1e2d5f4d723ec88
c++: no clobber for C++20 destroying delete [PR91859]

Before C++20 added destroying operator delete, by the time we called
operator delete for a pointer, the object would already be gone.  But that
isn't true for destroying delete.  Since the optimizers' assumptions about
operator delete are based on either DECL_IS_REPLACEABLE_OPERATOR (which
already is not set) or CALL_FROM_NEW_OR_DELETE_P, let's avoid setting the
latter flag in this case.

PR c++/91859

gcc/ChangeLog:

* tree.h (CALL_FROM_NEW_OR_DELETE_P): Adjust comment.

gcc/cp/ChangeLog:

* call.c (build_op_delete_call): Don't set CALL_FROM_NEW_OR_DELETE_P
for destroying delete.
* init.c (build_delete): Don't clobber before destroying delete.

gcc/testsuite/ChangeLog:

* g++.dg/cpp2a/destroying-delete5.C: New test.
gcc/cp/call.c
gcc/cp/init.c
gcc/testsuite/g++.dg/cpp2a/destroying-delete5.C [new file with mode: 0644]
gcc/tree.h