Consider the following code: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ template<typename T> void f(int a[(int)T()]); void g() { f<char[10]>(0); } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ There should be something wrong with "f<char[10]>" because the template argument passed to "f" is an array value and cannot be value-initialized, for instance, in the form of "char[10]()". Both EDG and clang reject the code, but gcc accepts it. This will only happen when the index value is related to a dependent name. https://godbolt.org/z/GG4W5G755