Provide integer variants of isnan/isfinite to work around a quirk in MSVC standard library.

PiperOrigin-RevId: 286447750
Change-Id: I5af8054ac69782e351cff440d88824eade90f963
This commit is contained in:
Artem Belevich 2019-12-19 13:02:01 -08:00 committed by Saleem Abdulrasool
parent 66191e15dc
commit 2d5cbf1a2a

View File

@ -2611,18 +2611,37 @@ struct MinMaxFiniteValue<bfloat16> {
static double min() { return -max(); }
};
// MSVC's standard C++ library does not define isnan/isfinite for integer types.
// To work around that we will need to provide our own.
template <typename T>
std::enable_if_t<std::is_floating_point<T>::value, bool> IsFinite(T val) {
return std::isfinite(val);
}
template <typename T>
std::enable_if_t<std::is_floating_point<T>::value, bool> IsNaN(T val) {
return std::isnan(val);
}
template <typename T>
std::enable_if_t<std::is_integral<T>::value, bool> IsFinite(T val) {
return std::isfinite(static_cast<double>(val));
}
template <typename T>
std::enable_if_t<std::is_integral<T>::value, bool> IsNaN(T val) {
return std::isnan(static_cast<double>(val));
}
template <typename LiteralNativeT, typename ParsedElemT>
bool HloParserImpl::CheckParsedValueIsInRange(LocTy loc, ParsedElemT value) {
if (std::is_floating_point<ParsedElemT>::value) {
auto value_as_native_t = static_cast<LiteralNativeT>(value);
auto value_double_converted = static_cast<ParsedElemT>(value_as_native_t);
if (!std::isfinite(value) || std::isfinite(value_double_converted)) {
if (!IsFinite(value) || IsFinite(value_double_converted)) {
value = value_double_converted;
}
}
PrimitiveType literal_ty =
primitive_util::NativeToPrimitiveType<LiteralNativeT>();
if (std::isnan(value) ||
if (IsNaN(value) ||
(std::numeric_limits<ParsedElemT>::has_infinity &&
(std::numeric_limits<ParsedElemT>::infinity() == value ||
-std::numeric_limits<ParsedElemT>::infinity() == value))) {