From 1fe24a640c2837fbbfb03add122cb3b045914416 Mon Sep 17 00:00:00 2001 From: "Duncan P. N. Exon Smith" Date: Wed, 18 Nov 2020 18:57:50 -0800 Subject: [PATCH] ADT: Split out isSafeToReferenceAfterResize helper to use early returns, NFC The assertion logic in SmallVector::assertSafeToReferenceAfterResize is hard to follow; split out SmallVector::isSafeToReferenceAfterResize and add early returns and comments. No functionality change here. --- llvm/include/llvm/ADT/SmallVector.h | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/llvm/include/llvm/ADT/SmallVector.h b/llvm/include/llvm/ADT/SmallVector.h index ed329aa..c5bb1ec 100644 --- a/llvm/include/llvm/ADT/SmallVector.h +++ b/llvm/include/llvm/ADT/SmallVector.h @@ -136,12 +136,24 @@ protected: this->Size = this->Capacity = 0; // FIXME: Setting Capacity to 0 is suspect. } + /// Return true unless Elt will be invalidated by resizing the vector to + /// NewSize. + bool isSafeToReferenceAfterResize(const void *Elt, size_t NewSize) { + // Past the end. + if (LLVM_LIKELY(Elt < this->begin() || Elt >= this->end())) + return true; + + // Return false if Elt will be destroyed by shrinking. + if (NewSize <= this->size()) + return Elt < this->begin() + NewSize; + + // Return false if we need to grow. + return NewSize <= this->capacity(); + } + /// Check whether Elt will be invalidated by resizing the vector to NewSize. void assertSafeToReferenceAfterResize(const void *Elt, size_t NewSize) { - assert((Elt >= this->end() || - (NewSize <= this->size() - ? Elt < this->begin() + NewSize - : (Elt < this->begin() || NewSize <= this->capacity()))) && + assert(isSafeToReferenceAfterResize(Elt, NewSize) && "Attempting to reference an element of the vector in an operation " "that invalidates it"); } -- 2.7.4