[PATCH] D22472: Write isUInt using template specializations to work around an incorrect MSVC warning.
Justin Lebar via llvm-commits
llvm-commits at lists.llvm.org
Mon Jul 18 13:13:43 PDT 2016
jlebar created this revision.
jlebar added a reviewer: RKSimon.
jlebar added subscribers: llvm-commits, majnemer.
Per D22441, MSVC warns on our old implementation of isUInt<64>. It sees
uint64_t(1) << 64 and doesn't realize that it's not going to be
executed. Writing as a template specialization is ugly, but prevents
the warning.
https://reviews.llvm.org/D22472
Files:
include/llvm/Support/MathExtras.h
Index: include/llvm/Support/MathExtras.h
===================================================================
--- include/llvm/Support/MathExtras.h
+++ include/llvm/Support/MathExtras.h
@@ -290,10 +290,21 @@
}
/// isUInt - Checks if an unsigned integer fits into the given bit width.
-template<unsigned N>
-inline bool isUInt(uint64_t x) {
- static_assert(N > 0, "isUInt<0> doesn't make sense.");
- return N >= 64 || x < (UINT64_C(1)<<(N));
+///
+/// This is written as two functions rather than as simply
+///
+/// return N >= 64 || X < (UINT64_C(1) << N);
+///
+/// to keep MSVC from (incorrectly) warning on isUInt<64> that we're shifting
+/// left too many places.
+template <unsigned N>
+inline typename std::enable_if<(N < 64), bool>::type isUInt(uint64_t X) {
+ static_assert(N > 0, "isUInt<0> doesn't make sense");
+ return X < (UINT64_C(1) << N);
+}
+template <unsigned N>
+inline typename std::enable_if<N >= 64, bool>::type isUInt(uint64_t X) {
+ return true;
}
// Template specializations to get better code for common cases.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D22472.64370.patch
Type: text/x-patch
Size: 1052 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160718/e47a3c25/attachment.bin>
More information about the llvm-commits
mailing list