Changes imported from Abseil "staging" branch:
- 95e20a66bfa6104937ec92722b04a9c0ca0443dc Make ThrowingBool convertible to bool. by Xiaoyi Zhang <zhangxy@google.com>
GitOrigin-RevId: 95e20a66bfa6104937ec92722b04a9c0ca0443dc
Change-Id: I7a1dcb53b0764b24482ee1886276b267c8cb83c2
diff --git a/absl/base/exception_safety_testing_test.cc b/absl/base/exception_safety_testing_test.cc
index 5477b40..f8baf20 100644
--- a/absl/base/exception_safety_testing_test.cc
+++ b/absl/base/exception_safety_testing_test.cc
@@ -18,6 +18,7 @@
#include <exception>
#include <iostream>
#include <list>
+#include <type_traits>
#include <vector>
#include "gtest/gtest-spi.h"
@@ -683,6 +684,18 @@
new (&storage) Tracked;
},
"re-constructed");
+ reinterpret_cast<Tracked*>(&storage)->~Tracked();
}
+
+TEST(ThrowingValueTraitsTest, RelationalOperators) {
+ ThrowingValue<> a, b;
+ EXPECT_TRUE((std::is_convertible<decltype(a == b), bool>::value));
+ EXPECT_TRUE((std::is_convertible<decltype(a != b), bool>::value));
+ EXPECT_TRUE((std::is_convertible<decltype(a < b), bool>::value));
+ EXPECT_TRUE((std::is_convertible<decltype(a <= b), bool>::value));
+ EXPECT_TRUE((std::is_convertible<decltype(a > b), bool>::value));
+ EXPECT_TRUE((std::is_convertible<decltype(a >= b), bool>::value));
+}
+
} // namespace
} // namespace absl
diff --git a/absl/base/internal/exception_safety_testing.h b/absl/base/internal/exception_safety_testing.h
index 8eac226..adee848 100644
--- a/absl/base/internal/exception_safety_testing.h
+++ b/absl/base/internal/exception_safety_testing.h
@@ -203,12 +203,12 @@
inline void SetCountdown() { exceptions_internal::countdown = 0; }
inline void UnsetCountdown() { exceptions_internal::countdown = -1; }
-// A test class which is contextually convertible to bool. The conversion can
-// be instrumented to throw at a controlled time.
+// A test class which is convertible to bool. The conversion can be
+// instrumented to throw at a controlled time.
class ThrowingBool {
public:
ThrowingBool(bool b) noexcept : b_(b) {} // NOLINT(runtime/explicit)
- explicit operator bool() const {
+ operator bool() const { // NOLINT(runtime/explicit)
exceptions_internal::MaybeThrow(ABSL_PRETTY_FUNCTION);
return b_;
}
@@ -355,6 +355,8 @@
}
// Comparison Operators
+ // NOTE: We use `ThrowingBool` instead of `bool` because most STL
+ // types/containers requires T to be convertible to bool.
friend ThrowingBool operator==(const ThrowingValue& a,
const ThrowingValue& b) {
exceptions_internal::MaybeThrow(ABSL_PRETTY_FUNCTION);