diff --git a/llvm/include/llvm/ADT/BitVector.h b/llvm/include/llvm/ADT/BitVector.h index 4523828d454b..9d6388f7ee61 100644 --- a/llvm/include/llvm/ADT/BitVector.h +++ b/llvm/include/llvm/ADT/BitVector.h @@ -244,9 +244,9 @@ public: if (I == E) return *this; - if (I / BITWORD_SIZE == (E-1) / BITWORD_SIZE) { - BitWord EMask = 1 << (E % BITWORD_SIZE); - BitWord IMask = 1 << (I % BITWORD_SIZE); + if (I / BITWORD_SIZE == E / BITWORD_SIZE) { + BitWord EMask = 1UL << (E % BITWORD_SIZE); + BitWord IMask = 1UL << (I % BITWORD_SIZE); BitWord Mask = EMask - IMask; Bits[I / BITWORD_SIZE] |= Mask; return *this; @@ -282,9 +282,9 @@ public: if (I == E) return *this; - if (I / BITWORD_SIZE == (E-1) / BITWORD_SIZE) { - BitWord EMask = 1 << (E % BITWORD_SIZE); - BitWord IMask = 1 << (I % BITWORD_SIZE); + if (I / BITWORD_SIZE == E / BITWORD_SIZE) { + BitWord EMask = 1UL << (E % BITWORD_SIZE); + BitWord IMask = 1UL << (I % BITWORD_SIZE); BitWord Mask = EMask - IMask; Bits[I / BITWORD_SIZE] &= ~Mask; return *this; diff --git a/llvm/unittests/ADT/BitVectorTest.cpp b/llvm/unittests/ADT/BitVectorTest.cpp index e50ff8a67a84..dc298a83d571 100644 --- a/llvm/unittests/ADT/BitVectorTest.cpp +++ b/llvm/unittests/ADT/BitVectorTest.cpp @@ -322,6 +322,16 @@ TYPED_TEST(BitVectorTest, RangeOps) { EXPECT_FALSE(D.test(0)); EXPECT_TRUE( D.test(1)); EXPECT_TRUE( D.test(2)); + + TypeParam E; + E.resize(128); + E.reset(); + E.set(1, 33); + + EXPECT_FALSE(E.test(0)); + EXPECT_TRUE( E.test(1)); + EXPECT_TRUE( E.test(32)); + EXPECT_FALSE(E.test(33)); } } #endif