diff options
author | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2016-06-16 21:45:13 +0000 |
---|---|---|
committer | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2016-06-16 21:45:13 +0000 |
commit | 57ba611520db79355422002db71787fd942b303d (patch) | |
tree | 0fefbfffd1d9382dd196a5c7f91ab717fcc5a62a | |
parent | 6d25c4fea604b98e740e59df50524d47f599aafe (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.h | 2 | ||||
-rw-r--r-- | unittests/ADT/BitVectorTest.cpp | 26 |
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 |