summaryrefslogtreecommitdiff
path: root/absl
diff options
context:
space:
mode:
authorGravatar Evan Brown <ezb@google.com>2022-12-22 14:59:02 -0800
committerGravatar Copybara-Service <copybara-worker@google.com>2022-12-22 14:59:54 -0800
commitf7affaf32a6a396465507dd10520a3fe183d4e40 (patch)
tree6d62a7c86602c57cbfdf2dff2e31d3cb56c0f6dd /absl
parent8d77ac515bdd189b27d5006ee058c8898ceb756b (diff)
Fix a bug in iterator validation code in which we don't update the table's reserved growth if the reservation wouldn't grow the table.
PiperOrigin-RevId: 497246219 Change-Id: I9671236f56d10851c49de71c21899368be6c3a00
Diffstat (limited to 'absl')
-rw-r--r--absl/container/internal/raw_hash_set.h2
-rw-r--r--absl/container/internal/raw_hash_set_test.cc15
2 files changed, 16 insertions, 1 deletions
diff --git a/absl/container/internal/raw_hash_set.h b/absl/container/internal/raw_hash_set.h
index ad4c2cc5..3762820d 100644
--- a/absl/container/internal/raw_hash_set.h
+++ b/absl/container/internal/raw_hash_set.h
@@ -2064,8 +2064,8 @@ class raw_hash_set {
// This is after resize, to ensure that we have completed the allocation
// and have potentially sampled the hashtable.
infoz().RecordReservation(n);
- common().reset_reserved_growth(n);
}
+ common().reset_reserved_growth(n);
}
// Extension API: support for heterogeneous keys.
diff --git a/absl/container/internal/raw_hash_set_test.cc b/absl/container/internal/raw_hash_set_test.cc
index 3bfb15f1..8096567c 100644
--- a/absl/container/internal/raw_hash_set_test.cc
+++ b/absl/container/internal/raw_hash_set_test.cc
@@ -2292,6 +2292,21 @@ TEST(Table, InvalidIteratorUseWithReserve) {
EXPECT_DEATH_IF_SUPPORTED(*it, kInvalidIteratorDeathMessage);
}
+TEST(Table, ReservedGrowthUpdatesWhenTableDoesntGrow) {
+ IntTable t;
+ for (int i = 0; i < 8; ++i) t.insert(i);
+ // Want to insert twice without invalidating iterators so reserve.
+ const size_t cap = t.capacity();
+ t.reserve(t.size() + 2);
+ // We want to be testing the case in which the reserve doesn't grow the table.
+ ASSERT_EQ(cap, t.capacity());
+ auto it = t.find(0);
+ t.insert(100);
+ t.insert(200);
+ // `it` shouldn't have been invalidated.
+ EXPECT_EQ(*it, 0);
+}
+
} // namespace
} // namespace container_internal
ABSL_NAMESPACE_END