aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--absl/container/internal/raw_hash_set.h5
-rw-r--r--absl/container/internal/raw_hash_set_test.cc28
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)};