promote_enum_test.cpp

来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 153 行

CPP
153
字号
// 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>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=24063namespace 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_workaroundtypedef gcc_short_enums_workaround::select<    sizeof(gcc_short_enums_workaround::short_enum) != sizeof(int)  >::type Enum1;#endifvoid 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.#elseenum 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_MAXenum 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_MAXint main(){    return 0;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?