Index: cmake/config-ix.cmake =================================================================== --- cmake/config-ix.cmake +++ cmake/config-ix.cmake @@ -325,6 +325,15 @@ unset(HAVE_FFI_CALL CACHE) endif( LLVM_ENABLE_FFI ) +# Wether we can use std::is_triviallyc_opyable to verify llvm::is_trivially_copyable +CHECK_CXX_SOURCE_COMPILES(" +#include +struct T { int val; }; +static_assert(std::is_trivially_copyable::value, \"ok\"); +int main() { return 0;} +" HAVE_STD_IS_TRIVIALLY_COPYABLE) + + # Define LLVM_HAS_ATOMICS if gcc or MSVC atomic builtins are supported. include(CheckAtomic) Index: include/llvm/ADT/PointerIntPair.h =================================================================== --- include/llvm/ADT/PointerIntPair.h +++ include/llvm/ADT/PointerIntPair.h @@ -14,6 +14,7 @@ #define LLVM_ADT_POINTERINTPAIR_H #include "llvm/Support/PointerLikeTypeTraits.h" +#include "llvm/Support/type_traits.h" #include #include #include @@ -125,6 +126,17 @@ } }; +template +struct is_trivially_copyable> : std::true_type { +#ifdef HAVE_STD_IS_TRIVIALLY_COPYABLE + static_assert(std::is_trivially_copyable>::value, + "inconsistent behavior between llvm:: and std:: implementation of is_trivially_copyable"); +#endif +}; + + template struct PointerIntPairInfo { static_assert(PtrTraits::NumLowBitsAvailable < Index: include/llvm/Config/config.h.cmake =================================================================== --- include/llvm/Config/config.h.cmake +++ include/llvm/Config/config.h.cmake @@ -338,6 +338,9 @@ /* Define as the return type of signal handlers (`int' or `void'). */ #cmakedefine RETSIGTYPE ${RETSIGTYPE} +/* Define if std::is_trivially_copyable is supported */ +#cmakedefine HAVE_STD_IS_TRIVIALLY_COPYABLE ${HAVE_STD_IS_TRIVIALLY_COPYABLE} + /* Define to a function implementing stricmp */ #cmakedefine stricmp ${stricmp} Index: include/llvm/Support/type_traits.h =================================================================== --- include/llvm/Support/type_traits.h +++ include/llvm/Support/type_traits.h @@ -95,6 +95,31 @@ union trivial_helper { T t; }; + + +template struct VoidTImpl { using type = void; }; + +template class Op, class... Args> +struct IsDetectedImpl { + using type = std::false_type; +}; + +template