mirror of
https://github.com/darlinghq/darling-libcxx.git
synced 2025-02-25 06:12:40 +00:00
Working the type_traits area: Hooked up to clang's __is_union. Got has_trivial_copy_assign working.
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@113162 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
f6547cbf61
commit
1387038988
@ -152,6 +152,10 @@ using namespace _LIBCPP_NAMESPACE;
|
||||
#define _STD std
|
||||
#endif // __has_feature(cxx_inline_namespaces)
|
||||
|
||||
#if !(__has_feature(cxx_constexpr))
|
||||
#define _LIBCPP_HAS_NO_CONSTEXPR
|
||||
#endif
|
||||
|
||||
// end defined(__clang__)
|
||||
|
||||
#elif defined(__GNUC__)
|
||||
@ -161,6 +165,7 @@ using namespace _LIBCPP_NAMESPACE;
|
||||
#endif
|
||||
|
||||
#define _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
||||
#define _LIBCPP_HAS_NO_CONSTEXPR
|
||||
|
||||
#ifndef __GXX_EXPERIMENTAL_CXX0X__
|
||||
|
||||
@ -231,4 +236,8 @@ template <unsigned> struct __static_assert_check {};
|
||||
#define decltype(x) __typeof__(x)
|
||||
#endif
|
||||
|
||||
#ifdef _LIBCPP_HAS_NO_CONSTEXPR
|
||||
#define constexpr const
|
||||
#endif
|
||||
|
||||
#endif // _LIBCPP_CONFIG
|
||||
|
@ -34,7 +34,6 @@ namespace std
|
||||
template <class T> struct is_pointer;
|
||||
template <class T> struct is_lvalue_reference;
|
||||
template <class T> struct is_rvalue_reference;
|
||||
template <class T> struct is_reference;
|
||||
template <class T> struct is_member_object_pointer;
|
||||
template <class T> struct is_member_function_pointer;
|
||||
template <class T> struct is_enum;
|
||||
@ -152,9 +151,12 @@ struct __two {char _[2];};
|
||||
template <class _Tp, _Tp __v>
|
||||
struct integral_constant
|
||||
{
|
||||
static const _Tp value = __v;
|
||||
static constexpr _Tp value = __v;
|
||||
typedef _Tp value_type;
|
||||
typedef integral_constant type;
|
||||
#ifndef _LIBCPP_HAS_NO_CONSTEXPR
|
||||
constexpr operator value_type() {return value;}
|
||||
#endif
|
||||
};
|
||||
|
||||
template <class _Tp, _Tp __v>
|
||||
@ -258,7 +260,7 @@ template <class _Tp> struct is_reference<_Tp&&> : public true_type {};
|
||||
|
||||
// is_union
|
||||
|
||||
#if __GNUC__ >= 4 && __GNUC_MINOR__ >= 3
|
||||
#if __GNUC__ >= 4 && __GNUC_MINOR__ >= 3 || defined(__clang__)
|
||||
|
||||
template <class _Tp> struct is_union : public integral_constant<bool, __is_union(_Tp)> {};
|
||||
|
||||
@ -725,13 +727,30 @@ template <class _Tp> struct has_nothrow_move_constructor : public has_nothrow_co
|
||||
|
||||
template <class _Tp> struct has_copy_constructor : public true_type {};
|
||||
|
||||
// has_copy_assign
|
||||
|
||||
template <class _Tp> struct has_copy_assign;
|
||||
|
||||
// has_trivial_copy_assign
|
||||
|
||||
template <class _Tp> struct __libcpp_trivial_copy_assign : public integral_constant<bool, !is_const<_Tp>::value &&
|
||||
is_scalar<_Tp>::value> {};
|
||||
#if defined(__clang__) || (__GNUC__ >= 4 && __GNUC_MINOR__ >= 3)
|
||||
|
||||
template <class _Tp, bool = is_void<_Tp>::value>
|
||||
struct __has_trivial_copy_assign
|
||||
: public integral_constant<bool, __has_trivial_assign(_Tp)> {};
|
||||
|
||||
template <class _Tp> struct __has_trivial_copy_assign<_Tp, true>
|
||||
: public false_type {};
|
||||
|
||||
template <class _Tp> struct has_trivial_copy_assign
|
||||
: public __libcpp_trivial_copy_assign<typename remove_all_extents<_Tp>::type> {};
|
||||
: __has_trivial_copy_assign<_Tp> {};
|
||||
|
||||
#else
|
||||
|
||||
template <class _Tp> struct has_trivial_copy_assign
|
||||
: public integral_constant<bool, is_scalar<_Tp>::value && !is_const<_Tp>::value> {};
|
||||
|
||||
#endif // defined(__clang__) || (__GNUC__ >= 4 && __GNUC_MINOR__ >= 3)
|
||||
|
||||
// has_nothrow_copy_assign
|
||||
|
||||
|
@ -12,6 +12,7 @@
|
||||
// integral_constant
|
||||
|
||||
#include <type_traits>
|
||||
#include <cassert>
|
||||
|
||||
int main()
|
||||
{
|
||||
@ -19,6 +20,7 @@ int main()
|
||||
static_assert(_5::value == 5, "");
|
||||
static_assert((std::is_same<_5::value_type, int>::value), "");
|
||||
static_assert((std::is_same<_5::type, _5>::value), "");
|
||||
static_assert((_5() == 5), "");
|
||||
|
||||
static_assert(std::false_type::value == false, "");
|
||||
static_assert((std::is_same<std::false_type::value_type, bool>::value), "");
|
||||
|
@ -15,5 +15,5 @@
|
||||
|
||||
int main()
|
||||
{
|
||||
#error has_copy_assign not implemented
|
||||
static_assert((std::has_copy_assign<int>::value), "");
|
||||
}
|
||||
|
@ -62,9 +62,10 @@ int main()
|
||||
test_has_not_trivial_assign<void>();
|
||||
test_has_not_trivial_assign<A>();
|
||||
test_has_not_trivial_assign<int&>();
|
||||
test_has_not_trivial_assign<NotEmpty>();
|
||||
test_has_not_trivial_assign<Abstract>();
|
||||
|
||||
test_has_trivial_assign<Union>();
|
||||
test_has_trivial_assign<Abstract>();
|
||||
test_has_trivial_assign<Empty>();
|
||||
test_has_trivial_assign<int>();
|
||||
test_has_trivial_assign<double>();
|
||||
@ -72,6 +73,5 @@ int main()
|
||||
test_has_trivial_assign<const int*>();
|
||||
test_has_trivial_assign<char[3]>();
|
||||
test_has_trivial_assign<char[3]>();
|
||||
test_has_trivial_assign<NotEmpty>();
|
||||
test_has_trivial_assign<bit_zero>();
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user