[libc-commits] [libc] [libc] Fixing float128 UB error (PR #211593)
via libc-commits
libc-commits at lists.llvm.org
Thu Jul 30 09:24:06 PDT 2026
================
@@ -69,13 +70,29 @@ struct Float128 {
template <typename T, cpp::enable_if_t<cpp::is_integral_v<T>, int> = 0>
LIBC_INLINE constexpr explicit operator T() const {
+ constexpr T MIN_T = cpp::numeric_limits<T>::min();
+ constexpr T MAX_T = cpp::numeric_limits<T>::max();
FPBits<Float128> x_bits(*this);
// Raise FE_INVALID for inf and NaN
if (x_bits.is_inf_or_nan()) {
raise_except_if_required(FE_INVALID);
+ return x_bits.is_neg() ? MIN_T : MAX_T;
}
- int x_bits_exp =
- x_bits.get_explicit_exponent() - FPBits<Float128>::FRACTION_LEN;
+ int exponent = x_bits.get_explicit_exponent();
+ constexpr int EXPONENT_LIMIT = cpp::is_signed_v<T>
+ ? static_cast<int>(sizeof(T) * 8) - 1
+ : static_cast<int>(sizeof(T) * 8);
----------------
overmighty wrote:
```suggestion
constexpr int EXPONENT_LIMIT = cpp::numeric_limits<T>::digits;
```
https://github.com/llvm/llvm-project/pull/211593
More information about the libc-commits
mailing list