From 18866f4dce985ae281e1da3b3f17908d61cb1c3c Mon Sep 17 00:00:00 2001 From: Billy Robert O'Neal III Date: Tue, 7 Jul 2020 16:46:36 -0700 Subject: [PATCH 1/8] Enable [[msvc::noop_dtor]] from Visual Studio 2019 version 16.8. --- stl/inc/system_error | 27 +++++++++++++++++++++++++-- stl/src/excptptr.cpp | 27 +++++++++++++++++++++++++-- 2 files changed, 50 insertions(+), 4 deletions(-) diff --git a/stl/inc/system_error b/stl/inc/system_error index 4121c5766d9..95055de1fae 100644 --- a/stl/inc/system_error +++ b/stl/inc/system_error @@ -513,8 +513,7 @@ public: } }; -// -// TRANSITION, VSO-1043450 +// TRANSITION, Visual Studio 2019 version 16.8 // _Immortalize_memcpy_image is used to provide a nonstandard guarantee. // Specifically, we want the error category objects returned from things like std::system_category() to always // be available, even during DLL unload (otherwise, would be a huge regression vs. legacy error codes). @@ -554,9 +553,33 @@ _NODISCARD const _Ty& _Immortalize_memcpy_image() noexcept { #elif defined(__cpp_constexpr_dynamic_alloc) template _NODISCARD const _Ty& _Immortalize_memcpy_image() noexcept { +#ifdef __clang__ + [[clang::require_constant_initialization]] +#endif // __clang__ static constexpr _Ty _Static; return _Static; } +#elif defined(_MSC_VER) && _MSC_VER > 1927 +template +struct _Constexpr_immortalize_impl { + union { + _Ty _Storage; + }; + + constexpr _Constexpr_immortalize_impl() : _Storage{} {} + _Constexpr_immortalize_impl(const _Constexpr_immortalize_impl&) = delete; + _Constexpr_immortalize_impl& operator=(const _Constexpr_immortalize_impl&) = delete; + + [[msvc::noop_dtor]] ~_Constexpr_immortalize_impl() { + // do nothing to allow _Ty to be used during shutdown + } +}; + +template +_NODISCARD const _Ty& _Immortalize_memcpy_image() noexcept { + static _Constexpr_immortalize_impl<_Ty> _Static; + return _Static._Storage; +} #else // choose immortalize strategy template _NODISCARD const _Ty& _Immortalize_memcpy_image() noexcept { diff --git a/stl/src/excptptr.cpp b/stl/src/excptptr.cpp index 821697998c6..d59170bfd2b 100644 --- a/stl/src/excptptr.cpp +++ b/stl/src/excptptr.cpp @@ -37,13 +37,36 @@ extern "C" _CRTIMP2 void* __cdecl __AdjustPointer(void*, const PMD&); // defined using namespace std; namespace { -#ifdef _M_CEE_PURE +#if defined(_M_CEE_PURE) template _Ty& _Immortalize() { // return a reference to an object that will live forever /* MAGIC */ static _Immortalizer_impl<_Ty> _Static; return reinterpret_cast<_Ty&>(_Static._Storage); } -#else // ^^^ _M_CEE_PURE ^^^ // vvv !_M_CEE_PURE vvv +#elif _MSC_VER > 1927 + template + struct _Constexpr_excptptr_immortalize_impl { + union { + _Ty _Storage; + } + + constexpr _Constexpr_excptptr_immortalize_impl() + : _Storage() { + } + + [[msvc::noop_dtor]] ~_Constexpr_excptptr_immortalize_impl() { + // do nothing to allow _Ty to be used during shutdown + } + }; + + template + _Constexpr_excptptr_immortalize_impl<_Ty> _Immortalize_impl; + + template + _NODISCARD _Ty& _Immortalize() noexcept { + return _Immortalize_impl<_Ty>._Storage; + } +#else // choose immortalize strategy template int __stdcall _Immortalize_impl(void*, void* _Storage_ptr, void**) noexcept { // adapt True Placement New to _Execute_once From 1bc499e259d9ae0cda379b663191818c363a541d Mon Sep 17 00:00:00 2001 From: Billy Robert O'Neal III Date: Tue, 7 Jul 2020 17:28:07 -0700 Subject: [PATCH 2/8] Don't turn on for /clr. --- stl/inc/system_error | 2 +- stl/src/excptptr.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/stl/inc/system_error b/stl/inc/system_error index 95055de1fae..05ea3e6906e 100644 --- a/stl/inc/system_error +++ b/stl/inc/system_error @@ -559,7 +559,7 @@ _NODISCARD const _Ty& _Immortalize_memcpy_image() noexcept { static constexpr _Ty _Static; return _Static; } -#elif defined(_MSC_VER) && _MSC_VER > 1927 +#elif defined(_MSC_VER) && _MSC_VER > 1927 && !defined(_M_CEE) // _M_CEE test is TRANSITION, VSO-1153256 template struct _Constexpr_immortalize_impl { union { diff --git a/stl/src/excptptr.cpp b/stl/src/excptptr.cpp index d59170bfd2b..1defea3fdf0 100644 --- a/stl/src/excptptr.cpp +++ b/stl/src/excptptr.cpp @@ -43,7 +43,7 @@ namespace { /* MAGIC */ static _Immortalizer_impl<_Ty> _Static; return reinterpret_cast<_Ty&>(_Static._Storage); } -#elif _MSC_VER > 1927 +#elif _MSC_VER > 1927 && !defined(_M_CEE) // _M_CEE test is TRANSITION, VSO-1153256 template struct _Constexpr_excptptr_immortalize_impl { union { From c98779fa35d19b7f809b04e4bafe545017cae22c Mon Sep 17 00:00:00 2001 From: Billy O'Neal Date: Tue, 7 Jul 2020 19:06:57 -0700 Subject: [PATCH 3/8] Apply Casey's code review suggestions. Co-authored-by: Casey Carter --- stl/inc/system_error | 6 +++--- stl/src/excptptr.cpp | 6 ++---- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/stl/inc/system_error b/stl/inc/system_error index 05ea3e6906e..c40ab1f471f 100644 --- a/stl/inc/system_error +++ b/stl/inc/system_error @@ -553,9 +553,9 @@ _NODISCARD const _Ty& _Immortalize_memcpy_image() noexcept { #elif defined(__cpp_constexpr_dynamic_alloc) template _NODISCARD const _Ty& _Immortalize_memcpy_image() noexcept { -#ifdef __clang__ - [[clang::require_constant_initialization]] -#endif // __clang__ +#ifdef __cpp_constinit + constinit +#endif // __cpp_constinit static constexpr _Ty _Static; return _Static; } diff --git a/stl/src/excptptr.cpp b/stl/src/excptptr.cpp index 1defea3fdf0..010c4b9230b 100644 --- a/stl/src/excptptr.cpp +++ b/stl/src/excptptr.cpp @@ -48,11 +48,9 @@ namespace { struct _Constexpr_excptptr_immortalize_impl { union { _Ty _Storage; - } + }; - constexpr _Constexpr_excptptr_immortalize_impl() - : _Storage() { - } + constexpr _Constexpr_excptptr_immortalize_impl() : _Storage() {} [[msvc::noop_dtor]] ~_Constexpr_excptptr_immortalize_impl() { // do nothing to allow _Ty to be used during shutdown From fea6cdd58ba9dacbff97b387273d11fcde33c37b Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Thu, 9 Jul 2020 01:30:20 -0700 Subject: [PATCH 4/8] clang-format system_error. --- stl/inc/system_error | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stl/inc/system_error b/stl/inc/system_error index c40ab1f471f..b470f06b4f4 100644 --- a/stl/inc/system_error +++ b/stl/inc/system_error @@ -556,7 +556,7 @@ _NODISCARD const _Ty& _Immortalize_memcpy_image() noexcept { #ifdef __cpp_constinit constinit #endif // __cpp_constinit - static constexpr _Ty _Static; + static constexpr _Ty _Static; return _Static; } #elif defined(_MSC_VER) && _MSC_VER > 1927 && !defined(_M_CEE) // _M_CEE test is TRANSITION, VSO-1153256 From 884f28ae635bd465e7176443f0062430ba5722cb Mon Sep 17 00:00:00 2001 From: Billy Robert O'Neal III Date: Mon, 13 Jul 2020 20:30:19 -0700 Subject: [PATCH 5/8] Fix double consteval/constexpr. --- stl/inc/system_error | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/stl/inc/system_error b/stl/inc/system_error index b470f06b4f4..9261b554a30 100644 --- a/stl/inc/system_error +++ b/stl/inc/system_error @@ -553,10 +553,7 @@ _NODISCARD const _Ty& _Immortalize_memcpy_image() noexcept { #elif defined(__cpp_constexpr_dynamic_alloc) template _NODISCARD const _Ty& _Immortalize_memcpy_image() noexcept { -#ifdef __cpp_constinit - constinit -#endif // __cpp_constinit - static constexpr _Ty _Static; + static _CONSTEVAL _Ty _Static; return _Static; } #elif defined(_MSC_VER) && _MSC_VER > 1927 && !defined(_M_CEE) // _M_CEE test is TRANSITION, VSO-1153256 From 433a152d5603c640b6586f790d4ce7be00885f50 Mon Sep 17 00:00:00 2001 From: Billy Robert O'Neal III Date: Mon, 13 Jul 2020 20:31:52 -0700 Subject: [PATCH 6/8] Other CR feedback. --- stl/inc/system_error | 3 ++- stl/src/excptptr.cpp | 5 ++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/stl/inc/system_error b/stl/inc/system_error index 9261b554a30..ab3a3926078 100644 --- a/stl/inc/system_error +++ b/stl/inc/system_error @@ -564,11 +564,12 @@ struct _Constexpr_immortalize_impl { }; constexpr _Constexpr_immortalize_impl() : _Storage{} {} + _Constexpr_immortalize_impl(const _Constexpr_immortalize_impl&) = delete; _Constexpr_immortalize_impl& operator=(const _Constexpr_immortalize_impl&) = delete; [[msvc::noop_dtor]] ~_Constexpr_immortalize_impl() { - // do nothing to allow _Ty to be used during shutdown + // do nothing, allowing _Ty to be used during shutdown } }; diff --git a/stl/src/excptptr.cpp b/stl/src/excptptr.cpp index 010c4b9230b..18e78ac9cbc 100644 --- a/stl/src/excptptr.cpp +++ b/stl/src/excptptr.cpp @@ -52,8 +52,11 @@ namespace { constexpr _Constexpr_excptptr_immortalize_impl() : _Storage() {} + _Constexpr_excptptr_immortalize_impl(const _Constexpr_excptptr_immortalize_impl&) = delete; + _Constexpr_excptptr_immortalize_impl& operator=(const _Constexpr_excptptr_immortalize_impl&) = delete; + [[msvc::noop_dtor]] ~_Constexpr_excptptr_immortalize_impl() { - // do nothing to allow _Ty to be used during shutdown + // do nothing, allowing _Ty to be used during shutdown } }; From a727fa2d86d971d768df54a2f76f45206c1fe244 Mon Sep 17 00:00:00 2001 From: Billy Robert O'Neal III Date: Wed, 15 Jul 2020 17:47:32 -0700 Subject: [PATCH 7/8] -_CONSTEVAL --- stl/inc/system_error | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stl/inc/system_error b/stl/inc/system_error index ab3a3926078..af9edfdccf2 100644 --- a/stl/inc/system_error +++ b/stl/inc/system_error @@ -553,7 +553,7 @@ _NODISCARD const _Ty& _Immortalize_memcpy_image() noexcept { #elif defined(__cpp_constexpr_dynamic_alloc) template _NODISCARD const _Ty& _Immortalize_memcpy_image() noexcept { - static _CONSTEVAL _Ty _Static; + static constexpr _Ty _Static; return _Static; } #elif defined(_MSC_VER) && _MSC_VER > 1927 && !defined(_M_CEE) // _M_CEE test is TRANSITION, VSO-1153256 From 138333a96cefdb76921d23ccbdafcb4b8a36e28a Mon Sep 17 00:00:00 2001 From: Billy Robert O'Neal III Date: Wed, 15 Jul 2020 18:38:09 -0700 Subject: [PATCH 8/8] noexcept and {}s. --- stl/inc/system_error | 2 +- stl/src/excptptr.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/stl/inc/system_error b/stl/inc/system_error index af9edfdccf2..bb73811a85c 100644 --- a/stl/inc/system_error +++ b/stl/inc/system_error @@ -563,7 +563,7 @@ struct _Constexpr_immortalize_impl { _Ty _Storage; }; - constexpr _Constexpr_immortalize_impl() : _Storage{} {} + constexpr _Constexpr_immortalize_impl() noexcept : _Storage{} {} _Constexpr_immortalize_impl(const _Constexpr_immortalize_impl&) = delete; _Constexpr_immortalize_impl& operator=(const _Constexpr_immortalize_impl&) = delete; diff --git a/stl/src/excptptr.cpp b/stl/src/excptptr.cpp index 18e78ac9cbc..b0e85953014 100644 --- a/stl/src/excptptr.cpp +++ b/stl/src/excptptr.cpp @@ -50,7 +50,7 @@ namespace { _Ty _Storage; }; - constexpr _Constexpr_excptptr_immortalize_impl() : _Storage() {} + constexpr _Constexpr_excptptr_immortalize_impl() noexcept : _Storage{} {} _Constexpr_excptptr_immortalize_impl(const _Constexpr_excptptr_immortalize_impl&) = delete; _Constexpr_excptptr_immortalize_impl& operator=(const _Constexpr_excptptr_immortalize_impl&) = delete;