Index: base/numerics/safe_math.h |
diff --git a/base/numerics/safe_math.h b/base/numerics/safe_math.h |
index 78b88326c44bdf697091f4ea74232b71a434788a..6b5d4c2a99e47fe315a849752d10d78b9b0f9440 100644 |
--- a/base/numerics/safe_math.h |
+++ b/base/numerics/safe_math.h |
@@ -131,8 +131,8 @@ class CheckedNumeric { |
// template parameter, for test code, etc. However, the handler cannot access |
// the underlying value, and it is not available through other means. |
template <typename Dst = T, class CheckHandler = CheckOnFailure> |
- constexpr Dst ValueOrDie() const { |
- return IsValid<Dst>() ? state_.value() |
+ constexpr StrictNumeric<Dst> ValueOrDie() const { |
+ return IsValid<Dst>() ? static_cast<Dst>(state_.value()) |
: CheckHandler::template HandleFailure<Dst>(); |
} |
@@ -143,8 +143,9 @@ class CheckedNumeric { |
// parameter. WARNING: This function may fail to compile or CHECK at runtime |
// if the supplied default_value is not within range of the destination type. |
template <typename Dst = T, typename Src> |
- constexpr Dst ValueOrDefault(const Src default_value) const { |
- return IsValid<Dst>() ? state_.value() : checked_cast<Dst>(default_value); |
+ constexpr StrictNumeric<Dst> ValueOrDefault(const Src default_value) const { |
+ return IsValid<Dst>() ? static_cast<Dst>(state_.value()) |
+ : checked_cast<Dst>(default_value); |
} |
// ValueFloating() - Since floating point values include their validity state, |
@@ -153,7 +154,7 @@ class CheckedNumeric { |
// A range checked destination type can be supplied using the Dst template |
// parameter. |
template <typename Dst = T> |
- constexpr Dst ValueFloating() const { |
+ constexpr StrictNumeric<Dst> ValueFloating() const { |
static_assert(std::numeric_limits<T>::is_iec559, |
"Type must be floating point."); |
static_assert(std::numeric_limits<Dst>::is_iec559, |