diff options
author | Chris Lattner <sabre@nondot.org> | 2007-10-11 06:12:33 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2007-10-11 06:12:33 +0000 |
commit | c004023b0dc1fe12bdcfcd771d98674ac2d8a41f (patch) | |
tree | f3fb171763659a43c2b5782703d07faebbdd3574 /include | |
parent | 34c0acb8d79bea365cda272af96c0b94cbdeb8ac (diff) | |
download | external_llvm-c004023b0dc1fe12bdcfcd771d98674ac2d8a41f.zip external_llvm-c004023b0dc1fe12bdcfcd771d98674ac2d8a41f.tar.gz external_llvm-c004023b0dc1fe12bdcfcd771d98674ac2d8a41f.tar.bz2 |
make bitvector &= do the right thing if vectors have mismatched length.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@42860 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include')
-rw-r--r-- | include/llvm/ADT/BitVector.h | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/include/llvm/ADT/BitVector.h b/include/llvm/ADT/BitVector.h index 50ccdab..dc408af 100644 --- a/include/llvm/ADT/BitVector.h +++ b/include/llvm/ADT/BitVector.h @@ -274,9 +274,18 @@ public: // Intersection, union, disjoint union. BitVector operator&=(const BitVector &RHS) { - assert(Size == RHS.Size && "Illegal operation!"); - for (unsigned i = 0; i < NumBitWords(size()); ++i) + unsigned ThisWords = NumBitWords(size()); + unsigned RHSWords = NumBitWords(RHS.size()); + unsigned i; + for (i = 0; i != std::min(ThisWords, RHSWords); ++i) Bits[i] &= RHS.Bits[i]; + + // Any bits that are just in this bitvector become zero, because they aren't + // in the RHS bit vector. Any words only in RHS are ignored because they + // are already zero in the LHS. + for (; i != ThisWords; ++i) + Bits[i] = 0; + return *this; } |