Index: llvm/trunk/include/llvm/ADT/bit.h =================================================================== --- llvm/trunk/include/llvm/ADT/bit.h +++ llvm/trunk/include/llvm/ADT/bit.h @@ -20,8 +20,12 @@ namespace llvm { +// This implementation of bit_cast is different from the C++17 one in two ways: +// - It isn't constexpr because that requires compiler support. +// - It requires trivially-constructible To, to avoid UB in the implementation. template ::type + , typename = typename std::is_trivially_constructible::type #if (__has_feature(is_trivially_copyable) && defined(_LIBCPP_VERSION)) || \ (defined(__GNUC__) && __GNUC__ >= 5) , typename = typename std::enable_if::value>::type @@ -38,17 +42,9 @@ #endif > inline To bit_cast(const From &from) noexcept { - alignas(To) unsigned char storage[sizeof(To)]; - std::memcpy(&storage, &from, sizeof(To)); -#if defined(__GNUC__) - // Before GCC 7.2, GCC thought that this violated strict aliasing. -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wstrict-aliasing" -#endif - return reinterpret_cast(storage); -#if defined(__GNUC__) -#pragma GCC diagnostic pop -#endif + To to; + std::memcpy(&to, &from, sizeof(To)); + return to; } } // namespace llvm