[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