]> git.ipfire.org Git - thirdparty/gcc.git/commit
c++: Don't crash upon invalid placement new operator [PR117101]
authorSimon Martin <simon@nasilyan.com>
Tue, 5 Nov 2024 09:16:39 +0000 (10:16 +0100)
committerSimon Martin <simon@nasilyan.com>
Tue, 5 Nov 2024 09:18:00 +0000 (10:18 +0100)
commit5821f5c8c89a054e34cea00e042996dfdcd7e102
tree10e69b706e19e9d344bfb996f7613b545abebb37
parentb1d92aeb8583c8d1491c97703680c5fb88ed1fe4
c++: Don't crash upon invalid placement new operator [PR117101]

We currently crash upon the following invalid code (notice the "void
void**" parameter)

=== cut here ===
using size_t = decltype(sizeof(int));
void *operator new(size_t, void void **p) noexcept { return p; }
int x;
void f() {
    int y;
    new (&y) int(x);
}
=== cut here ===

The problem is that in this case, we end up with a NULL_TREE parameter
list for the new operator because of the error, and (1) coerce_new_type
wrongly complains about the first parameter type not being size_t,
(2) std_placement_new_fn_p blindly accesses the parameter list, hence a
crash.

This patch does NOT address #1 since we can't easily distinguish between
a new operator declaration without parameters from one with erroneous
parameters (and it's not worth the risk to refactor and break things for
an error recovery issue) hence a dg-bogus in new52.C, but it does
address #2 and the ICE by simply checking the first parameter against
NULL_TREE.

It also adds a new testcase checking that we complain about new
operators with no or invalid first parameters, since we did not have
any.

PR c++/117101

gcc/cp/ChangeLog:

* init.cc (std_placement_new_fn_p): Check first_arg against
NULL_TREE.

gcc/testsuite/ChangeLog:

* g++.dg/init/new52.C: New test.
* g++.dg/init/new53.C: New test.
gcc/cp/init.cc
gcc/testsuite/g++.dg/init/new52.C [new file with mode: 0644]
gcc/testsuite/g++.dg/init/new53.C [new file with mode: 0644]