2 // { dg-options "-std=c++17 -fconcepts" }
7 concept bool C() { return __is_class(T); }
10 concept bool D() { return __is_empty(T); }
13 struct Y { int n; } y;
17 // Test constrained member definitions
20 void f1() requires C<T>() { }
22 void f2() requires C<T>() { called = 1; }
23 void f2() requires not C<T>() { called = 2; }
25 void f3() { called = 1; }
26 void f3() requires C<T>() { called = 2; }
27 void f3() requires C<T>() and D<T>() { called = 3; }
29 void g1() requires C<T>() and true;
31 void g2() requires C<T>();
32 void g2() requires not C<T>();
35 void g3() requires C<T>();
36 void g3() requires C<T>() and D<T>();
38 template<C U> void h1(U u) { called = 1; }
39 template<C U> void h2(U u);
40 template<C U> void h3(U u) requires D<U>();
45 void f(T) requires D<T>();
56 sx.f2(); assert(called == 1);
57 sx.f3(); assert(called == 3);
60 sy.f2(); assert(called == 1);
61 sy.f3(); assert(called == 2);
63 si.f2(); assert(called == 2);
64 si.f3(); assert(called == 1);
66 // Member function template tests
68 s1i.h1(x); assert(called == 1);
69 s1i.h2(x); assert(called == 2);
70 s1i.h3(x); assert(called == 3);
72 // Defined out of class.
74 sx.g2(); assert(called == 1);
75 sx.g3(); assert(called == 3);
78 sy.g2(); assert(called == 1);
79 sy.g3(); assert(called == 2);
81 si.g2(); assert(called == 2);
82 si.g3(); assert(called == 1);
86 void S1<T>::g1() requires C<T>() and true { }
89 void S1<T>::g2() requires C<T>() { called = 1; }
92 void S1<T>::g2() requires not C<T>() { called = 2; }
95 void S1<T>::g3() { called = 1; }
98 void S1<T>::g3() requires C<T>() { called = 2; }
101 void S1<T>::g3() requires C<T>() and D<T>() { called = 3; }
105 void S1<T>::h2(U u) { called = 2; }
109 void S1<T>::h3(U u) requires D<U>() { called = 3; }
112 void S2<T>::f(T t) requires D<T>() { called = 4; }