diff --git a/include/leveldb/env.h b/include/leveldb/env.h index e00895a..1ff3045 100644 --- a/include/leveldb/env.h +++ b/include/leveldb/env.h @@ -39,6 +39,12 @@ #endif // defined(DeleteFile) #endif // defined(_WIN32) +#ifdef __cpp_lib_launder +#define LAUNDER(x) std::launder((x)) +#else +#define LAUNDER(x) x +#endif + namespace leveldb { class FileLock; diff --git a/util/env_posix.cc b/util/env_posix.cc index ffd06c4..1003c69 100644 --- a/util/env_posix.cc +++ b/util/env_posix.cc @@ -883,7 +883,7 @@ class SingletonEnv { SingletonEnv(const SingletonEnv&) = delete; SingletonEnv& operator=(const SingletonEnv&) = delete; - Env* env() { return reinterpret_cast(&env_storage_); } + Env* env() { return LAUNDER(reinterpret_cast(&env_storage_)); } static void AssertEnvNotInitialized() { #if !defined(NDEBUG) diff --git a/util/env_windows.cc b/util/env_windows.cc index 1c74b02..937032c 100644 --- a/util/env_windows.cc +++ b/util/env_windows.cc @@ -778,7 +778,7 @@ class SingletonEnv { SingletonEnv(const SingletonEnv&) = delete; SingletonEnv& operator=(const SingletonEnv&) = delete; - Env* env() { return reinterpret_cast(&env_storage_); } + Env* env() { return LAUNDER(reinterpret_cast(&env_storage_)); } static void AssertEnvNotInitialized() { #if !defined(NDEBUG)