Write isUInt using template specializations to work around an incorrect MSVC warning.

Summary:
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.

Reviewers: RKSimon

Subscribers: majnemer, llvm-commits

Differential Revision: https://reviews.llvm.org/D22472

llvm-svn: 275909
This commit is contained in:
Justin Lebar 2016-07-18 20:40:35 +00:00
parent dbf44f5016
commit 4133584504
1 changed files with 15 additions and 4 deletions

View File

@ -290,10 +290,21 @@ inline bool isShiftedInt(int64_t x) {
}
/// 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.