https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117101

--- Comment #3 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Simon Martin <simar...@gcc.gnu.org>:

https://gcc.gnu.org/g:5821f5c8c89a054e34cea00e042996dfdcd7e102

commit r15-4958-g5821f5c8c89a054e34cea00e042996dfdcd7e102
Author: Simon Martin <si...@nasilyan.com>
Date:   Tue Nov 5 10:16:39 2024 +0100

    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.

Reply via email to