From 4672f0f61c0cc1a90d575fcbfd7d905396f81cc6 Mon Sep 17 00:00:00 2001 From: John McCall Date: Thu, 26 Aug 2010 02:11:48 +0000 Subject: [PATCH] SmallVector's growth policies don't like starting from zero capacity. I think there are good reasons to change this, but in the interests of short-term stability, make SmallVector<...,0> reserve non-zero capacity in its constructors. This means that SmallVector<...,0> uses more memory than SmallVector<...,1> and should really only be used (unless/until this workaround is removed) by clients that care about using SmallVector with an incomplete type. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@112147 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/ADT/SmallVector.h | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/include/llvm/ADT/SmallVector.h b/include/llvm/ADT/SmallVector.h index 3be1787bc39..a76e9c77f16 100644 --- a/include/llvm/ADT/SmallVector.h +++ b/include/llvm/ADT/SmallVector.h @@ -712,25 +712,33 @@ public: /// members are required. template class SmallVector : public SmallVectorImpl { + // SmallVector doesn't like growing from zero capacity. As a + // temporary workaround, avoid changing the growth algorithm by + // forcing capacity to be at least 1 in the constructors. + public: SmallVector() : SmallVectorImpl(0) { + this->reserve(1); // workaround } explicit SmallVector(unsigned Size, const T &Value = T()) : SmallVectorImpl(0) { - this->reserve(Size); + this->reserve(Size ? Size : 1); // workaround while (Size--) this->push_back(Value); } template SmallVector(ItTy S, ItTy E) : SmallVectorImpl(0) { + if (S == E) this->reserve(1); // workaround this->append(S, E); } SmallVector(const SmallVector &RHS) : SmallVectorImpl(0) { if (!RHS.empty()) SmallVectorImpl::operator=(RHS); + else + this->reserve(1); // workaround } const SmallVector &operator=(const SmallVector &RHS) {