* auto-profile.c (afdo_annotate_cfg): Use update_max_bb_count.
[official-gcc.git] / gcc / testsuite / g++.dg / concepts / memfun.C
blobd387234312a9aedd5e93801d93defe252d3b993d
1 // { dg-do run}
2 // { dg-options "-std=c++17 -fconcepts" }
4 #include <cassert>
6 template<typename T>
7   concept bool C() { return __is_class(T); }
9 template<typename T>
10   concept bool D() { return __is_empty(T); }
12 struct X { } x;
13 struct Y { int n; } y;
15 int called = 0;
17 // Test constrained member definitions
18 template<typename T>
19   struct S1 {
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>();
34     void g3();
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>();
41   };
43 template<C T>
44   struct S2 {
45     void f(T) requires D<T>();
46   };
49 int main() {
50   S1<X> sx;
51   S1<Y> sy;
52   S1<int> si;
54   // Defined in-class
55   sx.f1();
56   sx.f2(); assert(called == 1);
57   sx.f3(); assert(called == 3);
59   sy.f1();
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
67   S1<int> s1i;
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.
73   sx.g1();
74   sx.g2(); assert(called == 1);
75   sx.g3(); assert(called == 3);
77   sy.g1();
78   sy.g2(); assert(called == 1);
79   sy.g3(); assert(called == 2);
81   si.g2(); assert(called == 2);
82   si.g3(); assert(called == 1);
85 template<typename T>
86   void S1<T>::g1() requires C<T>() and true { }
88 template<typename T>
89   void S1<T>::g2() requires C<T>() { called = 1; }
91 template<typename T>
92   void S1<T>::g2() requires not C<T>() { called = 2; }
94 template<typename T>
95   void S1<T>::g3() { called = 1; }
97 template<typename T>
98   void S1<T>::g3() requires C<T>() { called = 2; }
100 template<typename T>
101   void S1<T>::g3() requires C<T>() and D<T>() { called = 3; }
103 template<typename T>
104   template<C U>
105     void S1<T>::h2(U u) { called = 2; }
107 template<typename T>
108   template<C U>
109       void S1<T>::h3(U u) requires D<U>() { called = 3; }
111 template<C T>
112   void S2<T>::f(T t) requires D<T>() { called = 4; }