| // PR c++/105842 |
| // { dg-do compile { target c++20 } } |
| |
| template<class T> |
| 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<class...> static void tmpl1() requires __is_same(T, int); |
| template<class...> static void tmpl1() requires (!__is_same(T, int)); |
| |
| template<class... Us> static void tmpl2() requires (sizeof...(Us) == 1); |
| template<class... Us> 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<int>::foo(); |
| } |