From 885be9c9828514595f2f1d24c45aec620b739730 Mon Sep 17 00:00:00 2001 From: Adam Cozzette Date: Mon, 18 Jun 2018 11:38:06 -0700 Subject: Work around MSVC issue with std::atomic initialization (#4777) * Work around MSVC issue with std::atomic initialization MSVC seems to have a bug where it does not use constant initialization for std::atomic, which ends up causing crashes during initialization. This change introduces a workaround by putting the std::atomic inside a union, which causes the compiler to use constant initialization for it. * Added an AppVeyor test for static linking with MSVC --- appveyor.yml | 8 +++++--- src/google/protobuf/generated_message_util.h | 9 +++++++++ 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 02e0d313..9644e066 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,6 +1,3 @@ -# Only test one combination: "Visual Studio 12 + Win64 + Debug + DLL". We can -# test more combinations but AppVeyor just takes too long to finish (each -# combination takes ~15mins). platform: - Win64 @@ -14,6 +11,11 @@ environment: BUILD_DLL: ON UNICODE: ON + - language: cpp + image: Visual Studio 2017 + BUILD_DLL: OFF + UNICODE: ON + - language: csharp image: Visual Studio 2017 diff --git a/src/google/protobuf/generated_message_util.h b/src/google/protobuf/generated_message_util.h index c26e3e52..706df383 100644 --- a/src/google/protobuf/generated_message_util.h +++ b/src/google/protobuf/generated_message_util.h @@ -335,7 +335,16 @@ struct LIBPROTOBUF_EXPORT SCCInfoBase { kRunning = 1, kUninitialized = -1, // initial state }; +#ifndef _MSC_VER std::atomic visit_status; +#else + // MSVC doesnt make std::atomic constant initialized. This union trick + // makes it so. + union { + int visit_status_to_make_linker_init; + std::atomic visit_status; + }; +#endif int num_deps; void (*init_func)(); // This is followed by an array of num_deps -- cgit v1.2.3