Fix a bug in the set(I,E)/reset(I,E) methods that I recently added. The boundary...
authorOwen Anderson <resistor@mac.com>
Tue, 16 Oct 2012 06:04:27 +0000 (06:04 +0000)
committerOwen Anderson <resistor@mac.com>
Tue, 16 Oct 2012 06:04:27 +0000 (06:04 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@166015 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/ADT/BitVector.h
unittests/ADT/BitVectorTest.cpp

index 4523828d454bb88c1e3215258c932d7e9f4ea944..9d6388f7ee614dc8b25e846bd05013d01147cd09 100644 (file)
@@ -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;
index e50ff8a67a84ecb2458ad0cce6dfb280659501c2..dc298a83d571a7ed0c810a05f4b746e8d676733f 100644 (file)
@@ -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