forked from OSchip/llvm-project
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:
parent
dbf44f5016
commit
4133584504
|
@ -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.
|
||||
|
|
Loading…
Reference in New Issue