| Index: base/numerics/safe_numerics_unittest.cc
|
| diff --git a/base/numerics/safe_numerics_unittest.cc b/base/numerics/safe_numerics_unittest.cc
|
| index f1522ba3800060851fb23686f9010b99bfdbf98c..7d42a8361ec8cf801366c23ff0e452a63b32e77e 100644
|
| --- a/base/numerics/safe_numerics_unittest.cc
|
| +++ b/base/numerics/safe_numerics_unittest.cc
|
| @@ -26,6 +26,8 @@ using base::IsValidForType;
|
| using base::ValueOrDieForType;
|
| using base::ValueOrDefaultForType;
|
| using base::CheckNum;
|
| +using base::CheckMax;
|
| +using base::CheckMin;
|
| using base::CheckAdd;
|
| using base::CheckSub;
|
| using base::CheckMul;
|
| @@ -38,9 +40,9 @@ using base::IsValueInRangeForNumericType;
|
| using base::IsValueNegative;
|
| using base::SizeT;
|
| using base::StrictNumeric;
|
| +using base::MakeStrictNum;
|
| using base::saturated_cast;
|
| using base::strict_cast;
|
| -using base::StrictNumeric;
|
| using base::internal::MaxExponent;
|
| using base::internal::RANGE_VALID;
|
| using base::internal::RANGE_INVALID;
|
| @@ -438,37 +440,63 @@ template <typename Dst, typename Src>
|
| void TestStrictComparison() {
|
| typedef numeric_limits<Dst> DstLimits;
|
| typedef numeric_limits<Src> SrcLimits;
|
| - static_assert(StrictNumeric<Src>(SrcLimits::min()) < DstLimits::max(), "");
|
| - static_assert(StrictNumeric<Src>(SrcLimits::min()) < SrcLimits::max(), "");
|
| - static_assert(!(StrictNumeric<Src>(SrcLimits::min()) >= DstLimits::max()),
|
| + static_assert(StrictNumeric<Src>(SrcLimits::lowest()) < DstLimits::max(), "");
|
| + static_assert(StrictNumeric<Src>(SrcLimits::lowest()) < SrcLimits::max(), "");
|
| + static_assert(!(StrictNumeric<Src>(SrcLimits::lowest()) >= DstLimits::max()),
|
| + "");
|
| + static_assert(!(StrictNumeric<Src>(SrcLimits::lowest()) >= SrcLimits::max()),
|
| + "");
|
| + static_assert(StrictNumeric<Src>(SrcLimits::lowest()) <= DstLimits::max(),
|
| + "");
|
| + static_assert(StrictNumeric<Src>(SrcLimits::lowest()) <= SrcLimits::max(),
|
| + "");
|
| + static_assert(!(StrictNumeric<Src>(SrcLimits::lowest()) > DstLimits::max()),
|
| + "");
|
| + static_assert(!(StrictNumeric<Src>(SrcLimits::lowest()) > SrcLimits::max()),
|
| "");
|
| - static_assert(!(StrictNumeric<Src>(SrcLimits::min()) >= SrcLimits::max()),
|
| + static_assert(StrictNumeric<Src>(SrcLimits::max()) > DstLimits::lowest(), "");
|
| + static_assert(StrictNumeric<Src>(SrcLimits::max()) > SrcLimits::lowest(), "");
|
| + static_assert(!(StrictNumeric<Src>(SrcLimits::max()) <= DstLimits::lowest()),
|
| "");
|
| - static_assert(StrictNumeric<Src>(SrcLimits::min()) <= DstLimits::max(), "");
|
| - static_assert(StrictNumeric<Src>(SrcLimits::min()) <= SrcLimits::max(), "");
|
| - static_assert(!(StrictNumeric<Src>(SrcLimits::min()) > DstLimits::max()), "");
|
| - static_assert(!(StrictNumeric<Src>(SrcLimits::min()) > SrcLimits::max()), "");
|
| - static_assert(StrictNumeric<Src>(SrcLimits::max()) > DstLimits::min(), "");
|
| - static_assert(StrictNumeric<Src>(SrcLimits::max()) > SrcLimits::min(), "");
|
| - static_assert(!(StrictNumeric<Src>(SrcLimits::max()) <= DstLimits::min()),
|
| + static_assert(!(StrictNumeric<Src>(SrcLimits::max()) <= SrcLimits::lowest()),
|
| "");
|
| - static_assert(!(StrictNumeric<Src>(SrcLimits::max()) <= SrcLimits::min()),
|
| + static_assert(StrictNumeric<Src>(SrcLimits::max()) >= DstLimits::lowest(),
|
| + "");
|
| + static_assert(StrictNumeric<Src>(SrcLimits::max()) >= SrcLimits::lowest(),
|
| + "");
|
| + static_assert(!(StrictNumeric<Src>(SrcLimits::max()) < DstLimits::lowest()),
|
| + "");
|
| + static_assert(!(StrictNumeric<Src>(SrcLimits::max()) < SrcLimits::lowest()),
|
| "");
|
| - static_assert(StrictNumeric<Src>(SrcLimits::max()) >= DstLimits::min(), "");
|
| - static_assert(StrictNumeric<Src>(SrcLimits::max()) >= SrcLimits::min(), "");
|
| - static_assert(!(StrictNumeric<Src>(SrcLimits::max()) < DstLimits::min()), "");
|
| - static_assert(!(StrictNumeric<Src>(SrcLimits::max()) < SrcLimits::min()), "");
|
| static_assert(StrictNumeric<Src>(static_cast<Src>(1)) == static_cast<Dst>(1),
|
| "");
|
| static_assert(StrictNumeric<Src>(static_cast<Src>(1)) != static_cast<Dst>(0),
|
| "");
|
| static_assert(StrictNumeric<Src>(SrcLimits::max()) != static_cast<Dst>(0),
|
| "");
|
| - static_assert(StrictNumeric<Src>(SrcLimits::max()) != DstLimits::min(), "");
|
| + static_assert(StrictNumeric<Src>(SrcLimits::max()) != DstLimits::lowest(),
|
| + "");
|
| static_assert(
|
| !(StrictNumeric<Src>(static_cast<Src>(1)) != static_cast<Dst>(1)), "");
|
| static_assert(
|
| !(StrictNumeric<Src>(static_cast<Src>(1)) == static_cast<Dst>(0)), "");
|
| +
|
| + // Due to differences in float handling between compilers, these aren't
|
| + // compile-time constants everywhere. So, we use run-time tests.
|
| + EXPECT_EQ(SrcLimits::max(),
|
| + CheckNum(SrcLimits::max()).Max(DstLimits::lowest()).ValueOrDie());
|
| + EXPECT_EQ(DstLimits::max(),
|
| + CheckNum(SrcLimits::lowest()).Max(DstLimits::max()).ValueOrDie());
|
| + EXPECT_EQ(DstLimits::lowest(),
|
| + CheckNum(SrcLimits::max()).Min(DstLimits::lowest()).ValueOrDie());
|
| + EXPECT_EQ(SrcLimits::lowest(),
|
| + CheckNum(SrcLimits::lowest()).Min(DstLimits::max()).ValueOrDie());
|
| + EXPECT_EQ(SrcLimits::lowest(), CheckMin(MakeStrictNum(1), CheckNum(0),
|
| + DstLimits::max(), SrcLimits::lowest())
|
| + .ValueOrDie());
|
| + EXPECT_EQ(DstLimits::max(), CheckMax(MakeStrictNum(1), CheckNum(0),
|
| + DstLimits::max(), SrcLimits::lowest())
|
| + .ValueOrDie());
|
| }
|
|
|
| template <typename Dst, typename Src>
|
|
|