Fix bug in UnionIfNotIn.
Bug: 18066207
Change-Id: Ib9b24802546403b3d5a4da19996034eb45601f53
diff --git a/runtime/base/bit_vector.cc b/runtime/base/bit_vector.cc
index 3d2f0de..1d67962 100644
--- a/runtime/base/bit_vector.cc
+++ b/runtime/base/bit_vector.cc
@@ -145,10 +145,7 @@
// Is the storage size smaller than src's?
if (storage_size_ < union_with_size) {
- changed = true;
-
- // Set it to reallocate.
- SetBit(highest_bit);
+ EnsureSize(highest_bit);
// Paranoid: storage size should be big enough to hold this bit now.
DCHECK_LT(static_cast<uint32_t> (highest_bit), storage_size_ * kWordBits);
diff --git a/runtime/base/bit_vector_test.cc b/runtime/base/bit_vector_test.cc
index df5d79d..31fd0e7 100644
--- a/runtime/base/bit_vector_test.cc
+++ b/runtime/base/bit_vector_test.cc
@@ -141,4 +141,30 @@
EXPECT_EQ(64u, bv.NumSetBits());
}
+TEST(BitVector, UnionIfNotIn) {
+ {
+ BitVector first(2, true, Allocator::GetMallocAllocator());
+ BitVector second(5, true, Allocator::GetMallocAllocator());
+ BitVector third(5, true, Allocator::GetMallocAllocator());
+
+ second.SetBit(64);
+ third.SetBit(64);
+ bool changed = first.UnionIfNotIn(&second, &third);
+ EXPECT_EQ(0u, first.NumSetBits());
+ EXPECT_FALSE(changed);
+ }
+
+ {
+ BitVector first(2, true, Allocator::GetMallocAllocator());
+ BitVector second(5, true, Allocator::GetMallocAllocator());
+ BitVector third(5, true, Allocator::GetMallocAllocator());
+
+ second.SetBit(64);
+ bool changed = first.UnionIfNotIn(&second, &third);
+ EXPECT_EQ(1u, first.NumSetBits());
+ EXPECT_TRUE(changed);
+ EXPECT_TRUE(first.IsBitSet(64));
+ }
+}
+
} // namespace art