https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80227

            Bug ID: 80227
           Summary: [4.6/5/6/7 Regression] SFINAE ambiguity with a pointer
                    to array argument
           Product: gcc
           Version: 7.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: msebor at gcc dot gnu.org
  Target Milestone: ---

Prior to version 4.6, GCC accepted the well-formed program below.  Since
r166453 GCC rejects it because it fails to eliminate the second overload of the
foo template from the overload list.  The second overload isn't viable because
substituting int for T results in the second argument to the function having an
invalid type (pointer to an array of excessive size).

$ cat y.C && gcc -S -Wall -Wextra -Wpedantic y.C
template <class T>
int foo (T);

template <class T, class U = T [sizeof (T) - 5]>
int foo (T, U* = 0);

int i = foo (123);
y.C:7:17: error: call of overloaded ‘foo(int)’ is ambiguous
 int i = foo (123);
                 ^
y.C:2:5: note: candidate: int foo(T) [with T = int]
 int foo (T);
     ^~~
y.C:5:5: note: candidate: int foo(T, U*) [with T = int; U = int [-1]]
 int foo (T, U* = 0);
     ^~~


Conversely, while prior to r166453 GCC would reject the following invalid
program

template <class T>
int foo (T, int (*)[sizeof (T) - 5] = 0);

int i = foo (123);

with

t.C:4:17: error: no matching function for call to ‘foo(int)’
t.C:2:40: note: candidate is: template<class T> int foo(T, int (*)[(sizeof (T)
- 5)])

GCC 4.6 and later accept it.

Reply via email to