forked from boostorg/type_traits
Fix remove pointer so it works for cv-qualified function pointers in VC-10 (compiler bug workaround).
Fixes #5484. [SVN r71378]
This commit is contained in:
@ -9,12 +9,17 @@
|
||||
#ifndef BOOST_TT_REMOVE_POINTER_HPP_INCLUDED
|
||||
#define BOOST_TT_REMOVE_POINTER_HPP_INCLUDED
|
||||
|
||||
#include <boost/type_traits/broken_compiler_spec.hpp>
|
||||
#include <boost/config.hpp>
|
||||
#include <boost/detail/workaround.hpp>
|
||||
#ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
|
||||
#include <boost/type_traits/broken_compiler_spec.hpp>
|
||||
#endif
|
||||
|
||||
#if BOOST_WORKAROUND(BOOST_MSVC,<=1300)
|
||||
#include <boost/type_traits/msvc/remove_pointer.hpp>
|
||||
#elif defined(BOOST_MSVC)
|
||||
#include <boost/type_traits/remove_cv.hpp>
|
||||
#include <boost/type_traits/is_pointer.hpp>
|
||||
#endif
|
||||
|
||||
// should be the last #include
|
||||
@ -22,7 +27,51 @@
|
||||
|
||||
namespace boost {
|
||||
|
||||
#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
|
||||
#ifdef BOOST_MSVC
|
||||
|
||||
namespace detail{
|
||||
|
||||
//
|
||||
// We need all this crazy indirection because a type such as:
|
||||
//
|
||||
// T (*const)(U)
|
||||
//
|
||||
// Does not bind to a <T*> or <T*const> partial specialization with VC10 and earlier
|
||||
//
|
||||
template <class T>
|
||||
struct remove_pointer_imp
|
||||
{
|
||||
typedef T type;
|
||||
};
|
||||
|
||||
template <class T>
|
||||
struct remove_pointer_imp<T*>
|
||||
{
|
||||
typedef T type;
|
||||
};
|
||||
|
||||
template <class T, bool b>
|
||||
struct remove_pointer_imp3
|
||||
{
|
||||
typedef typename remove_pointer_imp<typename boost::remove_cv<T>::type>::type type;
|
||||
};
|
||||
|
||||
template <class T>
|
||||
struct remove_pointer_imp3<T, false>
|
||||
{
|
||||
typedef T type;
|
||||
};
|
||||
|
||||
template <class T>
|
||||
struct remove_pointer_imp2
|
||||
{
|
||||
typedef typename remove_pointer_imp3<T, ::boost::is_pointer<T>::value>::type type;
|
||||
};
|
||||
}
|
||||
|
||||
BOOST_TT_AUX_TYPE_TRAIT_DEF1(remove_pointer,T,typename boost::detail::remove_pointer_imp2<T>::type)
|
||||
|
||||
#elif !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
|
||||
|
||||
BOOST_TT_AUX_TYPE_TRAIT_DEF1(remove_pointer,T,T)
|
||||
BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_pointer,T*,T)
|
||||
|
@ -15,6 +15,7 @@
|
||||
BOOST_DECL_TRANSFORM_TEST(remove_pointer_test_1, ::tt::remove_pointer, const, const)
|
||||
BOOST_DECL_TRANSFORM_TEST(remove_pointer_test_2, ::tt::remove_pointer, volatile, volatile)
|
||||
BOOST_DECL_TRANSFORM_TEST3(remove_pointer_test_3, ::tt::remove_pointer, *)
|
||||
BOOST_DECL_TRANSFORM_TEST3(remove_pointer_test_3b, ::tt::remove_pointer, *const)
|
||||
BOOST_DECL_TRANSFORM_TEST0(remove_pointer_test_4, ::tt::remove_pointer)
|
||||
BOOST_DECL_TRANSFORM_TEST(remove_pointer_test_5, ::tt::remove_pointer, const &, const&)
|
||||
BOOST_DECL_TRANSFORM_TEST(remove_pointer_test_6, ::tt::remove_pointer, &, &)
|
||||
@ -30,12 +31,15 @@ BOOST_DECL_TRANSFORM_TEST(remove_pointer_test_5a, ::tt::remove_pointer, const &&
|
||||
BOOST_DECL_TRANSFORM_TEST(remove_pointer_test_6a, ::tt::remove_pointer, &&, &&)
|
||||
BOOST_DECL_TRANSFORM_TEST(remove_pointer_test_13a, ::tt::remove_pointer, (&&)[2], (&&)[2])
|
||||
#endif
|
||||
BOOST_DECL_TRANSFORM_TEST(remove_pointer_test_14, ::tt::remove_pointer, (*)(long), (long))
|
||||
BOOST_DECL_TRANSFORM_TEST(remove_pointer_test_14b, ::tt::remove_pointer, (*const)(long), (long))
|
||||
|
||||
TT_TEST_BEGIN(remove_pointer)
|
||||
|
||||
remove_pointer_test_1();
|
||||
remove_pointer_test_2();
|
||||
remove_pointer_test_3();
|
||||
remove_pointer_test_3b();
|
||||
remove_pointer_test_4();
|
||||
remove_pointer_test_5();
|
||||
remove_pointer_test_6();
|
||||
@ -51,7 +55,8 @@ TT_TEST_BEGIN(remove_pointer)
|
||||
remove_pointer_test_6a();
|
||||
remove_pointer_test_13a();
|
||||
#endif
|
||||
|
||||
remove_pointer_test_14();
|
||||
remove_pointer_test_14b();
|
||||
TT_TEST_END
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user