From 31fd9c5b7e2346472fbde2ed9cc11c22747f12e8 Mon Sep 17 00:00:00 2001 From: fanquake Date: Fri, 7 Mar 2025 17:04:53 +0000 Subject: [PATCH 1/2] Squashed 'src/leveldb/' changes from 04b5790928..4188247086 4188247086 Merge bitcoin-core/leveldb-subtree#47: Fix C++23 compilation errors in leveldb 183e79a495 Fix speculatively some "placement new" issues in leveldb 82c31046ed Fix C++23 compilation errors in leveldb git-subtree-dir: src/leveldb git-subtree-split: 41882470862df219f74cdd38354007b91eb98191 --- util/env_posix.cc | 11 +++++++---- util/env_windows.cc | 11 +++++++---- util/no_destructor.h | 12 ++++++++---- 3 files changed, 22 insertions(+), 12 deletions(-) diff --git a/util/env_posix.cc b/util/env_posix.cc index fac41be6ceb..86571059baf 100644 --- a/util/env_posix.cc +++ b/util/env_posix.cc @@ -854,9 +854,13 @@ class SingletonEnv { #endif // !defined(NDEBUG) static_assert(sizeof(env_storage_) >= sizeof(EnvType), "env_storage_ will not fit the Env"); - static_assert(alignof(decltype(env_storage_)) >= alignof(EnvType), + static_assert(std::is_standard_layout_v>); + static_assert( + offsetof(SingletonEnv, env_storage_) % alignof(EnvType) == 0, + "env_storage_ does not meet the Env's alignment needs"); + static_assert(alignof(SingletonEnv) % alignof(EnvType) == 0, "env_storage_ does not meet the Env's alignment needs"); - new (&env_storage_) EnvType(); + new (env_storage_) EnvType(); } ~SingletonEnv() = default; @@ -872,8 +876,7 @@ class SingletonEnv { } private: - typename std::aligned_storage::type - env_storage_; + alignas(EnvType) char env_storage_[sizeof(EnvType)]; #if !defined(NDEBUG) static std::atomic env_initialized_; #endif // !defined(NDEBUG) diff --git a/util/env_windows.cc b/util/env_windows.cc index aafcdcc3be5..0a48c3fb52b 100644 --- a/util/env_windows.cc +++ b/util/env_windows.cc @@ -802,9 +802,13 @@ class SingletonEnv { #endif // !defined(NDEBUG) static_assert(sizeof(env_storage_) >= sizeof(EnvType), "env_storage_ will not fit the Env"); - static_assert(alignof(decltype(env_storage_)) >= alignof(EnvType), + static_assert(std::is_standard_layout_v>); + static_assert( + offsetof(SingletonEnv, env_storage_) % alignof(EnvType) == 0, + "env_storage_ does not meet the Env's alignment needs"); + static_assert(alignof(SingletonEnv) % alignof(EnvType) == 0, "env_storage_ does not meet the Env's alignment needs"); - new (&env_storage_) EnvType(); + new (env_storage_) EnvType(); } ~SingletonEnv() = default; @@ -820,8 +824,7 @@ class SingletonEnv { } private: - typename std::aligned_storage::type - env_storage_; + alignas(EnvType) char env_storage_[sizeof(EnvType)]; #if !defined(NDEBUG) static std::atomic env_initialized_; #endif // !defined(NDEBUG) diff --git a/util/no_destructor.h b/util/no_destructor.h index a0d3b8703d7..c28a1073135 100644 --- a/util/no_destructor.h +++ b/util/no_destructor.h @@ -5,6 +5,7 @@ #ifndef STORAGE_LEVELDB_UTIL_NO_DESTRUCTOR_H_ #define STORAGE_LEVELDB_UTIL_NO_DESTRUCTOR_H_ +#include #include #include @@ -20,10 +21,14 @@ class NoDestructor { explicit NoDestructor(ConstructorArgTypes&&... constructor_args) { static_assert(sizeof(instance_storage_) >= sizeof(InstanceType), "instance_storage_ is not large enough to hold the instance"); + static_assert(std::is_standard_layout_v>); static_assert( - alignof(decltype(instance_storage_)) >= alignof(InstanceType), + offsetof(NoDestructor, instance_storage_) % alignof(InstanceType) == 0, "instance_storage_ does not meet the instance's alignment requirement"); - new (&instance_storage_) + static_assert( + alignof(NoDestructor) % alignof(InstanceType) == 0, + "instance_storage_ does not meet the instance's alignment requirement"); + new (instance_storage_) InstanceType(std::forward(constructor_args)...); } @@ -37,8 +42,7 @@ class NoDestructor { } private: - typename std::aligned_storage::type instance_storage_; + alignas(InstanceType) char instance_storage_[sizeof(InstanceType)]; }; } // namespace leveldb From db5f5784d6e692894de31b17f1333fdbb38b38a4 Mon Sep 17 00:00:00 2001 From: fanquake Date: Thu, 30 Jan 2025 12:31:59 +0000 Subject: [PATCH 2/2] ci: remove -Wno-error=deprecated-declarations from ASAN This is no-longer needed after the changes to leveldb. --- ci/test/00_setup_env_native_asan.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/test/00_setup_env_native_asan.sh b/ci/test/00_setup_env_native_asan.sh index ead550a43ce..4066b14fc9b 100755 --- a/ci/test/00_setup_env_native_asan.sh +++ b/ci/test/00_setup_env_native_asan.sh @@ -29,7 +29,7 @@ export BITCOIN_CONFIG="\ -DCMAKE_C_COMPILER=clang-${APT_LLVM_V} \ -DCMAKE_CXX_COMPILER=clang++-${APT_LLVM_V} \ -DCMAKE_C_FLAGS='-ftrivial-auto-var-init=pattern' \ - -DCMAKE_CXX_FLAGS='-ftrivial-auto-var-init=pattern -Wno-error=deprecated-declarations' \ + -DCMAKE_CXX_FLAGS='-ftrivial-auto-var-init=pattern' \ -DAPPEND_CXXFLAGS='-std=c++23' \ -DAPPEND_CPPFLAGS='-DARENA_DEBUG -DDEBUG_LOCKORDER' \ "