[libc-commits] [libc] [libc] fix -Wshift-count-overflow in UInt.h (PR #74649)
via libc-commits
libc-commits at lists.llvm.org
Wed Dec 6 12:02:23 PST 2023
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-libc
Author: Nick Desaulniers (nickdesaulniers)
<details>
<summary>Changes</summary>
Not that I'm very good at SFINAE, but it seems that conversion operators are
perhaps difficult to compose with SFINAE. I saw an example that used one layer
of indirection to have an explicit return type that could then be used with
enable_if_t.
Link: https://stackoverflow.com/a/7604580
Fixes: #<!-- -->74623
---
Full diff: https://github.com/llvm/llvm-project/pull/74649.diff
1 Files Affected:
- (modified) libc/src/__support/UInt.h (+13-7)
``````````diff
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 <size_t Bits, bool Signed> struct BigInt {
val[i] = words[i];
}
- template <typename T, typename = cpp::enable_if_t<cpp::is_integral_v<T> &&
- sizeof(T) <= 16 &&
- !cpp::is_same_v<T, bool>>>
- LIBC_INLINE constexpr explicit operator T() const {
- if constexpr (sizeof(T) <= 8)
- return static_cast<T>(val[0]);
+ template <typename T> LIBC_INLINE constexpr explicit operator T() const {
+ return to<T>();
+ }
+ template <typename T>
+ LIBC_INLINE constexpr cpp::enable_if_t<
+ cpp::is_integral_v<T> && sizeof(T) <= 8 && !cpp::is_same_v<T, bool>, T>
+ to() const {
+ return static_cast<T>(val[0]);
+ }
+ template <typename T>
+ LIBC_INLINE constexpr cpp::enable_if_t<
+ cpp::is_integral_v<T> && sizeof(T) == 16, T>
+ to() const {
// T is 128-bit.
T lo = static_cast<T>(val[0]);
@@ -121,7 +128,6 @@ template <size_t Bits, bool Signed> struct BigInt {
return lo;
}
} else {
- // TODO: silence shift warning
return static_cast<T>((static_cast<T>(val[1]) << 64) + lo);
}
}
``````````
</details>
https://github.com/llvm/llvm-project/pull/74649
More information about the libc-commits
mailing list