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:
John Maddock
2011-04-19 11:03:17 +00:00
parent 74d5955a7a
commit 7fdc037def
2 changed files with 57 additions and 3 deletions

View File

@ -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)

View File

@ -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