promote_enum_test.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. // Copyright 2005-2006 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. // Status of some compilers:
  6. //
  7. // Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 13.10.3077 for 80x86
  8. // /Za (disable extentions) is totally broken.
  9. // /Ze (enable extentions) promotes UIntEnum incorrectly to int.
  10. // See http://lab.msdn.microsoft.com/ProductFeedback/viewfeedback.aspx?feedbackid=22b0a6b7-120f-4ca0-9136-fa1b25b26efe
  11. //
  12. // Intel 9.0.028 for Windows has a similar problem:
  13. // https://premier.intel.com/IssueDetail.aspx?IssueID=365073
  14. //
  15. // gcc 3.4.4 with -fshort-enums option on x86
  16. // Dummy value is required, otherwise gcc promotes Enum1
  17. // to unsigned int although USHRT_MAX <= INT_MAX.
  18. // http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24063
  19. //
  20. // CC: Sun WorkShop 6 update 2 C++ 5.3 Patch 111685-20 2004/03/19
  21. // on SPARC V9 64-bit processor (-xarch=v9 flag)
  22. // Dummy values are required for LongEnum3 and LongEnum4.
  23. //
  24. // CC: Sun C++ 5.7 Patch 117830-03 2005/07/21
  25. // ICE in boost/type_traits/is_enum.hpp at line 67.
  26. #include <climits>
  27. #include "promote_util.hpp"
  28. #include <boost/detail/workaround.hpp>
  29. #ifdef BOOST_INTEL
  30. // remark #1418: external function definition with no prior declaration
  31. #pragma warning(disable:1418)
  32. #endif
  33. enum IntEnum1 { IntEnum1_min = -5 , IntEnum1_max = 5 };
  34. enum IntEnum2 { IntEnum2_min = SHRT_MIN, IntEnum2_max = SHRT_MAX };
  35. enum IntEnum3 { IntEnum3_min = INT_MIN , IntEnum3_max = INT_MAX };
  36. enum IntEnum4 { IntEnum4_value = INT_MAX };
  37. enum IntEnum5 { IntEnum5_value = INT_MIN };
  38. void test_promote_to_int()
  39. {
  40. test_cv<IntEnum1,int>();
  41. test_cv<IntEnum2,int>();
  42. test_cv<IntEnum3,int>();
  43. test_cv<IntEnum4,int>();
  44. test_cv<IntEnum5,int>();
  45. }
  46. #if !(defined(__GNUC__) && __GNUC__ == 3 && __GNUC_MINOR__ == 4 && USHRT_MAX <= INT_MAX)
  47. enum Enum1 { Enum1_value = USHRT_MAX };
  48. #else
  49. // workaround for bug #24063 in gcc 3.4
  50. // http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24063
  51. namespace gcc_short_enums_workaround {
  52. enum short_enum { value = 1 };
  53. template<bool ShortEnumsIsOn>
  54. struct select
  55. {
  56. // Adding negative dummy value doesn't change
  57. // promoted type because USHRT_MAX <= INT_MAX.
  58. enum type { dummy = -1, value = USHRT_MAX };
  59. };
  60. template<>
  61. struct select<false>
  62. {
  63. // No dummy value
  64. enum type { value = USHRT_MAX };
  65. };
  66. } // namespace gcc_short_enums_workaround
  67. typedef gcc_short_enums_workaround::select<
  68. sizeof(gcc_short_enums_workaround::short_enum) != sizeof(int)
  69. >::type Enum1;
  70. #endif
  71. void test_promote_to_int_or_uint()
  72. {
  73. #if USHRT_MAX <= INT_MAX
  74. test_cv<Enum1, int>();
  75. #else
  76. test_cv<Enum1, unsigned int>();
  77. #endif
  78. }
  79. #if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1500) ) || \
  80. BOOST_WORKAROUND(BOOST_INTEL_WIN, BOOST_TESTED_AT(1000))
  81. // Don't test UIntEnum on VC++ 8.0 and Intel for Windows 9.0,
  82. // they are broken. More info is on top of this file.
  83. #else
  84. enum UIntEnum { UIntEnum_max = UINT_MAX };
  85. void test_promote_to_uint()
  86. {
  87. test_cv< UIntEnum, unsigned int >();
  88. }
  89. #endif
  90. // Enums can't be promoted to [unsigned] long if sizeof(int) == sizeof(long).
  91. #if INT_MAX < LONG_MAX
  92. enum LongEnum1 { LongEnum1_min = -1 , LongEnum1_max = UINT_MAX };
  93. enum LongEnum2 { LongEnum2_min = LONG_MIN, LongEnum2_max = LONG_MAX };
  94. enum LongEnum3
  95. {
  96. LongEnum3_value = LONG_MAX
  97. #if defined(__SUNPRO_CC) && __SUNPRO_CC <= 0x530
  98. , LongEnum3_dummy = -1
  99. #endif
  100. };
  101. enum LongEnum4
  102. {
  103. LongEnum4_value = LONG_MIN
  104. #if defined(__SUNPRO_CC) && __SUNPRO_CC <= 0x530
  105. , LongEnum4_dummy = 1
  106. #endif
  107. };
  108. void test_promote_to_long()
  109. {
  110. test_cv< LongEnum1, long >();
  111. test_cv< LongEnum2, long >();
  112. test_cv< LongEnum3, long >();
  113. test_cv< LongEnum4, long >();
  114. }
  115. enum ULongEnum { ULongEnum_value = ULONG_MAX };
  116. void test_promote_to_ulong()
  117. {
  118. test_cv< ULongEnum, unsigned long >();
  119. }
  120. #endif // #if INT_MAX < LONG_MAX
  121. int main()
  122. {
  123. return 0;
  124. }