https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100825
--- Comment #6 from vopl at bk dot ru --- (In reply to Jonathan Wakely from comment #5) > Yes, I realise that, but I think that is the same rule that means you can't > change the result of overload resolution for a given call, But I have a precedent: void foo(char) {} void useFirst() { foo(0); // "void foo(char)" used, no "void foo(int)" visible at now } void foo(int) {} // introduce second function void useSecond() { foo(0); // "void foo(int)" selected as more suitable } > which is why the > second definition gets emitted using the same symbol name as the first. [defns.signature.templ] states that trailing require-clause is a part of function signature, so these are two different functions: template <class T> void foo() {} template <class T> void foo() requires true {} Since the signature is the basis for name mangling - different names are expected for different functions.. > If the constrained overload is declared before the first call to foo<int>() > then there is no error. Aha, in such situation there is an only call, no second one, so, no second symbol and no conflicts. Thanks.