https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102871
Andrew Pinski <pinskia at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Last reconfirmed| |2021-11-08 Ever confirmed|0 |1 Status|UNCONFIRMED |NEW --- Comment #2 from Andrew Pinski <pinskia at gcc dot gnu.org> --- Reduced testcase removing the auto and a few other template arguments and making it valid C++11 code: short arr3[1]; template <typename... Ts> struct A { template <Ts... Ns> A(Ts (*...qs)[Ns]); }; A<short> a(&arr3); ------- CUT ------ The above testcase ICEs all the way down to GCC 4.8.0, before it was rejected with: <source>:5:17: error: no matching function for call to 'A<short int>::A(short int (*)[1])' <source>:5:17: note: candidates are: <source>:3:23: note: template<Ts ...Ns> A::A(Ts (*)[Ns]...) <source>:3:23: note: template argument deduction/substitution failed: <source>:5:17: note: 'Ns' is not equivalent to '1' <source>:2:34: note: constexpr A<short int>::A(const A<short int>&) <source>:2:34: note: no known conversion for argument 1 from 'short int (*)[1]' to 'const A<short int>&' <source>:2:34: note: constexpr A<short int>::A(A<short int>&&) <source>:2:34: note: no known conversion for argument 1 from 'short int (*)[1]' to 'A<short int>&&' Note the revision referenced was just dealing with the first line of the code which you can replace the auto with int* and get a failure earlier too.