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

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

https://gcc.gnu.org/g:0c0f453c4af4880c522c8472c33eef42bee9eda1

commit r12-6894-g0c0f453c4af4880c522c8472c33eef42bee9eda1
Author: Marek Polacek <pola...@redhat.com>
Date:   Wed Jan 26 17:29:19 2022 -0500

    c++: new-expr of array of deduced class tmpl [PR101988]

    In r12-1933 I attempted to implement DR2397 aka allowing

      int a[3];
      auto (&r)[3] = a;

    by removing the type_uses_auto check in create_array_type_for_decl.
    That may have gone too far, because it also allows arrays of
    CLASS_PLACEHOLDER_TEMPLATE and it looks like [dcl.type.class.deduct]
    prohibits that: "...the declared type of the variable shall be cv T,
    where T is the placeholder."  However, in /2 it explicitly states that
    "A placeholder for a deduced class type can also be used in the
    type-specifier-seq in the new-type-id or type-id of a new-expression."

    In this PR, it manifested by making us accept invalid

      template<class T> struct A { A(T); };
      auto p = new A[]{1};

    [expr.new]/2 says that such a construct is treated as an invented
    declaration of the form

      A x[]{1};

    but, I think, that ought to be ill-formed as per above.  So this patch
    sort of restores the create_array_type_for_decl check.  I should mention
    that the difference between [] and [1] is due to cp_parser_new_type_id:

          if (*nelts == NULL_TREE)
            /* Leave [] in the declarator.  */;

    and groktypename returning different types based on that.

            PR c++/101988

    gcc/cp/ChangeLog:

            * decl.cc (create_array_type_for_decl): Reject forming an array of
            placeholder for a deduced class type.

    gcc/testsuite/ChangeLog:

            * g++.dg/cpp1z/class-deduction-new1.C: New test.
            * g++.dg/cpp23/auto-array2.C: New test.

Reply via email to