https://wg21.link/cwg2397
int a[3]; auto (*p)[3] = &a;
Looks like just disabling the check in create_array_type_for_decl lets us compile: struct false_type { static constexpr bool value = false; }; struct true_type { static constexpr bool value = true; }; template<class T, class U> struct is_same : false_type {}; template<class T> struct is_same<T, T> : true_type {}; void g () { int a[3]; auto (*p)[3] = &a; auto (&r)[3] = a; static_assert (is_same<decltype (p), int(*)[3]>::value); static_assert (is_same<decltype (r), int(&)[3]>::value); }
The master branch has been updated by Marek Polacek <mpolacek@gcc.gnu.org>: https://gcc.gnu.org/g:e66d0b7b87d105d24da8c4784a0b907fb6b2c095 commit r12-1933-ge66d0b7b87d105d24da8c4784a0b907fb6b2c095 Author: Marek Polacek <polacek@redhat.com> Date: Tue Jun 29 14:30:51 2021 -0400 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.
Implemented in GCC 12.