diff --git a/libc/src/__support/UInt.h b/libc/src/__support/UInt.h index 3bec2e3a47130..f72b995f8788d 100644 --- a/libc/src/__support/UInt.h +++ b/libc/src/__support/UInt.h @@ -103,13 +103,20 @@ template struct BigInt { val[i] = words[i]; } - template && - sizeof(T) <= 16 && - !cpp::is_same_v>> - LIBC_INLINE constexpr explicit operator T() const { - if constexpr (sizeof(T) <= 8) - return static_cast(val[0]); + template LIBC_INLINE constexpr explicit operator T() const { + return to(); + } + template + LIBC_INLINE constexpr cpp::enable_if_t< + cpp::is_integral_v && sizeof(T) <= 8 && !cpp::is_same_v, T> + to() const { + return static_cast(val[0]); + } + template + LIBC_INLINE constexpr cpp::enable_if_t< + cpp::is_integral_v && sizeof(T) == 16, T> + to() const { // T is 128-bit. T lo = static_cast(val[0]); @@ -121,7 +128,6 @@ template struct BigInt { return lo; } } else { - // TODO: silence shift warning return static_cast((static_cast(val[1]) << 64) + lo); } }