13 #ifndef LLVM_SUPPORT_TYPE_TRAITS_H
14 #define LLVM_SUPPORT_TYPE_TRAITS_H
17 #include <type_traits>
31 using UnderlyingT = std::remove_reference_t<T>;
35 !std::is_class<UnderlyingT>::value &&
36 !std::is_pointer<UnderlyingT>::value &&
37 !std::is_floating_point<UnderlyingT>::value &&
38 (std::is_enum<UnderlyingT>::value ||
39 std::is_convertible<UnderlyingT, unsigned long long>::value);
43 template<
typename T,
typename Enable =
void>
48 T,
std::enable_if_t<std::is_pointer<T>::value>> {
54 template<
typename T,
typename Enable =
void>
59 using type =
const std::remove_pointer_t<T> *;
62 template <
typename T,
typename Enable =
void>
68 std::enable_if_t<std::is_pointer<T>::value>> {
99 : std::is_copy_constructible<
100 ::llvm::detail::copy_construction_triviality_helper<T>> {};
101 template <
typename T>
103 template <
typename T>
108 template <
typename T>
110 : std::is_move_constructible<
111 ::llvm::detail::move_construction_triviality_helper<T>> {};
112 template <
typename T>
114 template <
typename T>
118 template <
typename T>
121 static auto get(
F*) -> decltype(std::declval<F &>() = std::declval<const F &>(), std::true_type{});
122 static std::false_type
get(...);
126 template <
typename T>
129 static auto get(
F*) -> decltype(std::declval<F &>() = std::declval<F &&>(), std::true_type{});
130 static std::false_type
get(...);
139 template <
typename T>
143 static constexpr
bool has_trivial_copy_constructor =
144 std::is_copy_constructible<detail::trivial_helper<T>>
::value;
145 static constexpr
bool has_deleted_copy_constructor =
146 !std::is_copy_constructible<T>::value;
149 static constexpr
bool has_trivial_move_constructor =
150 std::is_move_constructible<detail::trivial_helper<T>>
::value;
151 static constexpr
bool has_deleted_move_constructor =
152 !std::is_move_constructible<T>::value;
155 static constexpr
bool has_trivial_copy_assign =
157 static constexpr
bool has_deleted_copy_assign =
161 static constexpr
bool has_trivial_move_assign =
163 static constexpr
bool has_deleted_move_assign =
167 static constexpr
bool has_trivial_destructor =
168 std::is_destructible<detail::trivial_helper<T>>
::value;
173 has_trivial_destructor &&
174 (has_deleted_move_assign || has_trivial_move_assign) &&
175 (has_deleted_move_constructor || has_trivial_move_constructor) &&
176 (has_deleted_copy_assign || has_trivial_copy_assign) &&
177 (has_deleted_copy_constructor || has_trivial_copy_constructor);
179 #ifdef HAVE_STD_IS_TRIVIALLY_COPYABLE
180 static_assert(
value == std::is_trivially_copyable<T>::value,
181 "inconsistent behavior between llvm:: and std:: implementation of is_trivially_copyable");
184 template <
typename T>
191 #endif // LLVM_SUPPORT_TYPE_TRAITS_H