https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80268
Bug ID: 80268 Summary: [concepts] list of candidates for ambiguous call includes unconstrained function Product: gcc Version: 7.0.1 Status: UNCONFIRMED Keywords: diagnostic Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: redi at gcc dot gnu.org Target Milestone: --- This rightly fails to compile with -fconcepts: template<typename T> inline constexpr bool is_int_sized = sizeof(T) == sizeof(int); template<typename T> inline constexpr bool is_signed = (T(-1) < T(0)); template<typename T> void func(T) { } template<typename T> void func(T) requires is_int_sized<T> { } template<typename T> void func(T) requires is_signed<T> { } int main() { func(1); } ambig.cc: In function ‘int main()’: ambig.cc:15:9: error: call of overloaded ‘func(int)’ is ambiguous func(1); ^ ambig.cc:7:27: note: candidate: void func(T) [with T = int] template<typename T> void func(T) { } ^~~~ ambig.cc:9:27: note: candidate: void func(T) requires is_int_sized<T> [with T = int] template<typename T> void func(T) requires is_int_sized<T> { } ^~~~ ambig.cc:11:27: note: candidate: void func(T) requires is_signed<T> [with T = int] template<typename T> void func(T) requires is_signed<T> { } ^~~~ I think showing the first candidate in the error isn't very useful. The ambiguity is between the 2nd and 3rd overloads, because neither is more constrained than the other. But both are more constrained than the first, and it would never be chosen as the best match if only one of the others was a candidate (rather than both). I know we'd show all candidates in an unconstrained case, but I wonder if we should do things differently for constrained functions.