c++: new-expr of array of deduced class tmpl [PR101988]
authorMarek Polacek <polacek@redhat.com>
Wed, 26 Jan 2022 22:29:19 +0000 (17:29 -0500)
committerMarek Polacek <polacek@redhat.com>
Thu, 27 Jan 2022 13:18:43 +0000 (08:18 -0500)
commit0c0f453c4af4880c522c8472c33eef42bee9eda1
treec42601c3b1f5514fd17a1409d7238c6731a23ecb
parent76ef38e3178a11e76a66b4d4c0e10e85fe186a45
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.
gcc/cp/decl.cc
gcc/testsuite/g++.dg/cpp1z/class-deduction-new1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp23/auto-array2.C [new file with mode: 0644]