Ticket #7251: fix_is_convertible_for_rvalues_cxx11.patch

File fix_is_convertible_for_rvalues_cxx11.patch, 7.6 KB (added by Michel Morin, 10 years ago)

Patch for C++11

  • boost/type_traits/intrinsics.hpp

     
    222222#     define BOOST_ALIGNMENT_OF(T) __alignof__(T)
    223223#   endif
    224224
    225 #ifdef __GXX_EXPERIMENTAL_CXX0X__
    226 #  include <type_traits>
    227 #  define BOOST_IS_CONVERTIBLE(T,U) (std::is_convertible<T, U>::value)
    228 #endif
    229 
    230225#   define BOOST_HAS_TYPE_TRAITS_INTRINSICS
    231226#endif
    232227
  • boost/type_traits/is_convertible.hpp

     
    1717#include <boost/type_traits/detail/yes_no_type.hpp>
    1818#include <boost/type_traits/config.hpp>
    1919#include <boost/type_traits/is_array.hpp>
    20 #include <boost/type_traits/add_reference.hpp>
    2120#include <boost/type_traits/ice.hpp>
    2221#include <boost/type_traits/is_arithmetic.hpp>
    2322#include <boost/type_traits/is_void.hpp>
    2423#ifndef BOOST_NO_IS_ABSTRACT
    2524#include <boost/type_traits/is_abstract.hpp>
    2625#endif
     26#include <boost/type_traits/add_lvalue_reference.hpp>
    2727#include <boost/type_traits/add_rvalue_reference.hpp>
    2828#include <boost/type_traits/is_function.hpp>
    2929
     
    6969    {
    7070        static no_type BOOST_TT_DECL _m_check(...);
    7171        static yes_type BOOST_TT_DECL _m_check(To);
    72         static typename add_rvalue_reference<From>::type  _m_from;
     72        static typename add_lvalue_reference<From>::type  _m_from;
    7373        enum { value = sizeof( _m_check(_m_from) ) == sizeof(yes_type) };
    7474    };
    7575};
     
    107107        static ::boost::type_traits::yes_type BOOST_TT_DECL _m_check(T);
    108108    };
    109109
    110     static typename add_rvalue_reference<From>::type  _m_from;
     110    static typename add_lvalue_reference<From>::type  _m_from;
    111111    static bool const value = sizeof( checker<To>::_m_check(_m_from) )
    112112        == sizeof(::boost::type_traits::yes_type);
    113113#pragma option pop
     
    134134template <typename From, typename To>
    135135struct is_convertible_basic_impl
    136136{
     137    typedef typename add_lvalue_reference<From>::type lvalue_type;
    137138    typedef typename add_rvalue_reference<From>::type rvalue_type;
    138     static From _m_from;
    139     static bool const value = sizeof( boost::detail::checker<To>::_m_check(static_cast<rvalue_type>(_m_from), 0) )
     139    static lvalue_type _m_from;
     140    static bool const value =
     141#ifndef BOOST_NO_RVALUE_REFERENCES
     142        sizeof( boost::detail::checker<To>::_m_check(static_cast<rvalue_type>(_m_from), 0) )
    140143        == sizeof(::boost::type_traits::yes_type);
     144#else
     145        sizeof( boost::detail::checker<To>::_m_check(_m_from, 0) )
     146        == sizeof(::boost::type_traits::yes_type);
     147#endif
    141148};
    142149
    143150#elif (defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 245) && !defined(__ICL)) \
     
    167174{
    168175    static ::boost::type_traits::no_type BOOST_TT_DECL _m_check(any_conversion ...);
    169176    static ::boost::type_traits::yes_type BOOST_TT_DECL _m_check(To, int);
     177    typedef typename add_lvalue_reference<From>::type lvalue_type;
    170178    typedef typename add_rvalue_reference<From>::type rvalue_type;
    171     static From _m_from;
     179    static lvalue_type _m_from;
    172180
    173181    BOOST_STATIC_CONSTANT(bool, value =
     182#ifndef BOOST_NO_RVALUE_REFERENCES
    174183        sizeof( _m_check(static_cast<rvalue_type>(_m_from), 0) ) == sizeof(::boost::type_traits::yes_type)
     184#else
     185        sizeof( _m_check(_m_from, 0) ) == sizeof(::boost::type_traits::yes_type)
     186#endif
    175187        );
    176188};
    177189
     
    194206    template <class T>
    195207    static ::boost::type_traits::no_type BOOST_TT_DECL _m_check(any_conversion,  float, T);
    196208    static ::boost::type_traits::yes_type BOOST_TT_DECL _m_check(To, int, int);
    197     typedef typename add_rvalue_reference<From>::type rvalue_type;
    198     static From _m_from;
     209    typedef typename add_lvalue_reference<From>::type lvalue_type;
     210    typedef typename add_rvalue_reference<From>::type rvalue_type;
     211    static lvalue_type _m_from;
    199212
    200213    // Static constants sometime cause the conversion of _m_from to To to be
    201214    // called. This doesn't happen with an enum.
    202215    enum { value =
     216#ifndef BOOST_NO_RVALUE_REFERENCES
    203217        sizeof( _m_check(static_cast<rvalue_type>(_m_from), 0, 0) ) == sizeof(::boost::type_traits::yes_type)
     218#else
     219        sizeof( _m_check(_m_from, 0, 0) ) == sizeof(::boost::type_traits::yes_type)
     220#endif
    204221        };
    205222};
    206223
     
    228245{
    229246    static ::boost::type_traits::no_type BOOST_TT_DECL _m_check(any_conversion ...);
    230247    static ::boost::type_traits::yes_type BOOST_TT_DECL _m_check(To, int);
     248    typedef typename add_lvalue_reference<From>::type lvalue_type;
    231249    typedef typename add_rvalue_reference<From>::type rvalue_type;
    232     static From _m_from;
     250    static lvalue_type _m_from;
    233251
    234252    BOOST_STATIC_CONSTANT(bool, value =
     253#ifndef BOOST_NO_RVALUE_REFERENCES
    235254        sizeof( _m_check(static_cast<rvalue_type>(_m_from), 0) ) == sizeof(::boost::type_traits::yes_type)
     255#else
     256        sizeof( _m_check(_m_from, 0) ) == sizeof(::boost::type_traits::yes_type)
     257#endif
    236258        );
    237259};
    238260
     
    241263{
    242264    static ::boost::type_traits::no_type BOOST_TT_DECL _m_check(...);
    243265    static ::boost::type_traits::yes_type BOOST_TT_DECL _m_check(To);
    244     typedef typename add_rvalue_reference<From>::type rvalue_type;
    245     static From _m_from;
     266    typedef typename add_lvalue_reference<From>::type lvalue_type;
     267    typedef typename add_rvalue_reference<From>::type rvalue_type;
     268    static lvalue_type _m_from;
    246269    BOOST_STATIC_CONSTANT(bool, value =
     270#ifndef BOOST_NO_RVALUE_REFERENCES
    247271        sizeof( _m_check(static_cast<rvalue_type>(_m_from)) ) == sizeof(::boost::type_traits::yes_type)
     272#else
     273        sizeof( _m_check(_m_from) ) == sizeof(::boost::type_traits::yes_type)
     274#endif
    248275        );
    249276};
    250277
     
    266293{
    267294    static ::boost::type_traits::no_type BOOST_TT_DECL _m_check(...);
    268295    static ::boost::type_traits::yes_type BOOST_TT_DECL _m_check(To);
     296    typedef typename add_lvalue_reference<From>::type lvalue_type;
    269297    typedef typename add_rvalue_reference<From>::type rvalue_type;
    270     static From _m_from;
     298    static lvalue_type _m_from;
    271299#ifdef BOOST_MSVC
    272300#pragma warning(push)
    273301#pragma warning(disable:4244)
     
    276304#endif
    277305#endif
    278306    BOOST_STATIC_CONSTANT(bool, value =
     307#ifndef BOOST_NO_RVALUE_REFERENCES
    279308        sizeof( _m_check(static_cast<rvalue_type>(_m_from)) ) == sizeof(::boost::type_traits::yes_type)
     309#else
     310        sizeof( _m_check(_m_from) ) == sizeof(::boost::type_traits::yes_type)
     311#endif
    280312        );
    281313#ifdef BOOST_MSVC
    282314#pragma warning(pop)
     
    290322template <typename From, typename To>
    291323struct is_convertible_impl
    292324{
    293     typedef typename add_reference<From>::type ref_type;
    294325    enum { value =
    295326        (::boost::type_traits::ice_and<
    296327            ::boost::type_traits::ice_or<
    297                ::boost::detail::is_convertible_basic_impl<ref_type,To>::value,
     328               ::boost::detail::is_convertible_basic_impl<From,To>::value,
    298329               ::boost::is_void<To>::value
    299330            >::value,
    300331            ::boost::type_traits::ice_not<
     
    309340template <typename From, typename To>
    310341struct is_convertible_impl
    311342{
    312     typedef typename add_reference<From>::type ref_type;
    313343    BOOST_STATIC_CONSTANT(bool, value =
    314344        (::boost::type_traits::ice_and<
    315345            ::boost::type_traits::ice_or<
    316                ::boost::detail::is_convertible_basic_impl<ref_type,To>::value,
     346               ::boost::detail::is_convertible_basic_impl<From,To>::value,
    317347               ::boost::is_void<To>::value
    318348            >::value,
    319349            ::boost::type_traits::ice_not<