summaryrefslogtreecommitdiff
path: root/absl
diff options
context:
space:
mode:
authorGravatar Abseil Team <absl-team@google.com>2020-10-08 08:27:41 -0700
committerGravatar Mark Barolak <mbar@google.com>2020-10-08 11:34:42 -0400
commite63a5a61045e516b7b3dbca090e2b9ff1d057e46 (patch)
treebc64a59cf7693ef7a2fcb6560f2447ea4f03f18b /absl
parentc678d6c6bf70d47b4aa5bc3576a3a769775bc162 (diff)
Export of internal Abseil changes
-- 430bda42820b619b346201bc42769d014228e825 by Gennadiy Rozental <rogeeff@google.com>: Update version for CMake and Bazel PiperOrigin-RevId: 336089889 -- 0a36f989acb0e6f7d2f04039c600b0934c44ffed by Abseil Team <absl-team@google.com>: changes how non-equality is evaluated absl::c_mismatch is based on std::mismatch, which requires that its iterators' reference types meet the requirements of Cpp17EqualityComparable[1]. The previous CL mistakenly wrote absl::c_mismatch using `*first1 != *first2` which assumes that the reference types model std::equality_comparable[2] (which was only added in C++20). This CL reverts that behaviour. [0]: http://wg21.link/mismatch [1]: http://wg21.link/utility.arg.requirements#tab:cpp17.equalitycomparable [2]: http://wg21.link/concept.equalitycomparable PiperOrigin-RevId: 335897465 -- 7cb902f079838081a15f8b72e0cef46beab653f2 by Derek Mauro <dmauro@google.com>: Disable a raw_hash_map_allocator.cc test that doesn't build due to a noexcept bug in gcc 5.4 and 5.5 PiperOrigin-RevId: 335876843 GitOrigin-RevId: 430bda42820b619b346201bc42769d014228e825 Change-Id: I94d5b8e03e0a91d81923aa831f6f63c625e0b836
Diffstat (limited to 'absl')
-rw-r--r--absl/algorithm/container.h4
-rw-r--r--absl/algorithm/container_test.cc11
-rw-r--r--absl/container/internal/raw_hash_set_allocator_test.cc4
3 files changed, 18 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) {
diff --git a/absl/container/internal/raw_hash_set_allocator_test.cc b/absl/container/internal/raw_hash_set_allocator_test.cc
index 1a036085..e73f53fd 100644
--- a/absl/container/internal/raw_hash_set_allocator_test.cc
+++ b/absl/container/internal/raw_hash_set_allocator_test.cc
@@ -466,6 +466,9 @@ class PAlloc {
size_t id_ = std::numeric_limits<size_t>::max();
};
+// This doesn't compile with GCC 5.4 and 5.5 due to a bug in noexcept handing.
+#if !defined(__GNUC__) || __GNUC__ != 5 || (__GNUC_MINOR__ != 4 && \
+ __GNUC_MINOR__ != 5)
TEST(NoPropagateOn, Swap) {
using PA = PAlloc<char>;
using Table = raw_hash_set<Policy, Identity, std::equal_to<int32_t>, PA>;
@@ -475,6 +478,7 @@ TEST(NoPropagateOn, Swap) {
EXPECT_EQ(t1.get_allocator(), PA(1));
EXPECT_EQ(t2.get_allocator(), PA(2));
}
+#endif
TEST(NoPropagateOn, CopyConstruct) {
using PA = PAlloc<char>;