| // { dg-do run { target c++20 } } |
| |
| template<typename T> |
| concept C1 = __is_same_as(T, int) |
| || __is_same_as(T, long long) |
| || __is_same_as(T, char); |
| |
| template<typename T> |
| concept IsNotLarge = !__is_same_as(T, long long); |
| |
| template<typename T> |
| concept IsNotTiny = !__is_same_as(T, char); |
| |
| template<IsNotLarge T> |
| struct Foo |
| { |
| static constexpr auto a = [](auto n) { return n; }; |
| template<IsNotTiny S> |
| auto b() |
| { |
| return [](auto n) { return n; }; |
| } |
| }; |
| |
| using Func = int(*)(int); |
| |
| int main(int, char**) |
| { |
| auto g = []<C1 T> requires IsNotTiny<T>(T t) -> T |
| requires IsNotLarge<decltype(t)> { return t; }; |
| g(5); |
| g.operator()<int>(5.5); |
| |
| auto z = []<typename T, int N = 5>(T t) requires (N < 4) { return t; }; |
| z.operator()<int, 3>(5); |
| |
| [](auto t) requires true { return t; }(5); |
| [](C1 auto t) { return t; }(5); |
| |
| auto a0 = [](IsNotLarge auto a) { return [](auto b){ return b; }; }; |
| auto a1 = a0(1); |
| auto a2 = a1(5LL); |
| |
| auto b0 = [](auto a) { return [](IsNotLarge auto b){ return b; }; }; |
| auto b1 = b0(5LL); |
| auto b2 = b1(1); |
| |
| Foo<int> foo1; |
| foo1.a(5.5); |
| foo1.a(1LL); |
| foo1.b<int>()(5); |
| foo1.b<long long>()(5); |
| |
| Foo<double> foo2; |
| foo2.a(5.5); |
| foo2.a(1LL); |
| foo2.b<int>()(5); |
| foo2.b<long long>()(5); |
| |
| Func m1 = [](auto a) -> int requires true { return a; }; |
| |
| return 0; |
| } |
| |