Fix the AppVeyor (MSVC 2015-2019) build

- binary_reader: emit_signed/emit_unsigned pass integers that do not fit
  the number types to emit_float as long double, because MSVC's <cmath>
  has no integer overloads of std::isfinite (C2668 'fpclassify'), from #5607
- scalar comparisons: the friend operators take the JSON type for their
  noexcept from their parameter, because MSVC 2015/2017 take basic_json as
  the class template there (C3203) and MSVC 2019 16.0 does not see member
  types or template parameters, from #5751
- unit-conversions2: skip the !is_nothrow_constructible static_assert for
  std::optional on MSVC 2017, which evaluates the conditional noexcept as
  true (C2607), from #5754

Signed-off-by: Niels Lohmann <mail@nlohmann.me>
This commit is contained in:
Niels Lohmann
2026-10-05 12:57:44 +02:00
parent f88e209ea9
commit 98eff63537
4 changed files with 53 additions and 34 deletions
@@ -4004,7 +4004,8 @@ class binary_reader
{
return sax->number_unsigned(static_cast<number_unsigned_t>(number));
}
return emit_float(number);
// std::isfinite has no integer overloads in MSVC's <cmath>
return emit_float(static_cast<long double>(number));
}
/*!
@@ -4027,7 +4028,8 @@ class binary_reader
{
return sax->number_unsigned(static_cast<number_unsigned_t>(number));
}
return emit_float(number);
// std::isfinite has no integer overloads in MSVC's <cmath>
return emit_float(static_cast<long double>(number));
}
/*!
@@ -4038,7 +4040,8 @@ class binary_reader
and NaN in the input are passed on unchanged. Integers only overflow if
number_float_t cannot represent 2^64, e.g., a half-precision type.
@tparam NumberType a floating-point or integer type
@tparam NumberType a floating-point type (emit_signed and emit_unsigned
convert integers to long double first)
@param[in] number the number
@return whether the SAX parser accepted the value