summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEvgeniy Stepanov <eugeni.stepanov@gmail.com>2016-06-16 21:45:13 +0000
committerEvgeniy Stepanov <eugeni.stepanov@gmail.com>2016-06-16 21:45:13 +0000
commit57ba611520db79355422002db71787fd942b303d (patch)
tree0fefbfffd1d9382dd196a5c7f91ab717fcc5a62a
parent6d25c4fea604b98e740e59df50524d47f599aafe (diff)
Fix BitVector move ctor/assignment.
Current implementation leaves the object in an invalid state. This reverts commit bf0c389ac683cd6c0e5959b16537e59e5f4589e3. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@272965 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/llvm/ADT/BitVector.h2
-rw-r--r--unittests/ADT/BitVectorTest.cpp26
2 files changed, 28 insertions, 0 deletions
diff --git a/include/llvm/ADT/BitVector.h b/include/llvm/ADT/BitVector.h
index 95a629126f2..661437126d4 100644
--- a/include/llvm/ADT/BitVector.h
+++ b/include/llvm/ADT/BitVector.h
@@ -105,6 +105,7 @@ public:
BitVector(BitVector &&RHS)
: Bits(RHS.Bits), Size(RHS.Size), Capacity(RHS.Capacity) {
RHS.Bits = nullptr;
+ RHS.Size = RHS.Capacity = 0;
}
~BitVector() {
@@ -454,6 +455,7 @@ public:
Capacity = RHS.Capacity;
RHS.Bits = nullptr;
+ RHS.Size = RHS.Capacity = 0;
return *this;
}
diff --git a/unittests/ADT/BitVectorTest.cpp b/unittests/ADT/BitVectorTest.cpp
index 95ff93fa9c4..78fd5ce6567 100644
--- a/unittests/ADT/BitVectorTest.cpp
+++ b/unittests/ADT/BitVectorTest.cpp
@@ -399,5 +399,31 @@ TYPED_TEST(BitVectorTest, CompoundTestReset) {
C.reset(C);
EXPECT_TRUE(C.none());
}
+
+TYPED_TEST(BitVectorTest, MoveConstructor) {
+ TypeParam A(10, true);
+ TypeParam B(std::move(A));
+ // Check that the move ctor leaves the moved-from object in a valid state.
+ // The following line used to crash.
+ A = B;
+
+ TypeParam C(10, true);
+ EXPECT_EQ(C, A);
+ EXPECT_EQ(C, B);
+}
+
+TYPED_TEST(BitVectorTest, MoveAssignment) {
+ TypeParam A(10, true);
+ TypeParam B;
+ B = std::move(A);
+ // Check that move assignment leaves the moved-from object in a valid state.
+ // The following line used to crash.
+ A = B;
+
+ TypeParam C(10, true);
+ EXPECT_EQ(C, A);
+ EXPECT_EQ(C, B);
+}
+
}
#endif