promote_basic_test.cpp 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. // Copyright 2005 Alexander Nasonov.
  2. // Distributed under the Boost Software License, Version 1.0. (See
  3. // accompanying file LICENSE_1_0.txt or copy at
  4. // http://www.boost.org/LICENSE_1_0.txt)
  5. #include <climits>
  6. #if !defined(BOOST_NO_CWCHAR)
  7. #include <cwchar>
  8. #endif
  9. #include "promote_util.hpp"
  10. struct Struct {};
  11. int main()
  12. {
  13. // char types
  14. #if CHAR_MAX <= INT_MAX
  15. test_cv< char, int >();
  16. #else
  17. // TODO: dead branch?
  18. test_cv< char, unsigned int >();
  19. #endif
  20. test_cv< signed char, int >();
  21. #if UCHAR_MAX <= INT_MAX
  22. test_cv< unsigned char, int >();
  23. #else
  24. test_cv< unsigned char, unsigned int >();
  25. #endif
  26. // short types
  27. test_cv< short int, int >();
  28. #if USHRT_MAX <= INT_MAX
  29. test_cv< unsigned short, int >();
  30. #else
  31. test_cv< unsigned short, unsigned int >();
  32. #endif
  33. // int and long
  34. test_cv< int, int >();
  35. test_cv< unsigned int, unsigned int >();
  36. test_cv< long, long >();
  37. test_cv< unsigned long, unsigned long >();
  38. // wchar_t
  39. #if !defined(BOOST_NO_CWCHAR) && defined(WCHAR_MAX) && defined(WCHAR_MIN)
  40. // Version prior to VC8 didn't allow WCHAR_MAX in #if expressions
  41. #if defined(BOOST_MSVC) && BOOST_MSVC < 1400
  42. # define BOOST_TT_AUX_WCHAR_MAX USHORT_MAX // force test_cv< wchar_t, int >
  43. #elif defined(WCHAR_MAX) && !defined(__APPLE__)
  44. # define BOOST_TT_AUX_WCHAR_MAX WCHAR_MAX
  45. #elif defined(__BORLANDC__) || defined(__CYGWIN__) || defined(__MINGW32__) || (defined(__BEOS__) && defined(__GNUC__))
  46. // No WCHAR_MIN and WCHAR_MAX, whar_t is short and unsigned:
  47. # define BOOST_TT_AUX_WCHAR_MAX USHORT_MAX // force test_cv< wchar_t, int >
  48. #elif (defined(__sgi) && (!defined(__SGI_STL_PORT) || __SGI_STL_PORT < 0x400))\
  49. || (defined __APPLE__)\
  50. || (defined(__OpenBSD__) && defined(__GNUC__))\
  51. || (defined(__NetBSD__) && defined(__GNUC__))\
  52. || (defined(__FreeBSD__) && defined(__GNUC__))\
  53. || (defined(__DragonFly__) && defined(__GNUC__))\
  54. || (defined(__hpux) && defined(__GNUC__) && (__GNUC__ == 3) && !defined(__SGI_STL_PORT))
  55. // No WCHAR_MIN and WCHAR_MAX, wchar_t has the same range as int.
  56. // - SGI MIPSpro with native library
  57. // - gcc 3.x on HP-UX
  58. // - Mac OS X with native library
  59. // - gcc on FreeBSD, OpenBSD and NetBSD
  60. # define BOOST_TT_AUX_WCHAR_MAX INT_MAX // force test_cv< wchar_t, int >
  61. #elif defined(__hpux) && defined(__GNUC__) && (__GNUC__ == 2) && !defined(__SGI_STL_PORT)
  62. // No WCHAR_MIN and WCHAR_MAX, wchar_t has the same range as unsigned int.
  63. // - gcc 2.95.x on HP-UX
  64. // (also, std::numeric_limits<wchar_t> appears to return the wrong values).
  65. # define BOOST_TT_AUX_WCHAR_MAX UINT_MAX // force test_cv< wchar_t, int >
  66. #endif
  67. // For this PP-logic to work we need a valid WCHAR_MAX etc:
  68. #if defined(BOOST_TT_AUX_WCHAR_MAX) \
  69. && !defined(__DECCXX) \
  70. && !defined(__hpux) \
  71. && !defined(_WIN32_WCE)
  72. #if BOOST_TT_AUX_WCHAR_MAX <= INT_MAX
  73. test_cv< wchar_t, int >();
  74. #elif WCHAR_MIN == 0 && BOOST_TT_AUX_WCHAR_MAX <= UINT_MAX
  75. test_cv< wchar_t, unsigned int >();
  76. #elif BOOST_TT_AUX_WCHAR_MAX <= LONG_MAX
  77. test_cv< wchar_t, long >();
  78. #else
  79. test_cv< wchar_t, unsigned long >();
  80. #endif
  81. #endif
  82. #undef BOOST_TT_AUX_WCHAR_MAX
  83. #endif
  84. // floating point promotion
  85. test_cv< float , double >();
  86. test_cv< double, double >();
  87. // Other types
  88. test_cv< Struct, Struct >();
  89. test_cv< void , void >();
  90. test_cv< void* , void* >();
  91. // Array types
  92. typedef int arr[3];
  93. typedef int (&arr_ref)[3];
  94. typedef int (*arr_ptr)[3];
  95. test_cv< arr , arr >();
  96. test_cv< arr_ptr, arr_ptr >();
  97. test_no_cv<arr_ref,arr_ref>();
  98. // Function types
  99. typedef int (fun)();
  100. typedef int (&fun_ref)();
  101. typedef int (*fun_ptr)();
  102. test_no_cv< fun , fun >();
  103. test_no_cv< fun_ref, fun_ref >();
  104. test_no_cv< fun_ptr, fun_ptr >();
  105. // Member pointer types
  106. typedef int (Struct::*mem_fun_ptr)();
  107. typedef int Struct::*mem_ptr;
  108. test_no_cv< mem_ptr, mem_ptr >();
  109. test_no_cv< mem_fun_ptr, mem_fun_ptr >();
  110. return 0;
  111. }