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