Fix timespec_object.*_32bit_sec tests on 32-bit platforms

On 32-bit unix platforms, 0xffffffffUL is a 32-bit value so the compiler
complains about converting it to a signed value.

    /home/runner/work/msgpack-c/msgpack-c/test/msgpack_cpp11.cpp:1085:20: error: constant expression evaluates to 4294967295 which cannot be narrowed to type '__time_t' (aka 'long') [-Wc++11-narrowing]
        timespec val1{ 0xffffffffUL, 0 };
                       ^~~~~~~~~~~~
    /home/runner/work/msgpack-c/msgpack-c/test/msgpack_cpp11.cpp:1085:20: note: insert an explicit cast to silence this issue
        timespec val1{ 0xffffffffUL, 0 };
                       ^~~~~~~~~~~~
                       static_cast<__time_t>( )
    /home/runner/work/msgpack-c/msgpack-c/test/msgpack_cpp11.cpp:1085:20: warning: implicit conversion changes signedness: 'unsigned long' to '__time_t' (aka 'long') [-Wsign-conversion]
        timespec val1{ 0xffffffffUL, 0 };
                     ~ ^~~~~~~~~~~~

Since we're trying to test how the maximum 32-bit value that fits in
timespec.tv_sec is handled, directly use the maximum 32-bit value for
the appropriate (un)signed type used for timespec.tv_sec.

We don't just cast to the value, as the compiler suggests, because that
would result in an extremely negative value.
This commit is contained in:
James McCoy
2020-01-03 06:52:15 -05:00
parent 4a94f836a7
commit 7ed7af90b6

View File

@@ -1082,7 +1082,7 @@ TEST(MSGPACK_TIMESPEC, timespec_object_with_zone_zero)
TEST(MSGPACK_TIMESPEC, timespec_pack_convert_32bit_sec) TEST(MSGPACK_TIMESPEC, timespec_pack_convert_32bit_sec)
{ {
std::stringstream ss; std::stringstream ss;
timespec val1{ 0xffffffffUL, 0 }; timespec val1{ std::numeric_limits<decltype(std::declval<timespec>().tv_sec)>::is_signed ? INT32_MAX : UINT32_MAX, 0 };
msgpack::pack(ss, val1); msgpack::pack(ss, val1);
std::string const& str = ss.str(); std::string const& str = ss.str();
@@ -1098,7 +1098,7 @@ TEST(MSGPACK_TIMESPEC, timespec_pack_convert_32bit_sec)
TEST(MSGPACK_TIMESPEC, timespec_object_with_zone_32bit_sec) TEST(MSGPACK_TIMESPEC, timespec_object_with_zone_32bit_sec)
{ {
msgpack::zone z; msgpack::zone z;
timespec val1{ 0xffffffffUL, 0 }; timespec val1{ std::numeric_limits<decltype(std::declval<timespec>().tv_sec)>::is_signed ? INT32_MAX : UINT32_MAX, 0 };
msgpack::object obj(val1, z); msgpack::object obj(val1, z);
timespec val2 = obj.as<timespec>(); timespec val2 = obj.as<timespec>();
EXPECT_EQ(val1.tv_sec, val2.tv_sec); EXPECT_EQ(val1.tv_sec, val2.tv_sec);