[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