The following compliant code fails to compile:
template<int I> int f1 (char[I]);
template<int I> int f1 (char p1 = I);
int i = f1<0>(0);
.. instead it generates an error, e.g.:
test.C:3: error: call of overloaded 'f1(int)' is ambiguous
test.C:1: note: candidates are: int f1(char*) [with int I = 0]
test.C:2: note: int f1(char) [with int I = 0]
The first template should fail to match (SFINAE) because doing so would cause a
reference to a zero-sized array (as per ISO C++ section 14.8.2.2).
It is possible that gcc may be performing the "type[size] --> type *"
conversion too early, as prohibited by 14.8.2.3:
After this substitution is performed, the function parameter type
adjustments described in 8.3.5 are performed. [Example: A parameter
type of void ()(const int, int[5]) becomes void(*)(int,int*).
--
Summary: Template instantiation generating a zero-sized array
doesn't fail
Product: gcc
Version: 4.1.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: jconner at apple dot com
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24663