123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- // Copyright 2005-2006 Alexander Nasonov.
- // Distributed under the Boost Software License, Version 1.0. (See
- // accompanying file LICENSE_1_0.txt or copy at
- // http://www.boost.org/LICENSE_1_0.txt)
- // Status of some compilers:
- //
- // Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 13.10.3077 for 80x86
- // /Za (disable extentions) is totally broken.
- // /Ze (enable extentions) promotes UIntEnum incorrectly to int.
- // See http://lab.msdn.microsoft.com/ProductFeedback/viewfeedback.aspx?feedbackid=22b0a6b7-120f-4ca0-9136-fa1b25b26efe
- //
- // Intel 9.0.028 for Windows has a similar problem:
- // https://premier.intel.com/IssueDetail.aspx?IssueID=365073
- //
- // gcc 3.4.4 with -fshort-enums option on x86
- // Dummy value is required, otherwise gcc promotes Enum1
- // to unsigned int although USHRT_MAX <= INT_MAX.
- // http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24063
- //
- // CC: Sun WorkShop 6 update 2 C++ 5.3 Patch 111685-20 2004/03/19
- // on SPARC V9 64-bit processor (-xarch=v9 flag)
- // Dummy values are required for LongEnum3 and LongEnum4.
- //
- // CC: Sun C++ 5.7 Patch 117830-03 2005/07/21
- // ICE in boost/type_traits/is_enum.hpp at line 67.
- #include <climits>
- #include "promote_util.hpp"
- #include <boost/detail/workaround.hpp>
- #ifdef BOOST_INTEL
- // remark #1418: external function definition with no prior declaration
- #pragma warning(disable:1418)
- #endif
- enum IntEnum1 { IntEnum1_min = -5 , IntEnum1_max = 5 };
- enum IntEnum2 { IntEnum2_min = SHRT_MIN, IntEnum2_max = SHRT_MAX };
- enum IntEnum3 { IntEnum3_min = INT_MIN , IntEnum3_max = INT_MAX };
- enum IntEnum4 { IntEnum4_value = INT_MAX };
- enum IntEnum5 { IntEnum5_value = INT_MIN };
- void test_promote_to_int()
- {
- test_cv<IntEnum1,int>();
- test_cv<IntEnum2,int>();
- test_cv<IntEnum3,int>();
- test_cv<IntEnum4,int>();
- test_cv<IntEnum5,int>();
- }
- #if !(defined(__GNUC__) && __GNUC__ == 3 && __GNUC_MINOR__ == 4 && USHRT_MAX <= INT_MAX)
- enum Enum1 { Enum1_value = USHRT_MAX };
- #else
- // workaround for bug #24063 in gcc 3.4
- // http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24063
- namespace gcc_short_enums_workaround {
- enum short_enum { value = 1 };
- template<bool ShortEnumsIsOn>
- struct select
- {
- // Adding negative dummy value doesn't change
- // promoted type because USHRT_MAX <= INT_MAX.
- enum type { dummy = -1, value = USHRT_MAX };
- };
- template<>
- struct select<false>
- {
- // No dummy value
- enum type { value = USHRT_MAX };
- };
- } // namespace gcc_short_enums_workaround
- typedef gcc_short_enums_workaround::select<
- sizeof(gcc_short_enums_workaround::short_enum) != sizeof(int)
- >::type Enum1;
- #endif
- void test_promote_to_int_or_uint()
- {
- #if USHRT_MAX <= INT_MAX
- test_cv<Enum1, int>();
- #else
- test_cv<Enum1, unsigned int>();
- #endif
- }
- #if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1500) ) || \
- BOOST_WORKAROUND(BOOST_INTEL_WIN, BOOST_TESTED_AT(1000))
- // Don't test UIntEnum on VC++ 8.0 and Intel for Windows 9.0,
- // they are broken. More info is on top of this file.
- #else
- enum UIntEnum { UIntEnum_max = UINT_MAX };
- void test_promote_to_uint()
- {
- test_cv< UIntEnum, unsigned int >();
- }
- #endif
- // Enums can't be promoted to [unsigned] long if sizeof(int) == sizeof(long).
- #if INT_MAX < LONG_MAX
- enum LongEnum1 { LongEnum1_min = -1 , LongEnum1_max = UINT_MAX };
- enum LongEnum2 { LongEnum2_min = LONG_MIN, LongEnum2_max = LONG_MAX };
- enum LongEnum3
- {
- LongEnum3_value = LONG_MAX
- #if defined(__SUNPRO_CC) && __SUNPRO_CC <= 0x530
- , LongEnum3_dummy = -1
- #endif
- };
- enum LongEnum4
- {
- LongEnum4_value = LONG_MIN
- #if defined(__SUNPRO_CC) && __SUNPRO_CC <= 0x530
- , LongEnum4_dummy = 1
- #endif
- };
- void test_promote_to_long()
- {
- test_cv< LongEnum1, long >();
- test_cv< LongEnum2, long >();
- test_cv< LongEnum3, long >();
- test_cv< LongEnum4, long >();
- }
- enum ULongEnum { ULongEnum_value = ULONG_MAX };
- void test_promote_to_ulong()
- {
- test_cv< ULongEnum, unsigned long >();
- }
- #endif // #if INT_MAX < LONG_MAX
- int main()
- {
- return 0;
- }
|