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

--- Comment #2 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Marek Polacek <mpola...@gcc.gnu.org>:

https://gcc.gnu.org/g:ae48b74ca0c0ba33d396a6ebad7a1c0a6dadb1f7

commit r11-5179-gae48b74ca0c0ba33d396a6ebad7a1c0a6dadb1f7
Author: Marek Polacek <pola...@redhat.com>
Date:   Wed Nov 18 19:07:07 2020 -0500

    c++: Fix array new with value-initialization [PR97523]

    Since my r11-3092 the following is rejected with -std=c++20:

      struct T { explicit T(); };
      void fn(int n) {
        new T[1]();
      }

    with "would use explicit constructor 'T::T()'".  It is because since
    that change we go into the P1009 block in build_new (array_p is false,
    but nelts is non-null and we're in C++20).  Since we only have (), we
    build a {} and continue to build_new_1, which then calls build_vec_init
    and then we error because the {} isn't CONSTRUCTOR_IS_DIRECT_INIT.

    For (), which is value-initializing, we want to do what we were doing
    before: pass empty init and let build_value_init take care of it.

    For various reasons I wanted to dig a little bit deeper into this,
    and as a result, I'm adding a test for [expr.new]/24 (and checked that
    out current behavior matches clang++).

    gcc/cp/ChangeLog:

            PR c++/97523
            * init.c (build_new): When value-initializing an array new,
            leave the INIT as an empty vector.

    gcc/testsuite/ChangeLog:

            PR c++/97523
            * g++.dg/expr/anew5.C: New test.
            * g++.dg/expr/anew6.C: New test.

Reply via email to