Home | History | Annotate | Download | only in meta.unary.cat
      1 //===----------------------------------------------------------------------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is dual licensed under the MIT and the University of Illinois Open
      6 // Source Licenses. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 // type_traits
     11 
     12 // function
     13 
     14 #include <type_traits>
     15 
     16 using namespace std;
     17 
     18 class Class {};
     19 
     20 enum Enum1 {};
     21 #if __cplusplus >= 201103L
     22 enum class Enum2 : int {};
     23 #else
     24 enum Enum2 {};
     25 #endif
     26 
     27 template <class T>
     28 void test()
     29 {
     30     static_assert(!std::is_void<T>::value, "");
     31 #if _LIBCPP_STD_VER > 11
     32     static_assert(!std::is_null_pointer<T>::value, "");
     33 #endif
     34     static_assert(!std::is_integral<T>::value, "");
     35     static_assert(!std::is_floating_point<T>::value, "");
     36     static_assert(!std::is_array<T>::value, "");
     37     static_assert(!std::is_pointer<T>::value, "");
     38     static_assert(!std::is_lvalue_reference<T>::value, "");
     39     static_assert(!std::is_rvalue_reference<T>::value, "");
     40     static_assert(!std::is_member_object_pointer<T>::value, "");
     41     static_assert(!std::is_member_function_pointer<T>::value, "");
     42     static_assert(!std::is_enum<T>::value, "");
     43     static_assert(!std::is_union<T>::value, "");
     44     static_assert(!std::is_class<T>::value, "");
     45     static_assert( std::is_function<T>::value, "");
     46 }
     47 
     48 // Since we can't actually add the const volatile and ref qualifiers once
     49 // later let's use a macro to do it.
     50 #define TEST_REGULAR(...)                 \
     51     test<__VA_ARGS__>();                  \
     52     test<__VA_ARGS__ const>();            \
     53     test<__VA_ARGS__ volatile>();         \
     54     test<__VA_ARGS__ const volatile>()
     55 
     56 
     57 #define TEST_REF_QUALIFIED(...)           \
     58     test<__VA_ARGS__ &>();                \
     59     test<__VA_ARGS__ const &>();          \
     60     test<__VA_ARGS__ volatile &>();       \
     61     test<__VA_ARGS__ const volatile &>(); \
     62     test<__VA_ARGS__ &&>();               \
     63     test<__VA_ARGS__ const &&>();         \
     64     test<__VA_ARGS__ volatile &&>();      \
     65     test<__VA_ARGS__ const volatile &&>()
     66 
     67 
     68 int main()
     69 {
     70     TEST_REGULAR( void () );
     71     TEST_REGULAR( void (int) );
     72     TEST_REGULAR( int (double) );
     73     TEST_REGULAR( int (double, char) );
     74     TEST_REGULAR( void (...) );
     75     TEST_REGULAR( void (int, ...) );
     76     TEST_REGULAR( int (double, ...) );
     77     TEST_REGULAR( int (double, char, ...) );
     78 #if __cplusplus >= 201103L
     79     TEST_REF_QUALIFIED( void () );
     80     TEST_REF_QUALIFIED( void (int) );
     81     TEST_REF_QUALIFIED( int (double) );
     82     TEST_REF_QUALIFIED( int (double, char) );
     83     TEST_REF_QUALIFIED( void (...) );
     84     TEST_REF_QUALIFIED( void (int, ...) );
     85     TEST_REF_QUALIFIED( int (double, ...) );
     86     TEST_REF_QUALIFIED( int (double, char, ...) );
     87 #endif
     88 }
     89