diff options
author | Evan Brown <ezb@google.com> | 2022-11-10 13:00:02 -0800 |
---|---|---|
committer | Copybara-Service <copybara-worker@google.com> | 2022-11-10 13:00:41 -0800 |
commit | 04658377111baab53430755431b2b9b4da925e5c (patch) | |
tree | 7d8f52ce8e5493d4e186d322e738ee6c05784c2c /absl/container/btree_test.cc | |
parent | cc143ed36913a55622411bb8be8c80f53a9ca1ea (diff) | |
download | abseil-04658377111baab53430755431b2b9b4da925e5c.tar.gz abseil-04658377111baab53430755431b2b9b4da925e5c.tar.bz2 abseil-04658377111baab53430755431b2b9b4da925e5c.zip |
Improve error messages when comparing btree iterators.
- Add assertions that the iterators are either (a) from the same container or (b) both default constructed. Standard says: "The domain of == for forward iterators is that of iterators over the same underlying sequence. However, value-initialized iterators may be compared and shall compare equal to other value-initialized iterators of the same type." - [reference](https://eel.is/c++draft/forward.iterators#2).
- Also optimize IsEndIterator a bit.
PiperOrigin-RevId: 487617518
Change-Id: Iefba5c3bc8caa93954671793e6929e22f419c298
Diffstat (limited to 'absl/container/btree_test.cc')
-rw-r--r-- | absl/container/btree_test.cc | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/absl/container/btree_test.cc b/absl/container/btree_test.cc index 05bbcf2f..404ccde7 100644 --- a/absl/container/btree_test.cc +++ b/absl/container/btree_test.cc @@ -3358,6 +3358,31 @@ TEST(Btree, DereferencingEndIterator) { EXPECT_DEATH(*set.end(), R"regex(Dereferencing end\(\) iterator)regex"); } +TEST(Btree, InvalidIteratorComparison) { + if (!IsAssertEnabled()) GTEST_SKIP() << "Assertions not enabled."; + + absl::btree_set<int> set1, set2; + for (int i = 0; i < 1000; ++i) { + set1.insert(i); + set2.insert(i); + } + + constexpr const char *kValueInitDeathMessage = + "Comparing default-constructed iterator with .*non-default-constructed " + "iterator"; + typename absl::btree_set<int>::iterator iter1, iter2; + EXPECT_EQ(iter1, iter2); + EXPECT_DEATH(void(set1.begin() == iter1), kValueInitDeathMessage); + EXPECT_DEATH(void(iter1 == set1.begin()), kValueInitDeathMessage); + + constexpr const char *kDifferentContainerDeathMessage = + "Comparing iterators from different containers"; + iter1 = set1.begin(); + iter2 = set2.begin(); + EXPECT_DEATH(void(iter1 == iter2), kDifferentContainerDeathMessage); + EXPECT_DEATH(void(iter2 == iter1), kDifferentContainerDeathMessage); +} + } // namespace } // namespace container_internal ABSL_NAMESPACE_END |