|
|
|
@ -754,26 +754,23 @@ TEST(AnyTest, FailedCopy) { |
|
|
|
|
|
|
|
|
|
// Test the guarantees regarding exceptions in emplace.
|
|
|
|
|
TEST(AnyTest, FailedEmplace) { |
|
|
|
|
{ |
|
|
|
|
BadCopyable bad; |
|
|
|
|
absl::any target; |
|
|
|
|
ABSL_ANY_TEST_EXPECT_BAD_COPY(target.emplace<BadCopyable>(bad)); |
|
|
|
|
} |
|
|
|
|
BadCopyable bad; |
|
|
|
|
absl::any target; |
|
|
|
|
ABSL_ANY_TEST_EXPECT_BAD_COPY(target.emplace<BadCopyable>(bad)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
{ |
|
|
|
|
BadCopyable bad; |
|
|
|
|
absl::any target(absl::in_place_type<int>); |
|
|
|
|
ABSL_ANY_TEST_EXPECT_BAD_COPY(target.emplace<BadCopyable>(bad)); |
|
|
|
|
#if defined(ABSL_USES_STD_ANY) && defined(__GLIBCXX__) |
|
|
|
|
// libstdc++ std::any::emplace() implementation (as of 7.2) has a bug: if an
|
|
|
|
|
// exception is thrown, *this contains a value.
|
|
|
|
|
#define ABSL_GLIBCXX_ANY_EMPLACE_EXCEPTION_BUG 1 |
|
|
|
|
#endif |
|
|
|
|
#if defined(ABSL_HAVE_EXCEPTIONS) && \ |
|
|
|
|
!defined(ABSL_GLIBCXX_ANY_EMPLACE_EXCEPTION_BUG) |
|
|
|
|
EXPECT_FALSE(target.has_value()); |
|
|
|
|
// GCC and Clang have a bug here.
|
|
|
|
|
// Ine some cases, the exception seems to be thrown at the wrong time, and
|
|
|
|
|
// target may contain a value.
|
|
|
|
|
#ifdef __GNUC__ |
|
|
|
|
TEST(AnyTest, DISABLED_FailedEmplaceInPlace) { |
|
|
|
|
#else |
|
|
|
|
TEST(AnyTest, FailedEmplaceInPlace) { |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
BadCopyable bad; |
|
|
|
|
absl::any target(absl::in_place_type<int>); |
|
|
|
|
ABSL_ANY_TEST_EXPECT_BAD_COPY(target.emplace<BadCopyable>(bad)); |
|
|
|
|
EXPECT_FALSE(target.has_value()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} // namespace
|
|
|
|
|