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