Export of internal Abseil changes
-- 3e60f355db5afd7a864591d81a6c383b6c0a0780 by Samuel Benzaquen <sbenza@google.com>: Internal change PiperOrigin-RevId: 272531442 -- 6d189240b8cebe3a390c730de491156d03049229 by Andy Getzendanner <durandal@google.com>: Fix AtomicHook init-order fiasco under MSVC 2019. On this platform, constexpr static init sometimes happens after dynamic init =/. When it does, we should not zero hook_ (overwriting the value written there by dynamic init); instead we should leave it alone. This works even when constexpr static init goes first since all uses of AtomicHook should have static storage duration and be zero-initialized. https://developercommunity.visualstudio.com/content/problem/336946/class-with-constexpr-constructor-not-using-static.html PiperOrigin-RevId: 272525226 -- d01b14fc06bc75b41c51976ed32e7c304ea1aab7 by Abseil Team <absl-team@google.com>: exclude emscripten from running tests involving long doubles PiperOrigin-RevId: 272497628 GitOrigin-RevId: 3e60f355db5afd7a864591d81a6c383b6c0a0780 Change-Id: I3c8a8f5acaf7652a06ef40cf028ef5d2e142f81b
This commit is contained in:
parent
aad33fefaa
commit
25597bdfc1
12 changed files with 166 additions and 12 deletions
|
|
@ -14,11 +14,15 @@
|
|||
|
||||
#include "absl/base/internal/atomic_hook.h"
|
||||
|
||||
#include "gmock/gmock.h"
|
||||
#include "gtest/gtest.h"
|
||||
#include "absl/base/attributes.h"
|
||||
#include "absl/base/internal/atomic_hook_test_helper.h"
|
||||
|
||||
namespace {
|
||||
|
||||
using ::testing::Eq;
|
||||
|
||||
int value = 0;
|
||||
void TestHook(int x) { value = x; }
|
||||
|
||||
|
|
@ -67,4 +71,24 @@ TEST(AtomicHookTest, WithDefaultFunction) {
|
|||
EXPECT_EQ(value, 2);
|
||||
}
|
||||
|
||||
ABSL_CONST_INIT int override_func_calls = 0;
|
||||
void OverrideFunc() { override_func_calls++; }
|
||||
static struct OverrideInstaller {
|
||||
OverrideInstaller() { absl::atomic_hook_internal::func.Store(OverrideFunc); }
|
||||
} override_installer;
|
||||
|
||||
TEST(AtomicHookTest, DynamicInitFromAnotherTU) {
|
||||
// MSVC 14.2 doesn't do constexpr static init correctly; in particular it
|
||||
// tends to sequence static init (i.e. defaults) of `AtomicHook` objects
|
||||
// after their dynamic init (i.e. overrides), overwriting whatever value was
|
||||
// written during dynamic init. This regression test validates the fix.
|
||||
// https://developercommunity.visualstudio.com/content/problem/336946/class-with-constexpr-constructor-not-using-static.html
|
||||
EXPECT_THAT(absl::atomic_hook_internal::default_func_calls, Eq(0));
|
||||
EXPECT_THAT(override_func_calls, Eq(0));
|
||||
absl::atomic_hook_internal::func();
|
||||
EXPECT_THAT(absl::atomic_hook_internal::default_func_calls, Eq(0));
|
||||
EXPECT_THAT(override_func_calls, Eq(1));
|
||||
EXPECT_THAT(absl::atomic_hook_internal::func.Load(), Eq(OverrideFunc));
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue