From ce54d8e195ad86c1fb4aafe9c857919e8dca18fc Mon Sep 17 00:00:00 2001 From: JF Bastien Date: Sun, 27 Mar 2016 20:50:05 +0000 Subject: [PATCH] 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; _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]' first = __p.first; ^ git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@264544 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Support/type_traits.h | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/include/llvm/Support/type_traits.h b/include/llvm/Support/type_traits.h index 468dc6ce440..88385c3fae1 100644 --- a/include/llvm/Support/type_traits.h +++ b/include/llvm/Support/type_traits.h @@ -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 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 +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 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::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::value; #endif };