aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/error.cc
diff options
context:
space:
mode:
authorSimon Martin <simon@nasilyan.com>2024-11-05 10:16:39 +0100
committerSimon Martin <simon@nasilyan.com>2024-11-05 10:18:00 +0100
commit5821f5c8c89a054e34cea00e042996dfdcd7e102 (patch)
tree10e69b706e19e9d344bfb996f7613b545abebb37 /gcc/fortran/error.cc
parentb1d92aeb8583c8d1491c97703680c5fb88ed1fe4 (diff)
downloadgcc-5821f5c8c89a054e34cea00e042996dfdcd7e102.zip
gcc-5821f5c8c89a054e34cea00e042996dfdcd7e102.tar.gz
gcc-5821f5c8c89a054e34cea00e042996dfdcd7e102.tar.bz2
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.
Diffstat (limited to 'gcc/fortran/error.cc')
0 files changed, 0 insertions, 0 deletions