c++: constrained lambda error-recovery [PR108972]
[official-gcc.git] / gcc / testsuite / g++.dg / cpp2a / concepts-lambda3.C
blobb18e6b62aa4312d9b4a2707bf9cf945db7122dc4
1 // { dg-do run }
2 // { dg-excess-errors "" { target { ! concepts } } } (PR108972)
4 template<typename T>
5 concept C1 = __is_same_as(T, int)
6   || __is_same_as(T, long long)
7   || __is_same_as(T, char);
9 template<typename T>
10 concept IsNotLarge = !__is_same_as(T, long long);
12 template<typename T>
13 concept IsNotTiny = !__is_same_as(T, char);
15 template<IsNotLarge T>
16 struct Foo
18   static constexpr auto a = [](auto n) { return n; };
19   template<IsNotTiny S>
20   auto b()
21   {
22     return [](auto n) { return n; };
23   }
26 using Func = int(*)(int);
28 int main(int, char**)
30   auto g = []<C1 T> requires IsNotTiny<T>(T t) -> T
31     requires IsNotLarge<decltype(t)> { return t; };
32   g(5);
33   g.operator()<int>(5.5);
35   auto z = []<typename T, int N = 5>(T t) requires (N < 4) { return t; };
36   z.operator()<int, 3>(5);
38   [](auto t) requires true { return t; }(5);
39   [](C1 auto t) { return t; }(5);
41   auto a0 = [](IsNotLarge auto a) { return [](auto b){ return b; }; };
42   auto a1 = a0(1);
43   auto a2 = a1(5LL);
45   auto b0 = [](auto a) { return [](IsNotLarge auto b){ return b; }; };
46   auto b1 = b0(5LL);
47   auto b2 = b1(1);
49   Foo<int> foo1;
50   foo1.a(5.5);
51   foo1.a(1LL);
52   foo1.b<int>()(5);
53   foo1.b<long long>()(5);
55   Foo<double> foo2;
56   foo2.a(5.5);
57   foo2.a(1LL);
58   foo2.b<int>()(5);
59   foo2.b<long long>()(5);
61   Func m1 = [](auto a) -> int requires true { return a; };
63   return 0;