Make BitVector::operator== return false for different-sized vectors.

This behaviour is in line with SmallBitVector and other vector-like
types.

Reviewed By: dblaikie

Differential Revision: https://reviews.llvm.org/D77027
This commit is contained in:
Brad Moody 2020-04-09 20:15:49 -05:00 committed by Michael Kruse
parent 60c642e74b
commit 27f1895f53
2 changed files with 22 additions and 18 deletions

View File

@ -532,24 +532,10 @@ public:
// Comparison operators.
bool operator==(const BitVector &RHS) const {
unsigned ThisWords = NumBitWords(size());
unsigned RHSWords = NumBitWords(RHS.size());
unsigned i;
for (i = 0; i != std::min(ThisWords, RHSWords); ++i)
if (Bits[i] != RHS.Bits[i])
if (size() != RHS.size())
return false;
// Verify that any extra words are all zeros.
if (i != ThisWords) {
for (; i != ThisWords; ++i)
if (Bits[i])
return false;
} else if (i != RHSWords) {
for (; i != RHSWords; ++i)
if (RHS.Bits[i])
return false;
}
return true;
unsigned NumWords = NumBitWords(size());
return Bits.take_front(NumWords) == RHS.Bits.take_front(NumWords);
}
bool operator!=(const BitVector &RHS) const {

View File

@ -179,6 +179,24 @@ TYPED_TEST(BitVectorTest, TrivialOperation) {
EXPECT_TRUE(Vec.empty());
}
TYPED_TEST(BitVectorTest, Equality) {
TypeParam A;
TypeParam B;
EXPECT_TRUE(A == B);
A.resize(10);
EXPECT_FALSE(A == B);
B.resize(10);
EXPECT_TRUE(A == B);
A.set(5);
EXPECT_FALSE(A == B);
B.set(5);
EXPECT_TRUE(A == B);
A.resize(20);
EXPECT_FALSE(A == B);
B.resize(20);
EXPECT_TRUE(A == B);
}
TYPED_TEST(BitVectorTest, SimpleFindOpsMultiWord) {
TypeParam A;