1c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant//===----------------------------------------------------------------------===//
2c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant//
3c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant//                     The LLVM Compiler Infrastructure
4c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant//
5b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open
6b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// Source Licenses. See LICENSE.TXT for details.
7c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant//
8c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant//===----------------------------------------------------------------------===//
9c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant
10c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// type_traits
11c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant
12c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// function
13c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant
14c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant#include <type_traits>
15c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant
165cb52824fc2a0caf233311e91d9a2a53368f04adDan Albertusing namespace std;
175cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert
185cb52824fc2a0caf233311e91d9a2a53368f04adDan Albertclass Class {};
195cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert
205cb52824fc2a0caf233311e91d9a2a53368f04adDan Albertenum Enum1 {};
215cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert#if __cplusplus >= 201103L
225cb52824fc2a0caf233311e91d9a2a53368f04adDan Albertenum class Enum2 : int {};
235cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert#else
245cb52824fc2a0caf233311e91d9a2a53368f04adDan Albertenum Enum2 {};
255cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert#endif
265cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert
27c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnanttemplate <class T>
285cb52824fc2a0caf233311e91d9a2a53368f04adDan Albertvoid test()
29c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant{
30c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    static_assert(!std::is_void<T>::value, "");
3179d8c99a62b6a6fa0b3c0dc3f761659f62f3f587Marshall Clow#if _LIBCPP_STD_VER > 11
3279d8c99a62b6a6fa0b3c0dc3f761659f62f3f587Marshall Clow    static_assert(!std::is_null_pointer<T>::value, "");
3379d8c99a62b6a6fa0b3c0dc3f761659f62f3f587Marshall Clow#endif
34c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    static_assert(!std::is_integral<T>::value, "");
35c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    static_assert(!std::is_floating_point<T>::value, "");
36c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    static_assert(!std::is_array<T>::value, "");
37c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    static_assert(!std::is_pointer<T>::value, "");
38c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    static_assert(!std::is_lvalue_reference<T>::value, "");
39c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    static_assert(!std::is_rvalue_reference<T>::value, "");
40c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    static_assert(!std::is_member_object_pointer<T>::value, "");
41c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    static_assert(!std::is_member_function_pointer<T>::value, "");
42c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    static_assert(!std::is_enum<T>::value, "");
43c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    static_assert(!std::is_union<T>::value, "");
44c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    static_assert(!std::is_class<T>::value, "");
45c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    static_assert( std::is_function<T>::value, "");
46c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant}
47c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant
485cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert// Since we can't actually add the const volatile and ref qualifiers once
495cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert// later let's use a macro to do it.
505cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert#define TEST_REGULAR(...)                 \
515cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert    test<__VA_ARGS__>();                  \
525cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert    test<__VA_ARGS__ const>();            \
535cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert    test<__VA_ARGS__ volatile>();         \
545cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert    test<__VA_ARGS__ const volatile>()
555cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert
565cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert
575cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert#define TEST_REF_QUALIFIED(...)           \
585cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert    test<__VA_ARGS__ &>();                \
595cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert    test<__VA_ARGS__ const &>();          \
605cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert    test<__VA_ARGS__ volatile &>();       \
615cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert    test<__VA_ARGS__ const volatile &>(); \
625cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert    test<__VA_ARGS__ &&>();               \
635cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert    test<__VA_ARGS__ const &&>();         \
645cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert    test<__VA_ARGS__ volatile &&>();      \
655cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert    test<__VA_ARGS__ const volatile &&>()
665cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert
67c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant
68c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnantint main()
69c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant{
705cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert    TEST_REGULAR( void () );
715cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert    TEST_REGULAR( void (int) );
725cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert    TEST_REGULAR( int (double) );
735cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert    TEST_REGULAR( int (double, char) );
745cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert    TEST_REGULAR( void (...) );
755cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert    TEST_REGULAR( void (int, ...) );
765cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert    TEST_REGULAR( int (double, ...) );
775cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert    TEST_REGULAR( int (double, char, ...) );
785cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert#if __cplusplus >= 201103L
795cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert    TEST_REF_QUALIFIED( void () );
805cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert    TEST_REF_QUALIFIED( void (int) );
815cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert    TEST_REF_QUALIFIED( int (double) );
825cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert    TEST_REF_QUALIFIED( int (double, char) );
835cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert    TEST_REF_QUALIFIED( void (...) );
845cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert    TEST_REF_QUALIFIED( void (int, ...) );
855cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert    TEST_REF_QUALIFIED( int (double, ...) );
865cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert    TEST_REF_QUALIFIED( int (double, char, ...) );
875cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert#endif
88c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant}
89