Commit b65852fa by Derek Mauro Committed by Copybara-Service

Remove the hand-rolled CordLeaker and replace with absl::NoDestructor

to test the after-exit behavior

PiperOrigin-RevId: 627804039
Change-Id: Idc1c5fc14cea466dcc98f0d8746c02cafe887502
parent c3b4f295
...@@ -917,6 +917,7 @@ cc_test( ...@@ -917,6 +917,7 @@ cc_test(
"//absl/base:config", "//absl/base:config",
"//absl/base:core_headers", "//absl/base:core_headers",
"//absl/base:endian", "//absl/base:endian",
"//absl/base:no_destructor",
"//absl/container:fixed_array", "//absl/container:fixed_array",
"//absl/functional:function_ref", "//absl/functional:function_ref",
"//absl/hash", "//absl/hash",
......
...@@ -1075,6 +1075,7 @@ absl_cc_test( ...@@ -1075,6 +1075,7 @@ absl_cc_test(
absl::function_ref absl::function_ref
absl::hash absl::hash
absl::hash_testing absl::hash_testing
absl::no_destructor
absl::log absl::log
absl::optional absl::optional
absl::random_random absl::random_random
......
...@@ -38,6 +38,7 @@ ...@@ -38,6 +38,7 @@
#include "absl/base/config.h" #include "absl/base/config.h"
#include "absl/base/internal/endian.h" #include "absl/base/internal/endian.h"
#include "absl/base/macros.h" #include "absl/base/macros.h"
#include "absl/base/no_destructor.h"
#include "absl/base/options.h" #include "absl/base/options.h"
#include "absl/container/fixed_array.h" #include "absl/container/fixed_array.h"
#include "absl/functional/function_ref.h" #include "absl/functional/function_ref.h"
...@@ -2796,34 +2797,15 @@ class AfterExitCordTester { ...@@ -2796,34 +2797,15 @@ class AfterExitCordTester {
absl::string_view expected_; absl::string_view expected_;
}; };
// Deliberately prevents the destructor for an absl::Cord from running. The cord
// is accessible via the cord member during the lifetime of the CordLeaker.
// After the CordLeaker is destroyed, pointers to the cord will remain valid
// until the CordLeaker's memory is deallocated.
struct CordLeaker {
union {
absl::Cord cord;
};
template <typename Str>
constexpr explicit CordLeaker(const Str& str) : cord(str) {}
~CordLeaker() {
// Don't do anything, including running cord's destructor. (cord's
// destructor won't run automatically because cord is hidden inside a
// union.)
}
};
template <typename Str> template <typename Str>
void TestConstinitConstructor(Str) { void TestAfterExit(Str) {
const auto expected = Str::value; const auto expected = Str::value;
// Defined before `cord` to be destroyed after it. // Defined before `cord` to be destroyed after it.
static AfterExitCordTester exit_tester; // NOLINT static AfterExitCordTester exit_tester; // NOLINT
ABSL_CONST_INIT static CordLeaker cord_leaker(Str{}); // NOLINT static absl::NoDestructor<absl::Cord> cord_leaker(Str{});
// cord_leaker is static, so this reference will remain valid through the end // cord_leaker is static, so this reference will remain valid through the end
// of program execution. // of program execution.
static absl::Cord& cord = cord_leaker.cord; static absl::Cord& cord = *cord_leaker;
static bool init_exit_tester = exit_tester.Set(&cord, expected); static bool init_exit_tester = exit_tester.Set(&cord, expected);
(void)init_exit_tester; (void)init_exit_tester;
...@@ -2875,11 +2857,9 @@ struct LongView { ...@@ -2875,11 +2857,9 @@ struct LongView {
}; };
TEST_P(CordTest, ConstinitConstructor) { TEST_P(CordTest, AfterExit) {
TestConstinitConstructor( TestAfterExit(absl::strings_internal::MakeStringConstant(ShortView{}));
absl::strings_internal::MakeStringConstant(ShortView{})); TestAfterExit(absl::strings_internal::MakeStringConstant(LongView{}));
TestConstinitConstructor(
absl::strings_internal::MakeStringConstant(LongView{}));
} }
namespace { namespace {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment