https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64063
Bug ID: 64063
Summary: Incorrect "ambiguous template specialization" error
Product: gcc
Version: 5.0
Status: UNCONFIRMED
Keywords: rejects-valid
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: redi at gcc dot gnu.org
G++ rejects this explicit instantiation definition as ambiguous:
template<typename T>
struct S
{
void foo(int) { }
template<typename U> void foo(U) { }
};
template void S<char>::foo(int); // XXX
EDG thinks it's OK, clang crashes, and G++ says:
inst.cc:8:15: error: ambiguous template specialization ‘foo<>’ for ‘void
S<char>::foo(int)’
template void S<char>::foo(int); // XXX
^
inst.cc:4:8: note: candidates are: void S<T>::foo(int) [with T = char]
void foo(int) { }
^
inst.cc:5:29: note: template<class U> void S<T>::foo(U) [with U
= U; T = char]
template<typename U> void foo(U) { }
^
I think EDG is correct and the diagnostic is wrong, because I'm not referring
to any foo<> but rather foo.
Changing the instantiation to be unambiguously a template produces almost the
same error (with foo<> replaced by foo<int>) and that definitely isn't
ambiguous because one candidate isn't even a function template:
template<typename T>
struct S
{
void foo(int) { }
template<typename U> void foo(U) { }
};
template void S<char>::foo<int>(int); // XXX
inst.cc:8:15: error: ambiguous template specialization ‘foo<int>’ for ‘void
S<char>::foo(int)’
template void S<char>::foo<int>(int); // XXX
^
inst.cc:4:8: note: candidates are: void S<T>::foo(int) [with T = char]
void foo(int) { }
^
inst.cc:5:29: note: template<class U> void S<T>::foo(U) [with U
= U; T = char]
template<typename U> void foo(U) { }
^