summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/type_traits/test/promote_enum_test.cpp
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 18:45:59 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 18:45:59 +0000
commit19fcec84d8d7d21e796c7624e521b60d28ee21ed (patch)
tree42d26aa27d1e3f7c0b8bd3fd14e7d7082f5008dc /src/boost/libs/type_traits/test/promote_enum_test.cpp
parentInitial commit. (diff)
downloadceph-6d07fdb6bb33b1af39833b850bb6cf8af79fe293.tar.xz
ceph-6d07fdb6bb33b1af39833b850bb6cf8af79fe293.zip
Adding upstream version 16.2.11+ds.upstream/16.2.11+dsupstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/boost/libs/type_traits/test/promote_enum_test.cpp')
-rw-r--r--src/boost/libs/type_traits/test/promote_enum_test.cpp157
1 files changed, 157 insertions, 0 deletions
diff --git a/src/boost/libs/type_traits/test/promote_enum_test.cpp b/src/boost/libs/type_traits/test/promote_enum_test.cpp
new file mode 100644
index 000000000..f94df5e24
--- /dev/null
+++ b/src/boost/libs/type_traits/test/promote_enum_test.cpp
@@ -0,0 +1,157 @@
+// 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;
+}
+