c++: DR2397 - auto specifier for * and & to arrays [PR100975]
authorMarek Polacek <polacek@redhat.com>
Tue, 29 Jun 2021 18:30:51 +0000 (14:30 -0400)
committerMarek Polacek <polacek@redhat.com>
Wed, 30 Jun 2021 16:11:17 +0000 (12:11 -0400)
commite66d0b7b87d105d24da8c4784a0b907fb6b2c095
tree2f138c42691407b73a4c335bad2e43d13620c484
parenta075350ee7bffa6c90d9d233de78515f498b5149
c++: DR2397 - auto specifier for * and & to arrays [PR100975]

This patch implements DR2397, which removes the restriction in
[dcl.array]p4 that the array element type may not be a placeholder
type.  We don't need to worry about decltype(auto) here, so this
allows code like

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

However, note that

  auto (&&r)[2] = { 1, 2 };
  auto arr[2] = { 1, 2 };

still doesn't work (although one day it might) and neither does

  int arr[5];
  auto x[5] = arr;

given that auto deduction is performed in terms of function template
argument deduction, so the array decays to *.

PR c++/100975
DR 2397

gcc/cp/ChangeLog:

* decl.c (create_array_type_for_decl): Allow array of auto.

gcc/testsuite/ChangeLog:

* g++.dg/cpp0x/auto24.C: Remove dg-error.
* g++.dg/cpp0x/auto3.C: Adjust dg-error.
* g++.dg/cpp0x/auto42.C: Likewise.
* g++.dg/cpp0x/initlist75.C: Likewise.
* g++.dg/cpp0x/initlist80.C: Likewise.
* g++.dg/diagnostic/auto1.C: Remove dg-error.
* g++.dg/cpp23/auto-array.C: New test.
gcc/cp/decl.c
gcc/testsuite/g++.dg/cpp0x/auto24.C
gcc/testsuite/g++.dg/cpp0x/auto3.C
gcc/testsuite/g++.dg/cpp0x/auto42.C
gcc/testsuite/g++.dg/cpp0x/initlist75.C
gcc/testsuite/g++.dg/cpp0x/initlist80.C
gcc/testsuite/g++.dg/cpp23/auto-array.C [new file with mode: 0644]
gcc/testsuite/g++.dg/diagnostic/auto1.C