summaryrefslogtreecommitdiff
path: root/absl/algorithm
diff options
context:
space:
mode:
Diffstat (limited to 'absl/algorithm')
-rw-r--r--absl/algorithm/container.h4
-rw-r--r--absl/algorithm/container_test.cc11
2 files changed, 14 insertions, 1 deletions
diff --git a/absl/algorithm/container.h b/absl/algorithm/container.h
index 3c4fd733..bb3d1c7c 100644
--- a/absl/algorithm/container.h
+++ b/absl/algorithm/container.h
@@ -351,7 +351,9 @@ c_mismatch(C1& c1, C2& c2) {
auto last2 = container_algorithm_internal::c_end(c2);
for (; first1 != last1 && first2 != last2; ++first1, (void)++first2) {
- if (*first1 != *first2) {
+ // Negates equality because Cpp17EqualityComparable doesn't require clients
+ // to overload both `operator==` and `operator!=`.
+ if (!(*first1 == *first2)) {
break;
}
}
diff --git a/absl/algorithm/container_test.cc b/absl/algorithm/container_test.cc
index fb940560..605afc80 100644
--- a/absl/algorithm/container_test.cc
+++ b/absl/algorithm/container_test.cc
@@ -183,6 +183,17 @@ TEST_F(NonMutatingTest, Mismatch) {
EXPECT_EQ(result.first, sequence_.end());
EXPECT_EQ(result.second, std::prev(vector_.end()));
}
+ {
+ struct NoNotEquals {
+ constexpr bool operator==(NoNotEquals) const { return true; }
+ constexpr bool operator!=(NoNotEquals) const = delete;
+ };
+ std::vector<NoNotEquals> first;
+ std::list<NoNotEquals> second;
+
+ // Check this still compiles.
+ absl::c_mismatch(first, second);
+ }
}
TEST_F(NonMutatingTest, MismatchWithPredicate) {