Ne.app NeANT
The Ne.app NeANT User module of the NeANT distribution.
20.meta.rel.cpp
Go to the documentation of this file.
1// -*- C++ -*-
2
30#include <type_traits>
31
32#include <rw_driver.h>
33#include <rw/_defs.h>
34
35// compile out all test code if extensions disabled
36#ifndef _RWSTD_NO_EXT_CXX_0X
37
38
40enum enum_A { E_a = 0 };
41enum enum_B { E_b = 0 };
42
43struct struct_A {
44 int i_; float f_;
45};
46
47struct struct_AA {
48 int i_; float f_;
49};
50
51class class_B {
52 int i_; float f_;
53};
54
55class class_BB {
56 int i_; float f_;
57};
58
60{
61 operator struct_A ();
62};
63
65{
67};
68
69template <class T>
70struct derived_t : T
71{
72};
73
74template <class T>
75struct derived_private_t : private T
76{
77};
78
79template <class T>
80struct derived_protected_t : protected T
81{
82};
83
84template <class T>
86{
88};
89
90class incomplete_t;
91
92union union_C {
93 int i_; float f_;
94};
95
96union union_CC {
97 int i_; float f_;
98};
99
100
102void test_trait (int line, bool value, bool expect,
103 const char* trait, const char* typeT, const char* typeU)
104{
105 rw_assert (value == expect, 0, line,
106 "%s<%s, %s>::type is%{?}n't%{;} %b as expected",
107 trait, typeT, typeU, value != expect, expect);
108}
109
110#define TEST(Trait,TypeT,TypeU,Expect) \
111 { const bool value = Trait< TypeT, TypeU >::value; \
112 test_trait (__LINE__, value, Expect, #Trait, #TypeT, #TypeU); \
113 } typedef void __dummy
114
115static void test_is_same ()
116{
117 TEST (std::is_same, bool, bool, true);
118 TEST (std::is_same, char, char, true);
119 TEST (std::is_same, short, short, true);
120 TEST (std::is_same, int, int, true);
121 TEST (std::is_same, long, long, true);
122 TEST (std::is_same, float, float, true);
123 TEST (std::is_same, double, double, true);
124
125 TEST (std::is_same, enum_A, enum_A, true);
126 TEST (std::is_same, enum_B, enum_B, true);
127
128 TEST (std::is_same, struct_A, struct_A, true);
129
130 typedef derived_t<struct_A> derived_A;
131 TEST (std::is_same, derived_A, derived_A, true);
132
133 TEST (std::is_same, class_B, class_B, true);
134
135 typedef derived_t<class_B> derived_B;
136 TEST (std::is_same, derived_B, derived_B, true);
137
138 // other combinations should fail
139 TEST (std::is_same, signed char, char, false);
140 TEST (std::is_same, char, signed char, false);
141 TEST (std::is_same, unsigned char, char, false);
142 TEST (std::is_same, char, unsigned char, false);
143
144 TEST (std::is_same, signed char, unsigned char, false);
145 TEST (std::is_same, unsigned char, signed char, false);
146 TEST (std::is_same, signed short, unsigned short, false);
147 TEST (std::is_same, unsigned short, signed short, false);
148 TEST (std::is_same, signed int, unsigned int, false);
149 TEST (std::is_same, unsigned int, signed int, false);
150 TEST (std::is_same, signed long, unsigned long, false);
151 TEST (std::is_same, unsigned long, signed long, false);
152
153 TEST (std::is_same, long, const long, false);
154 TEST (std::is_same, const long, long, false);
155
156 TEST (std::is_same, long, volatile long, false);
157 TEST (std::is_same, volatile long, long, false);
158
159 TEST (std::is_same, long, const volatile long, false);
160 TEST (std::is_same, const volatile long, long, false);
161
162 TEST (std::is_same, enum_A, char, false);
163 TEST (std::is_same, enum_A, short, false);
164 TEST (std::is_same, enum_A, int, false);
165 TEST (std::is_same, enum_A, long, false);
166
167 TEST (std::is_same, enum_A, unsigned char, false);
168 TEST (std::is_same, enum_A, unsigned short, false);
169 TEST (std::is_same, enum_A, unsigned int, false);
170 TEST (std::is_same, enum_A, unsigned long, false);
171
172 TEST (std::is_same, struct_A, derived_t<struct_A>, false);
173 TEST (std::is_same, class_B, derived_t<class_B>, false);
174
175 TEST (std::is_same, int[], int*, false);
176 TEST (std::is_same, int*, int[], false);
177}
178
179#define TEST(Trait,TypeT,TypeU,Expect) \
180 { const bool value = Trait< TypeT, TypeU >::value; \
181 test_trait (__LINE__, value, Expect, #Trait, #TypeT, #TypeU); \
182 } typedef void __dummy
183
184static void test_is_base_of ()
185{
186 TEST (std::is_base_of, bool, bool, false);
187 TEST (std::is_base_of, char, char, false);
188 TEST (std::is_base_of, short, short, false);
189 TEST (std::is_base_of, int, int, false);
190 TEST (std::is_base_of, long, long, false);
191 TEST (std::is_base_of, float, float, false);
192 TEST (std::is_base_of, double, double, false);
193
194 TEST (std::is_base_of, enum_A, enum_A, false);
195 TEST (std::is_base_of, enum_B, enum_B, false);
196
197 TEST (std::is_base_of, struct_A, struct_A, true);
198 TEST (std::is_base_of, derived_t<struct_A>,
199 derived_t<struct_A>, true);
200
201 TEST (std::is_base_of, class_B, class_B, true);
202 TEST (std::is_base_of, derived_t<class_B>,
203 derived_t<class_B>, true);
204
205#if defined (_RWSTD_TT_IS_BASE_OF) \
206 || defined (_RWSTD_TT_IS_CLASS) \
207 || defined (_RWSTD_TT_IS_UNION)
208 // without one of the above, we can't reliably implement
209 // this trait for union type
210 TEST (std::is_base_of, union_C, union_C, false);
211#else
212 rw_warn (0, 0, __LINE__,
213 "portions of test_is_base_of() have been disabled due "
214 "to lack of compiler support.");
215#endif
216
217 // public inheritance
218 TEST (std::is_base_of, struct_A, derived_t<struct_A>, true);
219 TEST (std::is_base_of, class_B, derived_t<class_B>, true);
220
221#if defined (__SUNPRO_CC) && (__SUNPRO_CC <= 0x590)
222
223 // for some reason the trick used to detect private and protected
224 // inheritance doesn't work on sunpro-5.9
225 rw_warn (0, 0, __LINE__,
226 "unable to detect private or protected base classes.");
227
228#else
229 // protected inheritance
230 TEST (std::is_base_of, struct_A, derived_protected_t<struct_A>, true);
231
232 // private inheritance
233 TEST (std::is_base_of, struct_A, derived_private_t<struct_A>, true);
234#endif
235
236 // cv-qualified
237 TEST (std::is_base_of, const struct_A, struct_A, true);
238 TEST (std::is_base_of, struct_A, const struct_A, true);
239 TEST (std::is_base_of, volatile struct_A, struct_A, true);
240 TEST (std::is_base_of, struct_A, volatile struct_A, true);
241 TEST (std::is_base_of, const volatile struct_A, struct_A, true);
242 TEST (std::is_base_of, struct_A, const volatile struct_A, true);
243
244 TEST (std::is_base_of, const struct_A, derived_t<struct_A>, true);
245 TEST (std::is_base_of, struct_A, const derived_t<struct_A>, true);
246 TEST (std::is_base_of, volatile struct_A, derived_t<struct_A>, true);
247 TEST (std::is_base_of, struct_A, volatile derived_t<struct_A>, true);
248 TEST (std::is_base_of, const volatile struct_A, derived_t<struct_A>, true);
249 TEST (std::is_base_of, struct_A, const volatile derived_t<struct_A>, true);
250
251 // other combinations should fail
252 TEST (std::is_base_of, signed char, char, false);
253 TEST (std::is_base_of, char, signed char, false);
254 TEST (std::is_base_of, unsigned char, char, false);
255 TEST (std::is_base_of, char, unsigned char, false);
256
257 TEST (std::is_base_of, signed char, unsigned char, false);
258 TEST (std::is_base_of, unsigned char, signed char, false);
259 TEST (std::is_base_of, signed short, unsigned short, false);
260 TEST (std::is_base_of, unsigned short, signed short, false);
261 TEST (std::is_base_of, signed int, unsigned int, false);
262 TEST (std::is_base_of, unsigned int, signed int, false);
263 TEST (std::is_base_of, signed long, unsigned long, false);
264 TEST (std::is_base_of, unsigned long, signed long, false);
265
266 TEST (std::is_base_of, enum_A, char, false);
267 TEST (std::is_base_of, enum_A, short, false);
268 TEST (std::is_base_of, enum_A, int, false);
269 TEST (std::is_base_of, enum_A, long, false);
270
271 TEST (std::is_base_of, enum_A, unsigned char, false);
272 TEST (std::is_base_of, enum_A, unsigned short, false);
273 TEST (std::is_base_of, enum_A, unsigned int, false);
274 TEST (std::is_base_of, enum_A, unsigned long, false);
275
276 TEST (std::is_base_of, int[], int*, false);
277 TEST (std::is_base_of, int*, int[], false);
278
279 TEST (std::is_base_of, struct_A, class_B, false);
280 TEST (std::is_base_of, class_B, struct_A, false);
281
282 TEST (std::is_base_of, derived_t<struct_A>, struct_A, false);
283 TEST (std::is_base_of, derived_t<class_B>, class_B, false);
284}
285
286static void test_is_convertible ()
287{
288 TEST (std::is_convertible, derived_t<struct_A> , struct_A , true); // slice
289 TEST (std::is_convertible, derived_t<struct_A>*, struct_A*, true);
290 TEST (std::is_convertible, derived_t<struct_A>&, struct_A&, true);
291
292 TEST (std::is_convertible, derived_t<class_B> , class_B , true); // slice
293 TEST (std::is_convertible, derived_t<class_B>*, class_B*, true);
294 TEST (std::is_convertible, derived_t<class_B>&, class_B&, true);
295
296 TEST (std::is_convertible, convertible_to_A, struct_A, true);
297 TEST (std::is_convertible, struct_A, convertible_to_A, false);
298 TEST (std::is_convertible, convertible_to_A*, struct_A*, false);
299 TEST (std::is_convertible, convertible_to_A&, struct_A&, false);
300
301 TEST (std::is_convertible, constructible_from_B, class_B, false);
302 TEST (std::is_convertible, class_B, constructible_from_B, true);
303 TEST (std::is_convertible, class_B*, constructible_from_B*, false);
304 TEST (std::is_convertible, class_B&, constructible_from_B&, false);
305
306 //
307 // pointer to pointer conversions
308 //
309
310 TEST (std::is_convertible, int*, int*, true);
311 TEST (std::is_convertible, const int*, const int*, true);
312 TEST (std::is_convertible, volatile int*, volatile int*, true);
313 TEST (std::is_convertible, const volatile int*, const volatile int*, true);
314
315 // add cv-qualifiers
316 TEST (std::is_convertible, int*, const int*, true);
317 TEST (std::is_convertible, int*, volatile int*, true);
318 TEST (std::is_convertible, int*, const volatile int*, true);
319
320 // strip cv-qualifiers
321 TEST (std::is_convertible, const int*, int*, false);
322 TEST (std::is_convertible, volatile int*, int*, false);
323 TEST (std::is_convertible, const volatile int*, int*, false);
324
325 //
326 // special case void conversions
327 //
328
329 TEST (std::is_convertible, void, void, true);
330 TEST (std::is_convertible, void, long, false);
331 TEST (std::is_convertible, long, void, false);
332
333 //
334 // array to pointer conversions
335 //
336
337 TEST (std::is_convertible, int[], int*, true);
338 TEST (std::is_convertible, const int[], const int*, true);
339 TEST (std::is_convertible, volatile int[], volatile int*, true);
340 TEST (std::is_convertible, const volatile int[], const volatile int*, true);
341
342 // add cv-qualifiers
343 TEST (std::is_convertible, int[], const int*, true);
344 TEST (std::is_convertible, int[], volatile int*, true);
345 TEST (std::is_convertible, int[], const volatile int*, true);
346
347 // strip cv-qualifiers
348 TEST (std::is_convertible, const int[], int*, false);
349 TEST (std::is_convertible, volatile int[], int*, false);
350 TEST (std::is_convertible, const volatile int[], int*, false);
351
352 //
353 // pointer to array conversions should all fail
354 //
355
356 TEST (std::is_convertible, int*, int[], false);
357 TEST (std::is_convertible, const int*, const int[], false);
358 TEST (std::is_convertible, volatile int*, volatile int[], false);
359 TEST (std::is_convertible, const volatile int*, const volatile int[], false);
360
361 // add cv-qualifiers
362 TEST (std::is_convertible, int*, const int[], false);
363 TEST (std::is_convertible, int*, volatile int[], false);
364 TEST (std::is_convertible, int*, const volatile int[], false);
365
366 // strip cv-qualifiers
367 TEST (std::is_convertible, const int*, int[], false);
368 TEST (std::is_convertible, volatile int*, int[], false);
369 TEST (std::is_convertible, const volatile int*, int[], false);
370
372 //TEST (std::is_convertible, abstract_, int, false);
373 //TEST (std::is_convertible, derived_t<abstract_>, abstract_, false);
374
375 TEST (std::is_convertible, long*, void*, true);
376 TEST (std::is_convertible, void*, long*, false);
377
378 // function to function conversions fail
379 TEST (std::is_convertible, int (), int (), false);
380 TEST (std::is_convertible, int (), int (char, long), false);
381
382 // function to function pointer
383 TEST (std::is_convertible, int (), int (*)(), true);
384 TEST (std::is_convertible, int (char, long), int (*)(char, long), true);
385 TEST (std::is_convertible, int (), int (*)(char), false);
386
387 // function to function reference
388 TEST (std::is_convertible, int (), int (&)(), true);
389 TEST (std::is_convertible, int (char, long), int (&)(char, long), true);
390 TEST (std::is_convertible, int (), int (&)(char), false);
391
392 TEST (std::is_convertible, int*, void*, true);
393
394#if defined (_MSC_VER) || defined (__IBMCPP__)
395 // microsoft language extension allows this conversion, and that
396 // extension is enabled by default.
397 TEST (std::is_convertible, int (*)(), void*, true);
398#else
399 TEST (std::is_convertible, int (*)(), void*, false);
400#endif
401
402 TEST (std::is_convertible,
403 int (*)(derived_t<struct_A>*),
404 int (*)(struct_A*), false);
405
406 TEST (std::is_convertible,
407 int (*)(struct_A*),
408 int (*)(derived_t<struct_A>*), false);
409
410 // pointer to derived member convertible to
411 // pointer to base member
412 TEST (std::is_convertible,
413 int derived_t<struct_A>::*,
414 int struct_A::*, false);
415
416 // pointer to base member convertible to
417 // pointer to derived member
418 TEST (std::is_convertible,
419 int struct_A::*,
420 int derived_t<struct_A>::*, true);
421
422 TEST (std::is_convertible, int, double, true);
423 TEST (std::is_convertible, const int, double, true);
424}
425
426
428static int run_test (int, char*[])
429{
430 test_is_same ();
431 test_is_base_of ();
432 test_is_convertible ();
433
434 return 0;
435}
436
437
439#else // _RWSTD_NO_EXT_CXX_0X
440
441
443static int run_test (int, char*[])
444{
445 rw_warn (0, 0, __LINE__,
446 "test disabled because _RWSTD_NO_EXT_CXX_0X is defined");
447 return 0;
448}
449
450#endif // !_RWSTD_NO_EXT_CXX_0X
451
452
454int main (int argc, char *argv[])
455{
456 return rw_test (argc, argv, __FILE__,
457 "meta.rel",
458 0 /* no comment */,
459 run_test,
460 0);
461}
#define T
Definition 17.names.cpp:163
#define line
Definition 17.names.cpp:490
#define TEST(Trait, TypeT, TypeU, Expect)
void test_trait(int line, bool value, bool expect, const char *trait, const char *typeT, const char *typeU)
enum_A
@ E_a
enum_B
@ E_b
void run_test(const ForwardIterator &dummy, T *, Predicate *pred)
T value(const T &val)
#define main
_TEST_EXPORT int rw_test(int argc, char *argv[], const char *filename, const char *clause, const char *comment, int(*testfun)(int, char **), const char *optspec,...)
_TEST_EXPORT int rw_assert(int, const char *, int, const char *,...)
Definition driver.cpp:1630
_TEST_EXPORT int rw_warn(int, const char *, int, const char *,...)
Definition driver.cpp:1647
#define true
Definition stdbool.h:25
#define false
Definition stdbool.h:26
constructible_from_B(class_B)
derived_with_conversion_t(const T &)