Index: llvm/include/llvm/ADT/SmallVector.h =================================================================== --- llvm/include/llvm/ADT/SmallVector.h +++ llvm/include/llvm/ADT/SmallVector.h @@ -521,11 +521,11 @@ } void resize(size_type N, const T &NV) { - this->assertSafeToReferenceAfterResize(&NV, N); if (N < this->size()) { this->destroy_range(this->begin()+N, this->end()); this->set_size(N); } else if (N > this->size()) { + this->assertSafeToReferenceAfterResize(&NV, N); if (this->capacity() < N) this->grow(N); std::uninitialized_fill(this->end(), this->begin()+N, NV); Index: llvm/unittests/ADT/SmallVectorTest.cpp =================================================================== --- llvm/unittests/ADT/SmallVectorTest.cpp +++ llvm/unittests/ADT/SmallVectorTest.cpp @@ -1060,9 +1060,13 @@ TYPED_TEST(SmallVectorReferenceInvalidationTest, Resize) { auto &V = this->V; (void)V; + int N = this->NumBuiltinElts(V); #if !defined(NDEBUG) && GTEST_HAS_DEATH_TEST - EXPECT_DEATH(V.resize(2, V.back()), this->AssertionMessage); + EXPECT_DEATH(V.resize(N + 1, V.back()), this->AssertionMessage); #endif + + // No assertion when shrinking, since the parameter isn't accessed. + V.resize(N - 1, V.back()); } TYPED_TEST(SmallVectorReferenceInvalidationTest, Append) {