Fix BitVector move ctor/assignment.

Current implementation leaves the object in an invalid state.

This reverts commit bf0c389ac683cd6c0e5959b16537e59e5f4589e3.

llvm-svn: 272965
This commit is contained in:
Evgeniy Stepanov 2016-06-16 21:45:13 +00:00
parent 8dad57cc49
commit 660b1a49dc
2 changed files with 28 additions and 0 deletions

View File

@ -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;
}

View File

@ -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