[llvm] r230021 - Base isPodLike on is_trivially_copyable for GCC 5 and MSVC

Benjamin Kramer benny.kra at googlemail.com
Fri Feb 20 08:19:29 PST 2015


Author: d0k
Date: Fri Feb 20 10:19:28 2015
New Revision: 230021

URL: http://llvm.org/viewvc/llvm-project?rev=230021&view=rev
Log:
Base isPodLike on is_trivially_copyable for GCC 5 and MSVC

It would be nice to get rid of the version checks here, but that will
have to wait until libstdc++ is upgraded to 5.0 everywhere ...

Modified:
    llvm/trunk/include/llvm/Support/type_traits.h

Modified: llvm/trunk/include/llvm/Support/type_traits.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/type_traits.h?rev=230021&r1=230020&r2=230021&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Support/type_traits.h (original)
+++ llvm/trunk/include/llvm/Support/type_traits.h Fri Feb 20 10:19:28 2015
@@ -28,9 +28,17 @@ namespace llvm {
 /// type can be copied around with memcpy instead of running ctors etc.
 template <typename T>
 struct isPodLike {
-#if __has_feature(is_trivially_copyable)
+  // std::is_trivially copyable is available in libc++ with clang, libstdc++
+  // that comes with GCC 5 and MSVC 2013.
+#if (__has_feature(is_trivially_copyable) && defined(_LIBCPP_VERSION)) ||      \
+    (defined(__GNUC__) && __GNUC__ >= 5) || defined(_MSC_VER)
   // If the compiler supports the is_trivially_copyable trait use it, as it
   // matches the definition of isPodLike closely.
+  static const bool value = std::is_trivially_copyable<T>::value;
+#elif __has_feature(is_trivially_copyable)
+  // Use the internal name if the compiler supports is_trivially_copyable but we
+  // don't know if the standard library does. This is the case for clang in
+  // conjunction with libstdc++ from GCC 4.x.
   static const bool value = __is_trivially_copyable(T);
 #else
   // If we don't know anything else, we can (at least) assume that all non-class





More information about the llvm-commits mailing list