aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.dg/cpp2a/concepts-lambda2.C
blob: 44b509dd3808ff2e6e01ad7e99fbafd9493ed748 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
// { dg-do compile { target c++20 } }

template<typename T>
concept False = false;

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 [](False auto n) { return n; };
  }
};

template<IsNotTiny T>
struct Bar
{
  static constexpr auto a =
    []<IsNotTiny R>(R t) { return t; }('a'); // { dg-error "no match" }
  char b =
    []<IsNotTiny R>(R t) { return t; }('b'); // { dg-error "no match" }

  static constexpr auto a2 =
    [](char t) requires false { return t; }('a'); // { dg-error "no match" }
  char b2 =
    [](char t) requires false { return t; }('b'); // { dg-error "no match" }
};

template<IsNotLarge S>
S c =
  []<IsNotTiny R>(R t) { return t; }('c'); // { dg-error "no match" }
template<IsNotLarge S>
S c2 =
  [](char t) requires false { return t; }('c'); // { dg-error "no match" }

Bar<long long> bar;

void test0()
{
  auto bar_a = bar.a;
  auto bar_b = bar.b;
  auto c = ::c<char>;
  auto bar_a2 = bar.a2;
  auto bar_b2 = bar.b2;
  auto c2 = ::c2<char>;

  auto g0 = []<False T>(T t) { return t; };
  auto g1 = []<typename T> requires False<T> (T t) { return t; };
  auto g2 = []<typename T>(T t) requires False<decltype(t)> { return t; };
  auto g3 = [](int t) requires False<decltype(t)> { return t; }; // { dg-error "non-templated" }
  auto g4 = [](False auto t) { return t; };
  auto g5 = [](auto t) requires False<decltype(t)> { return t; };
  auto g6 = [](int t) requires False<int> { return t; }; // { dg-error "non-templated" }
  auto g7 = [](int t) requires false { return t; };	 // { dg-error "non-templated" }
  g0(0); // { dg-error "no match" }
  g1(0); // { dg-error "no match" }
  g2(0); // { dg-error "no match" }
  g3(0);
  g4(0); // { dg-error "no match" }
  g5(0); // { dg-error "no match" }
  g6(0);
  g7(0);
}

void test1()
{
  int var{-1};
  auto g0 = [&]<False T>(T t) { return t; };
  auto g1 = [&]<typename T> requires False<T> (T t) { return t; };
  auto g2 = [&]<typename T>(T t) requires False<decltype(t)> { return t; };
  auto g3 = [&](int t) requires False<decltype(t)> { return t; }; // { dg-error "non-templated" }
  auto g4 = [&](False auto t) { return t; };
  auto g5 = [&](auto t) requires False<decltype(t)> { return t; };
  auto g6 = [&](int t) requires False<int> { return t; }; // { dg-error "non-templated" }
  auto g7 = [&](int t) requires false { return t; };	  // { dg-error "non-templated" }
  g0(0); // { dg-error "no match" }
  g1(0); // { dg-error "no match" }
  g2(0); // { dg-error "no match" }
  g3(0);
  g4(0); // { dg-error "no match" }
  g5(0); // { dg-error "no match" }
  g6(0);
  g7(0);
}

void test2()
{
  auto x = []<IsNotTiny T>(auto a, T t, auto b)
    requires IsNotTiny<decltype(a)> && IsNotLarge<decltype(b)>
    { return a + t + (T)b; };
  x(5LL, 2LL, 1);

  x('0', 2LL, 1LL); // { dg-error "no match" }
  x(5LL, '0', 1LL); // { dg-error "no match" }
  x(5LL, 2LL, 1LL); // { dg-error "no match" }
}

void test3()
{
  auto x = []<IsNotTiny T>(IsNotTiny auto a, T t, IsNotLarge auto b)
    { return a + t + (T)b; };
  x(5LL, 2LL, 1);

  x('0', 2LL, 1LL); // { dg-error "no match" }
  x(5LL, '0', 1LL); // { dg-error "no match" }
  x(5LL, 2LL, 1LL); // { dg-error "no match" }
}

void test4()
{
  auto g = []<C1 T> requires IsNotTiny<T>(T t) -> T
    requires IsNotLarge<decltype(t)> { return t; };
  g(5.5); // { dg-error "no match" }
  g('a'); // { dg-error "no match" }
  g(1LL); // { dg-error "no match" }
}

void test5()
{
  Foo<int> foo1;
  foo1.a(5.5);
  foo1.a(1LL);
  foo1.b<char>(); // { dg-error "no match" }
  foo1.b<long long>()(5); // { dg-error "no match" }

  Foo<double> foo2;
  foo2.a(5.5);
  foo2.a(1LL);
  foo2.b<char>(); // { dg-error "no match" }
  foo2.b<long long>()(5); // { dg-error "no match" }
}

using Func = int(*)(int);

void test6()
{
  Func f1 = [](int a) requires false { return a; }; // { dg-error "non-templated" }
  Func f2 = [](auto a) requires false { return a; }; // { dg-error "cannot convert" }
}