[libcxx] [test] Avoid MSVC's non-Standard ABI in underlying_type.pass.cpp.

When compiled with Clang for Windows, this was emitting "enumerator value
evaluates to 4294967295, which cannot be narrowed to type 'int' [-Wc++11-narrowing]".

The test should more strenuously avoid poking this ABI deficiency (and it
already has coverage for explicitly specified underlying types).

Fixes D29140.

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@294159 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Stephan T. Lavavej
2017-02-05 22:48:13 +00:00
parent 041fb56800
commit b40cb9832b

View File

@@ -17,24 +17,32 @@
#include "test_macros.h"
enum E { V = INT_MIN };
#if !defined(_WIN32) || defined(__MINGW32__)
#define TEST_UNSIGNED_UNDERLYING_TYPE 1
#else
#define TEST_UNSIGNED_UNDERLYING_TYPE 0 // MSVC's ABI doesn't follow the Standard
#endif
#if TEST_UNSIGNED_UNDERLYING_TYPE
enum F { W = UINT_MAX };
#endif // TEST_UNSIGNED_UNDERLYING_TYPE
int main()
{
#if !defined(_WIN32) || defined(__MINGW32__)
typedef unsigned ExpectUnsigned;
#else
typedef int ExpectUnsigned; // MSVC's ABI doesn't follow the Standard
#endif
static_assert((std::is_same<std::underlying_type<E>::type, int>::value),
"E has the wrong underlying type");
static_assert((std::is_same<std::underlying_type<F>::type, ExpectUnsigned>::value),
#if TEST_UNSIGNED_UNDERLYING_TYPE
static_assert((std::is_same<std::underlying_type<F>::type, unsigned>::value),
"F has the wrong underlying type");
#endif // TEST_UNSIGNED_UNDERLYING_TYPE
#if TEST_STD_VER > 11
static_assert((std::is_same<std::underlying_type_t<E>, int>::value), "");
static_assert((std::is_same<std::underlying_type_t<F>, ExpectUnsigned>::value), "");
#endif
#if TEST_UNSIGNED_UNDERLYING_TYPE
static_assert((std::is_same<std::underlying_type_t<F>, unsigned>::value), "");
#endif // TEST_UNSIGNED_UNDERLYING_TYPE
#endif // TEST_STD_VER > 11
#if TEST_STD_VER >= 11
enum G : char { };
@@ -43,6 +51,6 @@ int main()
"G has the wrong underlying type");
#if TEST_STD_VER > 11
static_assert((std::is_same<std::underlying_type_t<G>, char>::value), "");
#endif
#endif // TEST_STD_VER > 11
#endif // TEST_STD_VER >= 11
}