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 #include "test_macros.h"
     16 
     17 using namespace std;
     18 
     19 class Class {};
     20 
     21 enum Enum1 {};
     22 #if TEST_STD_VER >= 11
     23 enum class Enum2 : int {};
     24 #else
     25 enum Enum2 {};
     26 #endif
     27 
     28 template <class T>
     29 void test()
     30 {
     31     static_assert(!std::is_void<T>::value, "");
     32 #if TEST_STD_VER > 11
     33     static_assert(!std::is_null_pointer<T>::value, "");
     34 #endif
     35     static_assert(!std::is_integral<T>::value, "");
     36     static_assert(!std::is_floating_point<T>::value, "");
     37     static_assert(!std::is_array<T>::value, "");
     38     static_assert(!std::is_pointer<T>::value, "");
     39     static_assert(!std::is_lvalue_reference<T>::value, "");
     40     static_assert(!std::is_rvalue_reference<T>::value, "");
     41     static_assert(!std::is_member_object_pointer<T>::value, "");
     42     static_assert(!std::is_member_function_pointer<T>::value, "");
     43     static_assert(!std::is_enum<T>::value, "");
     44     static_assert(!std::is_union<T>::value, "");
     45     static_assert(!std::is_class<T>::value, "");
     46     static_assert( std::is_function<T>::value, "");
     47 }
     48 
     49 // Since we can't actually add the const volatile and ref qualifiers once
     50 // later let's use a macro to do it.
     51 #define TEST_REGULAR(...)                 \
     52     test<__VA_ARGS__>();                  \
     53     test<__VA_ARGS__ const>();            \
     54     test<__VA_ARGS__ volatile>();         \
     55     test<__VA_ARGS__ const volatile>()
     56 
     57 
     58 #define TEST_REF_QUALIFIED(...)           \
     59     test<__VA_ARGS__ &>();                \
     60     test<__VA_ARGS__ const &>();          \
     61     test<__VA_ARGS__ volatile &>();       \
     62     test<__VA_ARGS__ const volatile &>(); \
     63     test<__VA_ARGS__ &&>();               \
     64     test<__VA_ARGS__ const &&>();         \
     65     test<__VA_ARGS__ volatile &&>();      \
     66     test<__VA_ARGS__ const volatile &&>()
     67 
     68 struct incomplete_type;
     69 
     70 int main()
     71 {
     72     TEST_REGULAR( void () );
     73     TEST_REGULAR( void (int) );
     74     TEST_REGULAR( int (double) );
     75     TEST_REGULAR( int (double, char) );
     76     TEST_REGULAR( void (...) );
     77     TEST_REGULAR( void (int, ...) );
     78     TEST_REGULAR( int (double, ...) );
     79     TEST_REGULAR( int (double, char, ...) );
     80 #if TEST_STD_VER >= 11
     81     TEST_REF_QUALIFIED( void () );
     82     TEST_REF_QUALIFIED( void (int) );
     83     TEST_REF_QUALIFIED( int (double) );
     84     TEST_REF_QUALIFIED( int (double, char) );
     85     TEST_REF_QUALIFIED( void (...) );
     86     TEST_REF_QUALIFIED( void (int, ...) );
     87     TEST_REF_QUALIFIED( int (double, ...) );
     88     TEST_REF_QUALIFIED( int (double, char, ...) );
     89 #endif
     90 
     91 //  LWG#2582
     92     static_assert(!std::is_function<incomplete_type>::value, "");
     93 }
     94