annotate gcc/testsuite/g++.dg/cpp2a/concepts-fn1.C @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1 // { dg-do compile { target c++2a } }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3 template<typename T>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
4 concept Type = true;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
5
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
6 template<typename T>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
7 concept False = false;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
8
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
9 template<typename T>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
10 concept Class = __is_class(T);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
11
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
12 template<typename T>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
13 concept EmptyClass = Class<T> && __is_empty(T);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
14
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
15 template<typename T, typename U>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
16 concept Classes = __is_class(T) && __is_class (U);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
17
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
18 struct empty { };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
19
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
20 struct nonempty { int n; };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
21
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
22 static_assert(Type<int>);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
23 static_assert(False<int>); // { dg-error "static assertion failed" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
24
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
25 // Basic checks
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
26
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
27 template<typename T>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
28 requires Type<T>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
29 int fn1(T t) { return 0; }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
30
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
31 template<typename T>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
32 requires False<T>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
33 int fn2(T t) { return 0; }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
34
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
35 void driver()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
36 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
37 fn1(0); // OK
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
38 fn2(0); // { dg-error "" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
39 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
40
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
41 // Ordering
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
42
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
43 template<typename T>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
44 concept Cf = requires (T t) { t.f(); };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
45
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
46 template<typename T>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
47 concept Cfg = Cf<T> && requires (T t) { t.g(); };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
48
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
49 template<typename T>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
50 concept Cf2 = requires (T t) { t.f(); };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
51
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
52 template<typename T>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
53 constexpr int algo(T t) { return 0; }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
54
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
55 template<typename T> requires Cf<T>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
56 constexpr int algo(T t) { return 1; }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
57
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
58 template<typename T> requires Cfg<T>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
59 constexpr int algo(T t) { return 2; }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
60
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
61 template<typename T> requires Cf<T>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
62 constexpr int ambig(T t) { return 1; }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
63
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
64 template<typename T> requires Cf2<T>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
65 constexpr int ambig(T t) { return 1; }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
66
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
67 struct T1 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
68 void f() { }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
69 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
70
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
71 struct T2 : T1 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
72 void g() { }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
73 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
74
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
75 void driver_0()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
76 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
77 T1 x;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
78 T2 y;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
79 static_assert(algo(0) == 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
80 static_assert(algo(x) == 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
81 static_assert(algo(y) == 2);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
82 ambig(x); // { dg-error "call of overload | is ambiguous" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
83 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
84
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
85 template<typename T>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
86 struct S
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
87 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
88 void f() requires Class<T> { }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
89
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
90 template<typename U>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
91 struct Inner
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
92 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
93 void g() requires Classes<T, U> { }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
94 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
95
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
96 template<typename U> requires Classes<T, U> void h(U) { }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
97 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
98
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
99 struct X { };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
100
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
101 void driver_1()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
102 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
103 S<X> s1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
104 s1.f(); // OK
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
105 s1.h(s1); // OK
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
106 s1.h(0); // { dg-error "no matching function" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
107
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
108 S<int> s2;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
109 s2.f(); // { dg-error "no matching function" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
110
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
111 S<X>::Inner<X> si1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
112 si1.g();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
113
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
114 S<X>::Inner<int> si2;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
115 si2.g(); // { dg-error "no matching function" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
116 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
117
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
118 // Check constraints on non-dependent arguments, even when in a
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
119 // dependent context.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
120
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
121 template<typename T> requires Class<T> void f1(T x) { }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
122
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
123 // fn1-2.C -- Dependent checks
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
124 template<typename T>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
125 void caller_1(T x)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
126 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
127 f1(x); // Unchecked dependent arg.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
128 f1(empty{}); // Checked non-dependent arg, but OK
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
129 f1(0); // { dg-error "" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
130 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
131
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
132 // fn3.c -- Ordering
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
133 template<typename T>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
134 requires Class<T>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
135 constexpr int f2(T x) { return 1; }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
136
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
137 template<typename T>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
138 requires EmptyClass<T>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
139 constexpr int f2(T x) { return 2; }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
140
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
141 template<typename T>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
142 constexpr int f3(T x) requires Class<T> { return 1; }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
143
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
144 template<typename T>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
145 constexpr int f3(T x) requires EmptyClass<T> { return 2; }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
146
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
147 void driver_2()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
148 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
149 f2(0); // { dg-error "no matching function" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
150 static_assert (f2(empty{}) == 2);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
151 static_assert (f2(nonempty{}) == 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
152 f3(0); // { dg-error "no matching function" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
153 static_assert (f3(empty{}) == 2);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
154 static_assert (f3(nonempty{}) == 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
155 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
156
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
157 // fn8.C -- Address of overloaded functions
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
158 template<typename T> requires Type<T> void ok(T) { }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
159 template<typename T> requires Class<T> void err(T) { }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
160
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
161 auto p1 = &ok<int>;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
162 auto p2 = &err<int>; // { dg-error "" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
163 void (*p3)(int) = &ok<int>;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
164 void (*p4)(int) = &err<int>; // { dg-error "no matches" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
165 void (*p5)(int) = &ok;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
166 void (*p6)(int) = &err; // { dg-error "no matches" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
167
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
168 template<typename T> void g(T x) { }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
169
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
170 void driver_3 ()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
171 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
172 g(&ok<int>);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
173 g(&err<int>); // { dg-error "no matches" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
174 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
175
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
176
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
177 struct S2 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
178 template<typename T> requires Type<T> int ok(T) { return 0; }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
179 template<typename T> requires Class<T> int err(T) { return 0; }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
180 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
181
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
182 auto p7 = &S2::ok<int>;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
183 auto p8 = &S2::err<int>; // { dg-error "" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
184 int (S2::*p9)(int) = &S2::ok<int>;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
185 int (S2::*p10)(int) = &S2::err<int>; // { dg-error "no matches" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
186 int (S2::*p11)(int) = &S2::ok;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
187 int (S2::*p12)(int) = &S2::err; // { dg-error "no matches" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
188
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
189 // fn9.C -- Ordering with function address
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
190 template<typename T>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
191 requires Class<T>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
192 constexpr int fn(T) { return 1; }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
193
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
194 template<typename T>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
195 requires EmptyClass<T>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
196 constexpr int fn(T) { return 2; }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
197
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
198 struct S3
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
199 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
200 template<typename T>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
201 requires Class<T>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
202 constexpr int fn(T) const { return 1; }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
203
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
204 template<typename T>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
205 requires EmptyClass<T>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
206 constexpr int fn(T) const { return 2; }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
207 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
208
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
209 void driver_5 () {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
210 struct X { };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
211 struct Y { X x; };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
212
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
213 constexpr X x;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
214 constexpr Y y;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
215 constexpr S3 s;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
216
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
217 constexpr auto p1 = &fn<X>; // Empty f
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
218 static_assert (p1(x) == 2);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
219
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
220 constexpr auto p2 = &fn<Y>; // Class f
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
221 static_assert(p2(y) == 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
222
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
223 constexpr auto p3 = &S3::fn<X>; // Empty f
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
224 static_assert((s.*p3)(x) == 2);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
225
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
226 constexpr auto p4 = &S3::fn<Y>; // Empty f
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
227 static_assert((s.*p4)(y) == 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
228 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
229
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
230
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
231 // Redeclarations
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
232
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
233 // FIXME: This should be a diagnosable error. The programmer has moved
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
234 // the requirements from the template-head to the declarator.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
235 template<typename T> requires Type<T> void f3();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
236 template<typename T> void f3() requires Type<T>;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
237
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
238 void driver_4()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
239 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
240 f3<int>(); // { dg-error "call of overload | ambiguous" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
241 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
242
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
243 template<template<typename T> requires true class X> void f4();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
244 template<template<typename T> class X> void f4(); // OK: different declarations
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
245
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
246 template<typename T> requires Type<T> void def() { }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
247 template<typename T> requires Type<T> void def() { } // { dg-error "redefinition" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
248