From ffd79061ccfea4c884d4d2646992aa30cf6514a2 Mon Sep 17 00:00:00 2001 From: Chandler Carruth Date: Tue, 26 Nov 2013 00:54:44 +0000 Subject: [PATCH] Lift self-copy protection up to the header file and add self-move protection to the same layer. This is in line with Howard's advice on how best to handle self-move assignment as he explained on SO[1]. It also ensures that implementing swap with move assignment continues to work in the case of self-swap. [1]: http://stackoverflow.com/questions/9322174/move-assignment-operator-and-if-this-rhs git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@195705 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/ADT/SmallPtrSet.h | 6 ++++-- lib/Support/SmallPtrSet.cpp | 5 +++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/include/llvm/ADT/SmallPtrSet.h b/include/llvm/ADT/SmallPtrSet.h index c7f5e5bfc0f..b52aebf7d55 100644 --- a/include/llvm/ADT/SmallPtrSet.h +++ b/include/llvm/ADT/SmallPtrSet.h @@ -293,14 +293,16 @@ public: SmallPtrSet & operator=(const SmallPtrSet &RHS) { - CopyFrom(RHS); + if (&RHS != this) + CopyFrom(RHS); return *this; } #if LLVM_HAS_RVALUE_REFERENCES SmallPtrSet& operator=(SmallPtrSet &&RHS) { - MoveFrom(SmallSizePowTwo, std::move(RHS)); + if (&RHS != this) + MoveFrom(SmallSizePowTwo, std::move(RHS)); return *this; } #endif diff --git a/lib/Support/SmallPtrSet.cpp b/lib/Support/SmallPtrSet.cpp index fa8d91545e7..f873d91d6e0 100644 --- a/lib/Support/SmallPtrSet.cpp +++ b/lib/Support/SmallPtrSet.cpp @@ -218,8 +218,7 @@ SmallPtrSetImpl::SmallPtrSetImpl(const void **SmallStorage, unsigned SmallSize, /// CopyFrom - implement operator= from a smallptrset that has the same pointer /// type, but may have a different small size. void SmallPtrSetImpl::CopyFrom(const SmallPtrSetImpl &RHS) { - if (&RHS == this) - return; + assert(&RHS != this && "Self-copy should be handled by the caller."); if (isSmall() && RHS.isSmall()) assert(CurArraySize == RHS.CurArraySize && @@ -256,6 +255,8 @@ void SmallPtrSetImpl::CopyFrom(const SmallPtrSetImpl &RHS) { #if LLVM_HAS_RVALUE_REFERENCES void SmallPtrSetImpl::MoveFrom(unsigned SmallSize, SmallPtrSetImpl &&RHS) { + assert(&RHS != this && "Self-move should be handled by the caller."); + if (!isSmall()) free(CurArray); -- 2.34.1