// PR c++/105842 // { dg-do compile { target c++20 } } template struct S { static void func1() requires __is_same(T, int); static void func1() requires (!__is_same(T, int)); static void func2() requires false && false; static void func2() requires false; template static void tmpl1() requires __is_same(T, int); template static void tmpl1() requires (!__is_same(T, int)); template static void tmpl2() requires (sizeof...(Us) == 1); template static void tmpl2() requires (sizeof...(Us) == 2); static void foo() { // Both calls resolve to the first overload at instantiation time. func1(); tmpl1(); } static void bar() { // We can check and reject both calls ahead of time since the functions' // constraints don't depend on outer template parameters. func2(); // { dg-error "no match" } tmpl2(); // { dg-error "no match" } } }; int main() { S::foo(); }