annotate gcc/testsuite/g++.dg/template/sfinae8.C @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 // DR 339
kono
parents:
diff changeset
2 //
kono
parents:
diff changeset
3 // Test of the use of various boolean binary operators with SFINAE
kono
parents:
diff changeset
4
kono
parents:
diff changeset
5 // Boilerplate helpers
kono
parents:
diff changeset
6 typedef char yes_type;
kono
parents:
diff changeset
7 struct no_type { char data[2]; };
kono
parents:
diff changeset
8
kono
parents:
diff changeset
9 template<typename T> T create_a();
kono
parents:
diff changeset
10 template<typename T> struct type { };
kono
parents:
diff changeset
11
kono
parents:
diff changeset
12 template<bool, typename T = void> struct enable_if { typedef T type; };
kono
parents:
diff changeset
13 template<typename T> struct enable_if<false, T> { };
kono
parents:
diff changeset
14
kono
parents:
diff changeset
15 #define JOIN( X, Y ) DO_JOIN( X, Y )
kono
parents:
diff changeset
16 #define DO_JOIN( X, Y ) DO_JOIN2(X,Y)
kono
parents:
diff changeset
17 #define DO_JOIN2( X, Y ) X##Y
kono
parents:
diff changeset
18
kono
parents:
diff changeset
19 bool accepts_bool(bool);
kono
parents:
diff changeset
20
kono
parents:
diff changeset
21 #define DEFINE_BINARY_PREDICATE_TRAIT(Name,Op) \
kono
parents:
diff changeset
22 template<typename T, typename U> \
kono
parents:
diff changeset
23 typename enable_if<sizeof(accepts_bool(create_a<T>() Op create_a<U>())), \
kono
parents:
diff changeset
24 yes_type>::type \
kono
parents:
diff changeset
25 JOIN(check_,Name)(type<T>, type<U>); \
kono
parents:
diff changeset
26 \
kono
parents:
diff changeset
27 no_type JOIN(check_,Name)(...); \
kono
parents:
diff changeset
28 \
kono
parents:
diff changeset
29 template<typename T, typename U = T> \
kono
parents:
diff changeset
30 struct Name \
kono
parents:
diff changeset
31 { \
kono
parents:
diff changeset
32 static const bool value = \
kono
parents:
diff changeset
33 (sizeof(JOIN(check_,Name)(type<T>(), type<U>())) == sizeof(yes_type)); \
kono
parents:
diff changeset
34 }
kono
parents:
diff changeset
35
kono
parents:
diff changeset
36 #ifdef __GXX_EXPERIMENTAL_CXX0X__
kono
parents:
diff changeset
37 # define STATIC_ASSERT(Expr) static_assert(Expr, #Expr)
kono
parents:
diff changeset
38 #else
kono
parents:
diff changeset
39 # define STATIC_ASSERT(Expr) int JOIN(a,__LINE__)[Expr? 1 : -1]
kono
parents:
diff changeset
40 #endif
kono
parents:
diff changeset
41
kono
parents:
diff changeset
42 struct X { };
kono
parents:
diff changeset
43 struct Y { };
kono
parents:
diff changeset
44
kono
parents:
diff changeset
45 struct convertible_to_bool {
kono
parents:
diff changeset
46 operator int convertible_to_bool::* ();
kono
parents:
diff changeset
47 };
kono
parents:
diff changeset
48
kono
parents:
diff changeset
49 struct not_convertible_to_bool { };
kono
parents:
diff changeset
50
kono
parents:
diff changeset
51 // is_less_than_comparable
kono
parents:
diff changeset
52 DEFINE_BINARY_PREDICATE_TRAIT(is_less_than_comparable,<);
kono
parents:
diff changeset
53 bool operator<(X, X);
kono
parents:
diff changeset
54 convertible_to_bool operator<(X, Y);
kono
parents:
diff changeset
55 not_convertible_to_bool operator<(Y, X);
kono
parents:
diff changeset
56
kono
parents:
diff changeset
57 STATIC_ASSERT((is_less_than_comparable<int>::value));
kono
parents:
diff changeset
58 STATIC_ASSERT((is_less_than_comparable<int, long>::value));
kono
parents:
diff changeset
59 STATIC_ASSERT((is_less_than_comparable<int*>::value));
kono
parents:
diff changeset
60 STATIC_ASSERT((is_less_than_comparable<X>::value));
kono
parents:
diff changeset
61 STATIC_ASSERT((is_less_than_comparable<X, Y>::value));
kono
parents:
diff changeset
62 STATIC_ASSERT((!is_less_than_comparable<Y, X>::value));
kono
parents:
diff changeset
63 STATIC_ASSERT((!is_less_than_comparable<Y>::value));
kono
parents:
diff changeset
64
kono
parents:
diff changeset
65 // is_less_equal_comparable
kono
parents:
diff changeset
66 DEFINE_BINARY_PREDICATE_TRAIT(is_less_equal_comparable,<=);
kono
parents:
diff changeset
67 bool operator<=(X, X);
kono
parents:
diff changeset
68 convertible_to_bool operator<=(X, Y);
kono
parents:
diff changeset
69 not_convertible_to_bool operator<=(Y, X);
kono
parents:
diff changeset
70
kono
parents:
diff changeset
71 STATIC_ASSERT((is_less_equal_comparable<int>::value));
kono
parents:
diff changeset
72 STATIC_ASSERT((is_less_equal_comparable<int, long>::value));
kono
parents:
diff changeset
73 STATIC_ASSERT((is_less_equal_comparable<int*>::value));
kono
parents:
diff changeset
74 STATIC_ASSERT((is_less_equal_comparable<X>::value));
kono
parents:
diff changeset
75 STATIC_ASSERT((is_less_equal_comparable<X, Y>::value));
kono
parents:
diff changeset
76 STATIC_ASSERT((!is_less_equal_comparable<Y, X>::value));
kono
parents:
diff changeset
77 STATIC_ASSERT((!is_less_equal_comparable<Y>::value));
kono
parents:
diff changeset
78
kono
parents:
diff changeset
79 // is_greater_than_comparable
kono
parents:
diff changeset
80 DEFINE_BINARY_PREDICATE_TRAIT(is_greater_than_comparable,>);
kono
parents:
diff changeset
81 bool operator>(X, X);
kono
parents:
diff changeset
82 convertible_to_bool operator>(X, Y);
kono
parents:
diff changeset
83 not_convertible_to_bool operator>(Y, X);
kono
parents:
diff changeset
84
kono
parents:
diff changeset
85 STATIC_ASSERT((is_greater_than_comparable<int>::value));
kono
parents:
diff changeset
86 STATIC_ASSERT((is_greater_than_comparable<int, long>::value));
kono
parents:
diff changeset
87 STATIC_ASSERT((is_greater_than_comparable<int*>::value));
kono
parents:
diff changeset
88 STATIC_ASSERT((is_greater_than_comparable<X>::value));
kono
parents:
diff changeset
89 STATIC_ASSERT((is_greater_than_comparable<X, Y>::value));
kono
parents:
diff changeset
90 STATIC_ASSERT((!is_greater_than_comparable<Y, X>::value));
kono
parents:
diff changeset
91 STATIC_ASSERT((!is_greater_than_comparable<Y>::value));
kono
parents:
diff changeset
92
kono
parents:
diff changeset
93 // is_greater_equal_comparable
kono
parents:
diff changeset
94 DEFINE_BINARY_PREDICATE_TRAIT(is_greater_equal_comparable,>=);
kono
parents:
diff changeset
95 bool operator>=(X, X);
kono
parents:
diff changeset
96 convertible_to_bool operator>=(X, Y);
kono
parents:
diff changeset
97 not_convertible_to_bool operator>=(Y, X);
kono
parents:
diff changeset
98
kono
parents:
diff changeset
99 STATIC_ASSERT((is_greater_equal_comparable<int>::value));
kono
parents:
diff changeset
100 STATIC_ASSERT((is_greater_equal_comparable<int, long>::value));
kono
parents:
diff changeset
101 STATIC_ASSERT((is_greater_equal_comparable<int*>::value));
kono
parents:
diff changeset
102 STATIC_ASSERT((is_greater_equal_comparable<X>::value));
kono
parents:
diff changeset
103 STATIC_ASSERT((is_greater_equal_comparable<X, Y>::value));
kono
parents:
diff changeset
104 STATIC_ASSERT((!is_greater_equal_comparable<Y, X>::value));
kono
parents:
diff changeset
105 STATIC_ASSERT((!is_greater_equal_comparable<Y>::value));
kono
parents:
diff changeset
106
kono
parents:
diff changeset
107 // is_equality_comparable
kono
parents:
diff changeset
108 struct Z : X { };
kono
parents:
diff changeset
109 DEFINE_BINARY_PREDICATE_TRAIT(is_equality_comparable,==);
kono
parents:
diff changeset
110 bool operator==(X, X);
kono
parents:
diff changeset
111 convertible_to_bool operator==(X, Y);
kono
parents:
diff changeset
112 not_convertible_to_bool operator==(Y, X);
kono
parents:
diff changeset
113
kono
parents:
diff changeset
114 STATIC_ASSERT((is_equality_comparable<int>::value));
kono
parents:
diff changeset
115 STATIC_ASSERT((is_equality_comparable<int, long>::value));
kono
parents:
diff changeset
116 STATIC_ASSERT((is_equality_comparable<int*>::value));
kono
parents:
diff changeset
117 STATIC_ASSERT((is_equality_comparable<X>::value));
kono
parents:
diff changeset
118 STATIC_ASSERT((is_equality_comparable<X, Y>::value));
kono
parents:
diff changeset
119 STATIC_ASSERT((!is_equality_comparable<Y, X>::value));
kono
parents:
diff changeset
120 STATIC_ASSERT((!is_equality_comparable<Y>::value));
kono
parents:
diff changeset
121 STATIC_ASSERT((is_equality_comparable<int X::*>::value));
kono
parents:
diff changeset
122 STATIC_ASSERT((!is_equality_comparable<int X::*, int Y::*>::value));
kono
parents:
diff changeset
123 STATIC_ASSERT((!is_equality_comparable<int*, float*>::value));
kono
parents:
diff changeset
124 STATIC_ASSERT((is_equality_comparable<X*, Z*>::value));
kono
parents:
diff changeset
125 STATIC_ASSERT((!is_equality_comparable<X*, Y*>::value));
kono
parents:
diff changeset
126
kono
parents:
diff changeset
127 // is_not_equal_comparable
kono
parents:
diff changeset
128 DEFINE_BINARY_PREDICATE_TRAIT(is_not_equal_comparable,!=);
kono
parents:
diff changeset
129 bool operator!=(X, X);
kono
parents:
diff changeset
130 convertible_to_bool operator!=(X, Y);
kono
parents:
diff changeset
131 not_convertible_to_bool operator!=(Y, X);
kono
parents:
diff changeset
132
kono
parents:
diff changeset
133 STATIC_ASSERT((is_not_equal_comparable<int>::value));
kono
parents:
diff changeset
134 STATIC_ASSERT((is_not_equal_comparable<int, long>::value));
kono
parents:
diff changeset
135 STATIC_ASSERT((is_not_equal_comparable<int*>::value));
kono
parents:
diff changeset
136 STATIC_ASSERT((is_not_equal_comparable<X>::value));
kono
parents:
diff changeset
137 STATIC_ASSERT((is_not_equal_comparable<X, Y>::value));
kono
parents:
diff changeset
138 STATIC_ASSERT((!is_not_equal_comparable<Y, X>::value));
kono
parents:
diff changeset
139 STATIC_ASSERT((!is_not_equal_comparable<Y>::value));
kono
parents:
diff changeset
140 STATIC_ASSERT((is_not_equal_comparable<int X::*>::value));
kono
parents:
diff changeset
141 STATIC_ASSERT((!is_not_equal_comparable<int X::*, int Y::*>::value));
kono
parents:
diff changeset
142 STATIC_ASSERT((!is_not_equal_comparable<int*, float*>::value));
kono
parents:
diff changeset
143 STATIC_ASSERT((is_not_equal_comparable<X*, Z*>::value));
kono
parents:
diff changeset
144 STATIC_ASSERT((!is_not_equal_comparable<X*, Y*>::value));
kono
parents:
diff changeset
145
kono
parents:
diff changeset
146 // has_logical_and
kono
parents:
diff changeset
147 DEFINE_BINARY_PREDICATE_TRAIT(has_logical_and,&&);
kono
parents:
diff changeset
148 bool operator&&(X, X);
kono
parents:
diff changeset
149 convertible_to_bool operator&&(X, Y);
kono
parents:
diff changeset
150 not_convertible_to_bool operator&&(Y, X);
kono
parents:
diff changeset
151
kono
parents:
diff changeset
152 STATIC_ASSERT((has_logical_and<int>::value));
kono
parents:
diff changeset
153 STATIC_ASSERT((has_logical_and<int, long>::value));
kono
parents:
diff changeset
154 STATIC_ASSERT((has_logical_and<int*>::value));
kono
parents:
diff changeset
155 STATIC_ASSERT((has_logical_and<X>::value));
kono
parents:
diff changeset
156 STATIC_ASSERT((has_logical_and<X, Y>::value));
kono
parents:
diff changeset
157 STATIC_ASSERT((!has_logical_and<Y, X>::value));
kono
parents:
diff changeset
158 STATIC_ASSERT((!has_logical_and<Y>::value));
kono
parents:
diff changeset
159 STATIC_ASSERT((has_logical_and<int X::*>::value));
kono
parents:
diff changeset
160 STATIC_ASSERT((has_logical_and<int X::*, int Y::*>::value));
kono
parents:
diff changeset
161 STATIC_ASSERT((has_logical_and<int*, float*>::value));
kono
parents:
diff changeset
162 STATIC_ASSERT((has_logical_and<X*, Z*>::value));
kono
parents:
diff changeset
163 STATIC_ASSERT((has_logical_and<X*, Y*>::value));
kono
parents:
diff changeset
164
kono
parents:
diff changeset
165 // has_logical_or
kono
parents:
diff changeset
166 DEFINE_BINARY_PREDICATE_TRAIT(has_logical_or,||);
kono
parents:
diff changeset
167 bool operator||(X, X);
kono
parents:
diff changeset
168 convertible_to_bool operator||(X, Y);
kono
parents:
diff changeset
169 not_convertible_to_bool operator||(Y, X);
kono
parents:
diff changeset
170
kono
parents:
diff changeset
171 STATIC_ASSERT((has_logical_or<int>::value));
kono
parents:
diff changeset
172 STATIC_ASSERT((has_logical_or<int, long>::value));
kono
parents:
diff changeset
173 STATIC_ASSERT((has_logical_or<int*>::value));
kono
parents:
diff changeset
174 STATIC_ASSERT((has_logical_or<X>::value));
kono
parents:
diff changeset
175 STATIC_ASSERT((has_logical_or<X, Y>::value));
kono
parents:
diff changeset
176 STATIC_ASSERT((!has_logical_or<Y, X>::value));
kono
parents:
diff changeset
177 STATIC_ASSERT((!has_logical_or<Y>::value));
kono
parents:
diff changeset
178 STATIC_ASSERT((has_logical_or<int X::*>::value));
kono
parents:
diff changeset
179 STATIC_ASSERT((has_logical_or<int X::*, int Y::*>::value));
kono
parents:
diff changeset
180 STATIC_ASSERT((has_logical_or<int*, float*>::value));
kono
parents:
diff changeset
181 STATIC_ASSERT((has_logical_or<X*, Z*>::value));
kono
parents:
diff changeset
182 STATIC_ASSERT((has_logical_or<X*, Y*>::value));