Mercurial > hg > CbC > CbC_gcc
comparison gcc/testsuite/g++.dg/concepts/memfun.C @ 111:04ced10e8804
gcc 7
author | kono |
---|---|
date | Fri, 27 Oct 2017 22:46:09 +0900 |
parents | |
children | 84e7813d76e9 |
comparison
equal
deleted
inserted
replaced
68:561a7518be6b | 111:04ced10e8804 |
---|---|
1 // { dg-do run} | |
2 // { dg-options "-std=c++17 -fconcepts" } | |
3 | |
4 #include <cassert> | |
5 | |
6 template<typename T> | |
7 concept bool C() { return __is_class(T); } | |
8 | |
9 template<typename T> | |
10 concept bool D() { return __is_empty(T); } | |
11 | |
12 struct X { } x; | |
13 struct Y { int n; } y; | |
14 | |
15 int called = 0; | |
16 | |
17 // Test constrained member definitions | |
18 template<typename T> | |
19 struct S1 { | |
20 void f1() requires C<T>() { } | |
21 | |
22 void f2() requires C<T>() { called = 1; } | |
23 void f2() requires not C<T>() { called = 2; } | |
24 | |
25 void f3() { called = 1; } | |
26 void f3() requires C<T>() { called = 2; } | |
27 void f3() requires C<T>() and D<T>() { called = 3; } | |
28 | |
29 void g1() requires C<T>() and true; | |
30 | |
31 void g2() requires C<T>(); | |
32 void g2() requires not C<T>(); | |
33 | |
34 void g3(); | |
35 void g3() requires C<T>(); | |
36 void g3() requires C<T>() and D<T>(); | |
37 | |
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 }; | |
42 | |
43 template<C T> | |
44 struct S2 { | |
45 void f(T) requires D<T>(); | |
46 }; | |
47 | |
48 | |
49 int main() { | |
50 S1<X> sx; | |
51 S1<Y> sy; | |
52 S1<int> si; | |
53 | |
54 // Defined in-class | |
55 sx.f1(); | |
56 sx.f2(); assert(called == 1); | |
57 sx.f3(); assert(called == 3); | |
58 | |
59 sy.f1(); | |
60 sy.f2(); assert(called == 1); | |
61 sy.f3(); assert(called == 2); | |
62 | |
63 si.f2(); assert(called == 2); | |
64 si.f3(); assert(called == 1); | |
65 | |
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); | |
71 | |
72 // Defined out of class. | |
73 sx.g1(); | |
74 sx.g2(); assert(called == 1); | |
75 sx.g3(); assert(called == 3); | |
76 | |
77 sy.g1(); | |
78 sy.g2(); assert(called == 1); | |
79 sy.g3(); assert(called == 2); | |
80 | |
81 si.g2(); assert(called == 2); | |
82 si.g3(); assert(called == 1); | |
83 } | |
84 | |
85 template<typename T> | |
86 void S1<T>::g1() requires C<T>() and true { } | |
87 | |
88 template<typename T> | |
89 void S1<T>::g2() requires C<T>() { called = 1; } | |
90 | |
91 template<typename T> | |
92 void S1<T>::g2() requires not C<T>() { called = 2; } | |
93 | |
94 template<typename T> | |
95 void S1<T>::g3() { called = 1; } | |
96 | |
97 template<typename T> | |
98 void S1<T>::g3() requires C<T>() { called = 2; } | |
99 | |
100 template<typename T> | |
101 void S1<T>::g3() requires C<T>() and D<T>() { called = 3; } | |
102 | |
103 template<typename T> | |
104 template<C U> | |
105 void S1<T>::h2(U u) { called = 2; } | |
106 | |
107 template<typename T> | |
108 template<C U> | |
109 void S1<T>::h3(U u) requires D<U>() { called = 3; } | |
110 | |
111 template<C T> | |
112 void S2<T>::f(T t) requires D<T>() { called = 4; } |