forked from boostorg/type_traits
Merge type_traits bug fixes from Trunk.
[SVN r58216]
This commit is contained in:
@ -26,7 +26,7 @@ namespace detail {
|
||||
template <typename T>
|
||||
struct has_new_operator_impl {
|
||||
template<class U>
|
||||
static type_traits::yes_type check_sig(
|
||||
static type_traits::yes_type check_sig1(
|
||||
U*,
|
||||
test<
|
||||
void *(*)(std::size_t),
|
||||
@ -34,64 +34,85 @@ namespace detail {
|
||||
>* = NULL
|
||||
);
|
||||
template<class U>
|
||||
static type_traits::yes_type check_sig(
|
||||
U*,
|
||||
test<
|
||||
void *(*)(std::size_t, const std::nothrow_t&),
|
||||
&U::operator new
|
||||
>* = NULL
|
||||
);
|
||||
template<class U>
|
||||
static type_traits::yes_type check_sig(
|
||||
U*,
|
||||
test<
|
||||
void *(*)(std::size_t, void*),
|
||||
&U::operator new
|
||||
>* = NULL
|
||||
);
|
||||
template<class U>
|
||||
static type_traits::no_type check_sig(...);
|
||||
static type_traits::no_type check_sig1(...);
|
||||
|
||||
template<class U>
|
||||
static type_traits::yes_type check_sig2(
|
||||
U*,
|
||||
test<
|
||||
void *(*)(std::size_t),
|
||||
&U::operator new[]
|
||||
>* = NULL
|
||||
);
|
||||
template<class U>
|
||||
static type_traits::yes_type check_sig2(
|
||||
U*,
|
||||
test<
|
||||
void *(*)(std::size_t, const std::nothrow_t&),
|
||||
&U::operator new[]
|
||||
>* = NULL
|
||||
);
|
||||
template<class U>
|
||||
static type_traits::yes_type check_sig2(
|
||||
U*,
|
||||
test<
|
||||
void *(*)(std::size_t, void*),
|
||||
&U::operator new[]
|
||||
&U::operator new
|
||||
>* = NULL
|
||||
);
|
||||
template<class U>
|
||||
static type_traits::no_type check_sig2(...);
|
||||
|
||||
template<class U>
|
||||
static type_traits::yes_type check_sig3(
|
||||
U*,
|
||||
test<
|
||||
void *(*)(std::size_t, void*),
|
||||
&U::operator new
|
||||
>* = NULL
|
||||
);
|
||||
template<class U>
|
||||
static type_traits::no_type check_sig3(...);
|
||||
|
||||
|
||||
template<class U>
|
||||
static type_traits::yes_type check_sig4(
|
||||
U*,
|
||||
test<
|
||||
void *(*)(std::size_t),
|
||||
&U::operator new[]
|
||||
>* = NULL
|
||||
);
|
||||
template<class U>
|
||||
static type_traits::no_type check_sig4(...);
|
||||
|
||||
template<class U>
|
||||
static type_traits::yes_type check_sig5(
|
||||
U*,
|
||||
test<
|
||||
void *(*)(std::size_t, const std::nothrow_t&),
|
||||
&U::operator new[]
|
||||
>* = NULL
|
||||
);
|
||||
template<class U>
|
||||
static type_traits::no_type check_sig5(...);
|
||||
|
||||
template<class U>
|
||||
static type_traits::yes_type check_sig6(
|
||||
U*,
|
||||
test<
|
||||
void *(*)(std::size_t, void*),
|
||||
&U::operator new[]
|
||||
>* = NULL
|
||||
);
|
||||
template<class U>
|
||||
static type_traits::no_type check_sig6(...);
|
||||
|
||||
// GCC2 won't even parse this template if we embed the computation
|
||||
// of s1 in the computation of value.
|
||||
#ifdef __GNUC__
|
||||
BOOST_STATIC_CONSTANT(unsigned, s1 = sizeof(has_new_operator_impl<T>::template check_sig<T>(0)));
|
||||
BOOST_STATIC_CONSTANT(unsigned, s1 = sizeof(has_new_operator_impl<T>::template check_sig1<T>(0)));
|
||||
BOOST_STATIC_CONSTANT(unsigned, s2 = sizeof(has_new_operator_impl<T>::template check_sig2<T>(0)));
|
||||
BOOST_STATIC_CONSTANT(unsigned, s3 = sizeof(has_new_operator_impl<T>::template check_sig3<T>(0)));
|
||||
BOOST_STATIC_CONSTANT(unsigned, s4 = sizeof(has_new_operator_impl<T>::template check_sig4<T>(0)));
|
||||
BOOST_STATIC_CONSTANT(unsigned, s5 = sizeof(has_new_operator_impl<T>::template check_sig5<T>(0)));
|
||||
BOOST_STATIC_CONSTANT(unsigned, s6 = sizeof(has_new_operator_impl<T>::template check_sig6<T>(0)));
|
||||
#else
|
||||
#if BOOST_WORKAROUND(BOOST_MSVC_FULL_VER, >= 140050000)
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable:6334)
|
||||
#endif
|
||||
|
||||
BOOST_STATIC_CONSTANT(unsigned, s1 = sizeof(check_sig<T>(0)));
|
||||
BOOST_STATIC_CONSTANT(unsigned, s1 = sizeof(check_sig1<T>(0)));
|
||||
BOOST_STATIC_CONSTANT(unsigned, s2 = sizeof(check_sig2<T>(0)));
|
||||
BOOST_STATIC_CONSTANT(unsigned, s3 = sizeof(check_sig3<T>(0)));
|
||||
BOOST_STATIC_CONSTANT(unsigned, s4 = sizeof(check_sig4<T>(0)));
|
||||
BOOST_STATIC_CONSTANT(unsigned, s5 = sizeof(check_sig5<T>(0)));
|
||||
BOOST_STATIC_CONSTANT(unsigned, s6 = sizeof(check_sig6<T>(0)));
|
||||
|
||||
#if BOOST_WORKAROUND(BOOST_MSVC_FULL_VER, >= 140050000)
|
||||
#pragma warning(pop)
|
||||
@ -100,7 +121,11 @@ namespace detail {
|
||||
BOOST_STATIC_CONSTANT(bool, value =
|
||||
(::boost::type_traits::ice_or<
|
||||
(s1 == sizeof(type_traits::yes_type)),
|
||||
(s2 == sizeof(type_traits::yes_type))
|
||||
(s2 == sizeof(type_traits::yes_type)),
|
||||
(s3 == sizeof(type_traits::yes_type)),
|
||||
(s4 == sizeof(type_traits::yes_type)),
|
||||
(s5 == sizeof(type_traits::yes_type)),
|
||||
(s6 == sizeof(type_traits::yes_type))
|
||||
>::value)
|
||||
);
|
||||
};
|
||||
|
@ -149,7 +149,7 @@
|
||||
# define BOOST_IS_CLASS(T) __is_class(T)
|
||||
# define BOOST_IS_ENUM(T) __is_enum(T)
|
||||
# define BOOST_IS_POLYMORPHIC(T) __is_polymorphic(T)
|
||||
# if !defined(unix) || defined(__LP64__)
|
||||
# if (!defined(unix) && !defined(__unix__)) || defined(__LP64__)
|
||||
// GCC sometimes lies about alignment requirements
|
||||
// of type double on 32-bit unix platforms, use the
|
||||
// old implementation instead in that case:
|
||||
|
@ -26,11 +26,19 @@ namespace detail{
|
||||
|
||||
#if !(defined(__EDG_VERSION__) && __EDG_VERSION__ <= 238)
|
||||
|
||||
template <class T>
|
||||
struct is_signed_values
|
||||
{
|
||||
typedef typename remove_cv<T>::type no_cv_t;
|
||||
BOOST_STATIC_CONSTANT(no_cv_t, minus_one = (static_cast<no_cv_t>(-1)));
|
||||
BOOST_STATIC_CONSTANT(no_cv_t, zero = (static_cast<no_cv_t>(0)));
|
||||
};
|
||||
|
||||
template <class T>
|
||||
struct is_signed_helper
|
||||
{
|
||||
typedef typename remove_cv<T>::type no_cv_t;
|
||||
BOOST_STATIC_CONSTANT(bool, value = (!(static_cast<no_cv_t>(-1) > 0)));
|
||||
BOOST_STATIC_CONSTANT(bool, value = (!(::boost::detail::is_signed_values<T>::minus_one > boost::detail::is_signed_values<T>::zero)));
|
||||
};
|
||||
|
||||
template <bool integral_type>
|
||||
|
@ -27,10 +27,17 @@ namespace detail{
|
||||
#if !(defined(__EDG_VERSION__) && __EDG_VERSION__ <= 238)
|
||||
|
||||
template <class T>
|
||||
struct is_ununsigned_helper
|
||||
struct is_unsigned_values
|
||||
{
|
||||
typedef typename remove_cv<T>::type no_cv_t;
|
||||
BOOST_STATIC_CONSTANT(bool, value = (static_cast<no_cv_t>(-1) > 0));
|
||||
BOOST_STATIC_CONSTANT(no_cv_t, minus_one = (static_cast<no_cv_t>(-1)));
|
||||
BOOST_STATIC_CONSTANT(no_cv_t, zero = (static_cast<no_cv_t>(0)));
|
||||
};
|
||||
|
||||
template <class T>
|
||||
struct is_ununsigned_helper
|
||||
{
|
||||
BOOST_STATIC_CONSTANT(bool, value = (::boost::detail::is_unsigned_values<T>::minus_one > ::boost::detail::is_unsigned_values<T>::zero));
|
||||
};
|
||||
|
||||
template <bool integral_type>
|
||||
|
@ -22,7 +22,7 @@ namespace
|
||||
struct alignment_implementation1
|
||||
{
|
||||
boost::detail::aligned_storage::aligned_storage_imp<N,Alignment> type;
|
||||
const void* address() const { return this; }
|
||||
const void* address() const { return type.address(); }
|
||||
};
|
||||
|
||||
template< unsigned N, unsigned Alignment >
|
||||
@ -39,24 +39,24 @@ namespace
|
||||
};
|
||||
|
||||
template< unsigned N, class T >
|
||||
const void* get_address1()
|
||||
std::ptrdiff_t get_address1()
|
||||
{
|
||||
alignment_implementation1<N*sizeof(T), tt::alignment_of<T>::value> imp1;
|
||||
return imp1.address();
|
||||
static alignment_implementation1<N*sizeof(T), tt::alignment_of<T>::value> imp1;
|
||||
return static_cast<const char*>(imp1.address()) - reinterpret_cast<const char*>(&imp1);
|
||||
}
|
||||
|
||||
template< unsigned N, class T >
|
||||
const void* get_address2()
|
||||
std::ptrdiff_t get_address2()
|
||||
{
|
||||
alignment_implementation2<N*sizeof(T), tt::alignment_of<T>::value> imp2;
|
||||
return imp2.address();
|
||||
static alignment_implementation2<N*sizeof(T), tt::alignment_of<T>::value> imp2;
|
||||
return static_cast<const char*>(imp2.address()) - reinterpret_cast<const char*>(&imp2);
|
||||
}
|
||||
|
||||
template< class T >
|
||||
void check()
|
||||
{
|
||||
const void* addr1 = get_address1<0,T>();
|
||||
const void* addr2 = get_address2<0,T>();
|
||||
std::ptrdiff_t addr1 = get_address1<0,T>();
|
||||
std::ptrdiff_t addr2 = get_address2<0,T>();
|
||||
//
|
||||
// @remark: only the empty case differs
|
||||
//
|
||||
@ -101,6 +101,9 @@ check<long double>();
|
||||
#ifdef BOOST_HAS_MS_INT64
|
||||
check<__int64>();
|
||||
#endif
|
||||
#ifdef BOOST_HAS_LONG_LONG
|
||||
check<long long>();
|
||||
#endif
|
||||
|
||||
check<int(*)(int)>();
|
||||
check<int*>();
|
||||
|
@ -33,6 +33,16 @@ struct class_with_new_op6 {
|
||||
void* operator new[] (std::size_t size, void* ptr);
|
||||
};
|
||||
|
||||
struct class_with_all_ops
|
||||
{
|
||||
void * operator new(std::size_t);
|
||||
void* operator new(std::size_t size, const std::nothrow_t&);
|
||||
void* operator new[](std::size_t size);
|
||||
void* operator new[](std::size_t size, const std::nothrow_t&);
|
||||
void* operator new (std::size_t size, void* ptr);
|
||||
void* operator new[] (std::size_t size, void* ptr);
|
||||
};
|
||||
|
||||
TT_TEST_BEGIN(has_new_operator)
|
||||
|
||||
BOOST_CHECK_INTEGRAL_CONSTANT(::tt::has_new_operator<class_with_new_op>::value, true);
|
||||
@ -42,6 +52,7 @@ BOOST_CHECK_INTEGRAL_CONSTANT(::tt::has_new_operator<class_with_new_op3>::value,
|
||||
BOOST_CHECK_INTEGRAL_CONSTANT(::tt::has_new_operator<class_with_new_op4>::value, true);
|
||||
BOOST_CHECK_INTEGRAL_CONSTANT(::tt::has_new_operator<class_with_new_op5>::value, true);
|
||||
BOOST_CHECK_INTEGRAL_CONSTANT(::tt::has_new_operator<class_with_new_op6>::value, true);
|
||||
BOOST_CHECK_INTEGRAL_CONSTANT(::tt::has_new_operator<class_with_all_ops>::value, true);
|
||||
|
||||
BOOST_CHECK_INTEGRAL_CONSTANT(::tt::has_new_operator<bool>::value, false);
|
||||
BOOST_CHECK_INTEGRAL_CONSTANT(::tt::has_new_operator<bool const>::value, false);
|
||||
|
4
test/is_abstract_test.cpp
Executable file → Normal file
4
test/is_abstract_test.cpp
Executable file → Normal file
@ -13,6 +13,10 @@
|
||||
# include <boost/type_traits/is_abstract.hpp>
|
||||
#endif
|
||||
|
||||
#ifdef BOOST_MSVC
|
||||
#pragma warning(disable: 4505)
|
||||
#endif
|
||||
|
||||
|
||||
struct TestA {};
|
||||
struct TestB { virtual void foo(void) = 0; };
|
||||
|
@ -407,6 +407,10 @@ struct wrap
|
||||
{
|
||||
T t;
|
||||
int j;
|
||||
protected:
|
||||
wrap();
|
||||
wrap(const wrap&);
|
||||
wrap& operator=(const wrap&);
|
||||
};
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user