diff --git a/llvm/include/llvm/ADT/SmallVector.h b/llvm/include/llvm/ADT/SmallVector.h --- a/llvm/include/llvm/ADT/SmallVector.h +++ b/llvm/include/llvm/ADT/SmallVector.h @@ -136,6 +136,13 @@ this->Size = this->Capacity = 0; // FIXME: Setting Capacity to 0 is suspect. } + void assertSafeToPush(const void *Elt) { + assert( + (Elt < begin() || Elt >= end() || this->size() < this->capacity()) && + "Attempting to push_back to the vector an element of the vector without" + " enough space reserved"); + } + public: using size_type = size_t; using difference_type = ptrdiff_t; @@ -251,6 +258,7 @@ public: void push_back(const T &Elt) { + this->assertSafeToPush(&Elt); if (LLVM_UNLIKELY(this->size() >= this->capacity())) this->grow(); ::new ((void*) this->end()) T(Elt); @@ -258,6 +266,7 @@ } void push_back(T &&Elt) { + this->assertSafeToPush(&Elt); if (LLVM_UNLIKELY(this->size() >= this->capacity())) this->grow(); ::new ((void*) this->end()) T(::std::move(Elt)); @@ -353,6 +362,7 @@ public: void push_back(const T &Elt) { + this->assertSafeToPush(&Elt); if (LLVM_UNLIKELY(this->size() >= this->capacity())) this->grow(); memcpy(reinterpret_cast(this->end()), &Elt, sizeof(T)); diff --git a/llvm/include/llvm/MC/MCInst.h b/llvm/include/llvm/MC/MCInst.h --- a/llvm/include/llvm/MC/MCInst.h +++ b/llvm/include/llvm/MC/MCInst.h @@ -181,7 +181,7 @@ MCOperand &getOperand(unsigned i) { return Operands[i]; } unsigned getNumOperands() const { return Operands.size(); } - void addOperand(const MCOperand &Op) { Operands.push_back(Op); } + void addOperand(const MCOperand Op) { Operands.push_back(Op); } using iterator = SmallVectorImpl::iterator; using const_iterator = SmallVectorImpl::const_iterator;