[llvm] r264544 - Revert "isPodLike: more precise"

JF Bastien via llvm-commits llvm-commits at lists.llvm.org
Sun Mar 27 13:50:05 PDT 2016


Author: jfb
Date: Sun Mar 27 15:50:05 2016
New Revision: 264544

URL: http://llvm.org/viewvc/llvm-project?rev=264544&view=rev
Log:
Revert "isPodLike: more precise"

This reverts commit c45f2afac5d6855a4804456a0f718563dc47ada0.

Looks like it may be causing a failure, I'll revert for now.

                 from
lib/CodeGen/AsmPrinter/DwarfDebug.cpp:14:
/usr/include/c++/4.9.2/bits/stl_pair.h: In instantiation of
                 'std::pair<_T1, _T2>& std::pair<_T1,
                 _T2>::operator=(const std::pair<_T1, _T2>&) [with _T1 =
                 std::unique_ptr<llvm::DwarfTypeUnit>; _T2 = const
                 llvm::DICompositeType*]':

/usr/include/c++/4.9.2/bits/stl_pair.h:160:8: error: use of deleted
function 'std::unique_ptr<_Tp, _Dp>& std::unique_ptr<_Tp,
_Dp>::operator=(const std::unique_ptr<_Tp, _Dp>&) [with _Tp =
llvm::DwarfTypeUnit; _Dp = std::default_delete<llvm::DwarfTypeUnit>]'
  first = __p.first;
        ^

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=264544&r1=264543&r2=264544&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Support/type_traits.h (original)
+++ llvm/trunk/include/llvm/Support/type_traits.h Sun Mar 27 15:50:05 2016
@@ -24,11 +24,12 @@
 
 namespace llvm {
 
-/// Type trait used to determine whether a given type can be copied around with
-/// memcpy instead of running ctors.
-template <typename T> struct isPodLike {
-// std::is_trivially_copyable is available in libc++ with clang, libstdc++
-// that comes with GCC 5.
+/// isPodLike - This is a type trait that is used to determine whether a given
+/// type can be copied around with memcpy instead of running ctors etc.
+template <typename T>
+struct isPodLike {
+  // std::is_trivially_copyable is available in libc++ with clang, libstdc++
+  // that comes with GCC 5.
 #if (__has_feature(is_trivially_copyable) && defined(_LIBCPP_VERSION)) ||      \
     (defined(__GNUC__) && __GNUC__ >= 5)
   // If the compiler supports the is_trivially_copyable trait use it, as it
@@ -39,15 +40,10 @@ template <typename T> struct isPodLike {
   // 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);
-#elif defined(__GNUC__)
-  // Fallback to ye olden compiler intrinsic, which isn't as accurate as the new
-  // one but more widely supported.
-  static const bool value = __has_trivial_copy(T);
 #else
-  // If we really don't know anything else is_pod will do, is widely supported,
-  // but is too strict (e.g. a user-defined ctor doesn't prevent trivial copy
-  // but prevents POD-ness).
-  static const bool value = std::is_pod<T>::value;
+  // If we don't know anything else, we can (at least) assume that all non-class
+  // types are PODs.
+  static const bool value = !std::is_class<T>::value;
 #endif
 };
 




More information about the llvm-commits mailing list