| Index: base/numerics/safe_numerics_unittest.cc
|
| diff --git a/base/numerics/safe_numerics_unittest.cc b/base/numerics/safe_numerics_unittest.cc
|
| index c0cc5143ea446fec09a39ea9ce71d139149b97ee..0e3d999b2f5270872aa203fdd01843179a4a684b 100644
|
| --- a/base/numerics/safe_numerics_unittest.cc
|
| +++ b/base/numerics/safe_numerics_unittest.cc
|
| @@ -831,6 +831,24 @@ static_assert(std::is_same<decltype(TestOverload(StrictNumeric<size_t>())),
|
| size_t>::value,
|
| "");
|
|
|
| +template <typename T>
|
| +struct CastTest1 {
|
| + static constexpr T HandleNaN() { return -1; }
|
| + static constexpr T max() { return numeric_limits<T>::max() - 1; }
|
| + static constexpr T HandleOverflow() { return max(); }
|
| + static constexpr T lowest() { return numeric_limits<T>::lowest() + 1; }
|
| + static constexpr T HandleUnderflow() { return lowest(); }
|
| +};
|
| +
|
| +template <typename T>
|
| +struct CastTest2 {
|
| + static constexpr T HandleNaN() { return 11; }
|
| + static constexpr T max() { return 10; }
|
| + static constexpr T HandleOverflow() { return max(); }
|
| + static constexpr T lowest() { return 1; }
|
| + static constexpr T HandleUnderflow() { return lowest(); }
|
| +};
|
| +
|
| TEST(SafeNumerics, CastTests) {
|
| // MSVC catches and warns that we're forcing saturation in these tests.
|
| // Since that's intentional, we need to shut this warning off.
|
| @@ -893,6 +911,35 @@ TEST(SafeNumerics, CastTests) {
|
| saturated_cast<int>(double_small_int));
|
| EXPECT_EQ(numeric_limits<int>::max(), saturated_cast<int>(double_large_int));
|
|
|
| + // Test the saturated cast overrides.
|
| + using FloatLimits = numeric_limits<float>;
|
| + using IntLimits = numeric_limits<int>;
|
| + EXPECT_EQ(-1, (saturated_cast<int, CastTest1>(FloatLimits::quiet_NaN())));
|
| + EXPECT_EQ(CastTest1<int>::max(),
|
| + (saturated_cast<int, CastTest1>(FloatLimits::infinity())));
|
| + EXPECT_EQ(CastTest1<int>::max(),
|
| + (saturated_cast<int, CastTest1>(FloatLimits::max())));
|
| + EXPECT_EQ(CastTest1<int>::max(),
|
| + (saturated_cast<int, CastTest1>(float(IntLimits::max()))));
|
| + EXPECT_EQ(CastTest1<int>::lowest(),
|
| + (saturated_cast<int, CastTest1>(-FloatLimits::infinity())));
|
| + EXPECT_EQ(CastTest1<int>::lowest(),
|
| + (saturated_cast<int, CastTest1>(FloatLimits::lowest())));
|
| + EXPECT_EQ(0, (saturated_cast<int, CastTest1>(0.0)));
|
| + EXPECT_EQ(1, (saturated_cast<int, CastTest1>(1.0)));
|
| + EXPECT_EQ(-1, (saturated_cast<int, CastTest1>(-1.0)));
|
| + EXPECT_EQ(0, (saturated_cast<int, CastTest1>(0)));
|
| + EXPECT_EQ(1, (saturated_cast<int, CastTest1>(1)));
|
| + EXPECT_EQ(-1, (saturated_cast<int, CastTest1>(-1)));
|
| + EXPECT_EQ(CastTest1<int>::lowest(),
|
| + (saturated_cast<int, CastTest1>(float(IntLimits::lowest()))));
|
| + EXPECT_EQ(11, (saturated_cast<int, CastTest2>(FloatLimits::quiet_NaN())));
|
| + EXPECT_EQ(10, (saturated_cast<int, CastTest2>(FloatLimits::infinity())));
|
| + EXPECT_EQ(10, (saturated_cast<int, CastTest2>(FloatLimits::max())));
|
| + EXPECT_EQ(1, (saturated_cast<int, CastTest2>(-FloatLimits::infinity())));
|
| + EXPECT_EQ(1, (saturated_cast<int, CastTest2>(FloatLimits::lowest())));
|
| + EXPECT_EQ(1, (saturated_cast<int, CastTest2>(0U)));
|
| +
|
| float not_a_number = std::numeric_limits<float>::infinity() -
|
| std::numeric_limits<float>::infinity();
|
| EXPECT_TRUE(std::isnan(not_a_number));
|
| @@ -937,15 +984,6 @@ TEST(SafeNumerics, CastTests) {
|
| EXPECT_EQ(1, strict_cast<int>(StrictNumeric<int>(1)));
|
| }
|
|
|
| -TEST(SafeNumerics, SaturatedCastChecks) {
|
| - float not_a_number = std::numeric_limits<float>::infinity() -
|
| - std::numeric_limits<float>::infinity();
|
| - EXPECT_TRUE(std::isnan(not_a_number));
|
| - EXPECT_DEATH_IF_SUPPORTED(
|
| - (saturated_cast<int, base::CheckOnFailure>(not_a_number)),
|
| - "");
|
| -}
|
| -
|
| TEST(SafeNumerics, IsValueInRangeForNumericType) {
|
| EXPECT_TRUE(IsValueInRangeForNumericType<uint32_t>(0));
|
| EXPECT_TRUE(IsValueInRangeForNumericType<uint32_t>(1));
|
|
|