[PATCH] D51888: [ADT] bit_cast: check for is_trivially_copyable more portably

JF Bastien via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Sep 10 14:35:14 PDT 2018


This revision was not accepted when it landed; it landed in state "Needs Review".
This revision was automatically updated to reflect the committed changes.
Closed by commit rL341865: [ADT] bit_cast: check for is_trivially_copyable more portably (authored by jfb, committed by ).

Repository:
  rL LLVM

https://reviews.llvm.org/D51888

Files:
  llvm/trunk/include/llvm/ADT/bit.h


Index: llvm/trunk/include/llvm/ADT/bit.h
===================================================================
--- llvm/trunk/include/llvm/ADT/bit.h
+++ llvm/trunk/include/llvm/ADT/bit.h
@@ -14,15 +14,29 @@
 #ifndef LLVM_ADT_BIT_H
 #define LLVM_ADT_BIT_H
 
-#include "llvm/Support/type_traits.h"
+#include "llvm/Support/Compiler.h"
 #include <cstring>
+#include <type_traits>
 
 namespace llvm {
 
-template <typename To, typename From,
-          typename = typename std::enable_if<sizeof(To) == sizeof(From)>::type,
-          typename = typename std::enable_if<isPodLike<To>::value>::type,
-          typename = typename std::enable_if<isPodLike<From>::value>::type>
+template <typename To, typename From
+          , typename = typename std::enable_if<sizeof(To) == sizeof(From)>::type
+#if (__has_feature(is_trivially_copyable) && defined(_LIBCPP_VERSION)) || \
+    (defined(__GNUC__) && __GNUC__ >= 5)
+          , typename = typename std::enable_if<std::is_trivially_copyable<To>::value>::type
+          , typename = typename std::enable_if<std::is_trivially_copyable<From>::value>::type
+#elif __has_feature(is_trivially_copyable)
+          , typename = typename std::enable_if<__is_trivially_copyable<To>::value>::type
+          , typename = typename std::enable_if<__is_trivially_copyable<From>::value>::type
+#else
+  // This case is GCC 4.x. clang with libc++ or libstdc++ never get here. Unlike
+  // llvm/Support/type_traits.h's isPodLike we don't want to provide a
+  // good-enough answer here: developers in that configuration will hit
+  // compilation failures on the bots instead of locally. That's acceptable
+  // because it's very few developers, and only until we move past C++11.
+#endif
+>
 inline To bit_cast(const From &from) noexcept {
   alignas(To) unsigned char storage[sizeof(To)];
   std::memcpy(&storage, &from, sizeof(To));


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D51888.164752.patch
Type: text/x-patch
Size: 1862 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180910/73024f15/attachment.bin>


More information about the llvm-commits mailing list