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:
parent
66191e15dc
commit
2d5cbf1a2a
@ -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))) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user