https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100825
--- Comment #12 from Jonathan Wakely <redi at gcc dot gnu.org> ---
At the very least, GCC should give better errors instead of just letting the
assembler complain. Clang tells you where the conflicting definitions come
from, e.g. for the code in comment 1:
1.C:7:23: error: definition with same mangled name '_Z3fooIiEvv' as another
definition
template <class> void foo() requires true {} //2
^
1.C:1:23: note: previous definition is here
template <class> void foo() {} //1
^
1 error generated.
Similarly with EDG:
eccp: diagnostics generated from compilation of 1.int.c:
1.C:7:65: error: redefinition of ‘_Z3fooIiEvv’
7 | template <class> void foo() requires true {} //2
| ^
1.C:1:65: note: previous definition of ‘_Z3fooIiEvv’ with type ‘void(void)’
1 | template <class> void foo() {} //1
| ^
eccp: end of diagnostics from compilation of 1.int.c
eccp: gcc compilation of 1.int.c returned an exit status of 1
These are both much better than the result with GCC:
/tmp/ccnRtmjt.s: Assembler messages:
/tmp/ccnRtmjt.s:59: Error: symbol `_Z3fooIiEvv' is already defined