Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r71378 - in trunk: boost/type_traits libs/type_traits/test
From: john_at_[hidden]
Date: 2011-04-19 07:03:18


Author: johnmaddock
Date: 2011-04-19 07:03:17 EDT (Tue, 19 Apr 2011)
New Revision: 71378
URL: http://svn.boost.org/trac/boost/changeset/71378

Log:
Fix remove pointer so it works for cv-qualified function pointers in VC-10 (compiler bug workaround).
Fixes #5484.
Text files modified:
   trunk/boost/type_traits/remove_pointer.hpp | 53 ++++++++++++++++++++++++++++++++++++++-
   trunk/libs/type_traits/test/remove_pointer_test.cpp | 7 ++++
   2 files changed, 57 insertions(+), 3 deletions(-)

Modified: trunk/boost/type_traits/remove_pointer.hpp
==============================================================================
--- trunk/boost/type_traits/remove_pointer.hpp (original)
+++ trunk/boost/type_traits/remove_pointer.hpp 2011-04-19 07:03:17 EDT (Tue, 19 Apr 2011)
@@ -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)

Modified: trunk/libs/type_traits/test/remove_pointer_test.cpp
==============================================================================
--- trunk/libs/type_traits/test/remove_pointer_test.cpp (original)
+++ trunk/libs/type_traits/test/remove_pointer_test.cpp 2011-04-19 07:03:17 EDT (Tue, 19 Apr 2011)
@@ -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_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 @@
    remove_pointer_test_6a();
    remove_pointer_test_13a();
 #endif
-
+ remove_pointer_test_14();
+ remove_pointer_test_14b();
 TT_TEST_END
 
 


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk