From 7fdc037defbccac78615522310bf759df9ce4f04 Mon Sep 17 00:00:00 2001 From: John Maddock Date: Tue, 19 Apr 2011 11:03:17 +0000 Subject: [PATCH] Fix remove pointer so it works for cv-qualified function pointers in VC-10 (compiler bug workaround). Fixes #5484. [SVN r71378] --- include/boost/type_traits/remove_pointer.hpp | 53 +++++++++++++++++++- test/remove_pointer_test.cpp | 7 ++- 2 files changed, 57 insertions(+), 3 deletions(-) diff --git a/include/boost/type_traits/remove_pointer.hpp b/include/boost/type_traits/remove_pointer.hpp index 5359992..01253db 100644 --- a/include/boost/type_traits/remove_pointer.hpp +++ b/include/boost/type_traits/remove_pointer.hpp @@ -9,12 +9,17 @@ #ifndef BOOST_TT_REMOVE_POINTER_HPP_INCLUDED #define BOOST_TT_REMOVE_POINTER_HPP_INCLUDED -#include #include #include +#ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION +#include +#endif #if BOOST_WORKAROUND(BOOST_MSVC,<=1300) #include +#elif defined(BOOST_MSVC) +#include +#include #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 or partial specialization with VC10 and earlier + // + template + struct remove_pointer_imp + { + typedef T type; + }; + + template + struct remove_pointer_imp + { + typedef T type; + }; + + template + struct remove_pointer_imp3 + { + typedef typename remove_pointer_imp::type>::type type; + }; + + template + struct remove_pointer_imp3 + { + typedef T type; + }; + + template + struct remove_pointer_imp2 + { + typedef typename remove_pointer_imp3::value>::type type; + }; +} + +BOOST_TT_AUX_TYPE_TRAIT_DEF1(remove_pointer,T,typename boost::detail::remove_pointer_imp2::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) diff --git a/test/remove_pointer_test.cpp b/test/remove_pointer_test.cpp index a04146e..8ea738b 100644 --- a/test/remove_pointer_test.cpp +++ b/test/remove_pointer_test.cpp @@ -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