diff options
-rw-r--r-- | absl/container/internal/raw_hash_set.h | 5 | ||||
-rw-r--r-- | absl/container/internal/raw_hash_set_test.cc | 28 |
2 files changed, 4 insertions, 29 deletions
diff --git a/absl/container/internal/raw_hash_set.h b/absl/container/internal/raw_hash_set.h index d8598725..c63b60e3 100644 --- a/absl/container/internal/raw_hash_set.h +++ b/absl/container/internal/raw_hash_set.h @@ -1902,6 +1902,9 @@ ABSL_ATTRIBUTE_ALWAYS_INLINE inline void IterateOverFullSlots( ctrl += Group::kWidth; if (kAllowRemoveReentrance && *(ctrl - 1) == ctrl_t::kSentinel) { break; + } else { + assert((remaining == 0 || *(ctrl - 1) != ctrl_t::kSentinel) && + "element was erased from hash table unexpectedly"); } slot += Group::kWidth; } @@ -4061,7 +4064,7 @@ struct HashtableFreeFunctionsAccess { return 1; } size_t num_deleted = 0; - IterateOverFullSlots</*kAllowRemoveReentrance=*/true>( + IterateOverFullSlots</*kAllowRemoveReentrance=*/false>( c->common(), c->slot_array(), [&](const ctrl_t* ctrl, auto* slot) { if (pred(Set::PolicyTraits::element(slot))) { c->destroy(slot); diff --git a/absl/container/internal/raw_hash_set_test.cc b/absl/container/internal/raw_hash_set_test.cc index 9b13701f..2a6ee656 100644 --- a/absl/container/internal/raw_hash_set_test.cc +++ b/absl/container/internal/raw_hash_set_test.cc @@ -3121,34 +3121,6 @@ TYPED_TEST(SooTest, EraseIfPartial) { } } -// Test that we are allowed to erase during the callback in erase_if. -// TODO(b/345744331): Consider to change behavior to disallow erasure in the -// callback. -TYPED_TEST(SooTest, EraseIfReentry) { - for (int size = 0; size < 100; ++size) { - SCOPED_TRACE(absl::StrCat(size)); - TypeParam t; - std::vector<int64_t> expected; - for (int i = 0; i < size; ++i) { - t.insert(i); - if (i % 4 == 1 || i % 4 == 2) { - expected.push_back(i); - } - } - auto pred = [&](const auto& x) { - auto value = static_cast<int64_t>(x); - int64_t group = value / 4; - t.erase(group * 4); - if (value % 4 == 3) { - return true; - } - return false; - }; - absl::container_internal::EraseIf(pred, &t); - ASSERT_THAT(t, testing::UnorderedElementsAreArray(expected)); - } -} - TEST(Table, EraseBeginEndResetsReservedGrowth) { bool frozen = false; BadHashFreezableIntTable t{FreezableAlloc<int64_t>(&frozen)}; |