Ticket #7251: fix_is_convertible_for_rvalues_cxx11.patch
File fix_is_convertible_for_rvalues_cxx11.patch, 7.6 KB (added by , 10 years ago) |
---|
-
boost/type_traits/intrinsics.hpp
222 222 # define BOOST_ALIGNMENT_OF(T) __alignof__(T) 223 223 # endif 224 224 225 #ifdef __GXX_EXPERIMENTAL_CXX0X__226 # include <type_traits>227 # define BOOST_IS_CONVERTIBLE(T,U) (std::is_convertible<T, U>::value)228 #endif229 230 225 # define BOOST_HAS_TYPE_TRAITS_INTRINSICS 231 226 #endif 232 227 -
boost/type_traits/is_convertible.hpp
17 17 #include <boost/type_traits/detail/yes_no_type.hpp> 18 18 #include <boost/type_traits/config.hpp> 19 19 #include <boost/type_traits/is_array.hpp> 20 #include <boost/type_traits/add_reference.hpp>21 20 #include <boost/type_traits/ice.hpp> 22 21 #include <boost/type_traits/is_arithmetic.hpp> 23 22 #include <boost/type_traits/is_void.hpp> 24 23 #ifndef BOOST_NO_IS_ABSTRACT 25 24 #include <boost/type_traits/is_abstract.hpp> 26 25 #endif 26 #include <boost/type_traits/add_lvalue_reference.hpp> 27 27 #include <boost/type_traits/add_rvalue_reference.hpp> 28 28 #include <boost/type_traits/is_function.hpp> 29 29 … … 69 69 { 70 70 static no_type BOOST_TT_DECL _m_check(...); 71 71 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; 73 73 enum { value = sizeof( _m_check(_m_from) ) == sizeof(yes_type) }; 74 74 }; 75 75 }; … … 107 107 static ::boost::type_traits::yes_type BOOST_TT_DECL _m_check(T); 108 108 }; 109 109 110 static typename add_ rvalue_reference<From>::type _m_from;110 static typename add_lvalue_reference<From>::type _m_from; 111 111 static bool const value = sizeof( checker<To>::_m_check(_m_from) ) 112 112 == sizeof(::boost::type_traits::yes_type); 113 113 #pragma option pop … … 134 134 template <typename From, typename To> 135 135 struct is_convertible_basic_impl 136 136 { 137 typedef typename add_lvalue_reference<From>::type lvalue_type; 137 138 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) ) 140 143 == 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 141 148 }; 142 149 143 150 #elif (defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 245) && !defined(__ICL)) \ … … 167 174 { 168 175 static ::boost::type_traits::no_type BOOST_TT_DECL _m_check(any_conversion ...); 169 176 static ::boost::type_traits::yes_type BOOST_TT_DECL _m_check(To, int); 177 typedef typename add_lvalue_reference<From>::type lvalue_type; 170 178 typedef typename add_rvalue_reference<From>::type rvalue_type; 171 static From_m_from;179 static lvalue_type _m_from; 172 180 173 181 BOOST_STATIC_CONSTANT(bool, value = 182 #ifndef BOOST_NO_RVALUE_REFERENCES 174 183 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 175 187 ); 176 188 }; 177 189 … … 194 206 template <class T> 195 207 static ::boost::type_traits::no_type BOOST_TT_DECL _m_check(any_conversion, float, T); 196 208 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; 199 212 200 213 // Static constants sometime cause the conversion of _m_from to To to be 201 214 // called. This doesn't happen with an enum. 202 215 enum { value = 216 #ifndef BOOST_NO_RVALUE_REFERENCES 203 217 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 204 221 }; 205 222 }; 206 223 … … 228 245 { 229 246 static ::boost::type_traits::no_type BOOST_TT_DECL _m_check(any_conversion ...); 230 247 static ::boost::type_traits::yes_type BOOST_TT_DECL _m_check(To, int); 248 typedef typename add_lvalue_reference<From>::type lvalue_type; 231 249 typedef typename add_rvalue_reference<From>::type rvalue_type; 232 static From_m_from;250 static lvalue_type _m_from; 233 251 234 252 BOOST_STATIC_CONSTANT(bool, value = 253 #ifndef BOOST_NO_RVALUE_REFERENCES 235 254 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 236 258 ); 237 259 }; 238 260 … … 241 263 { 242 264 static ::boost::type_traits::no_type BOOST_TT_DECL _m_check(...); 243 265 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; 246 269 BOOST_STATIC_CONSTANT(bool, value = 270 #ifndef BOOST_NO_RVALUE_REFERENCES 247 271 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 248 275 ); 249 276 }; 250 277 … … 266 293 { 267 294 static ::boost::type_traits::no_type BOOST_TT_DECL _m_check(...); 268 295 static ::boost::type_traits::yes_type BOOST_TT_DECL _m_check(To); 296 typedef typename add_lvalue_reference<From>::type lvalue_type; 269 297 typedef typename add_rvalue_reference<From>::type rvalue_type; 270 static From_m_from;298 static lvalue_type _m_from; 271 299 #ifdef BOOST_MSVC 272 300 #pragma warning(push) 273 301 #pragma warning(disable:4244) … … 276 304 #endif 277 305 #endif 278 306 BOOST_STATIC_CONSTANT(bool, value = 307 #ifndef BOOST_NO_RVALUE_REFERENCES 279 308 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 280 312 ); 281 313 #ifdef BOOST_MSVC 282 314 #pragma warning(pop) … … 290 322 template <typename From, typename To> 291 323 struct is_convertible_impl 292 324 { 293 typedef typename add_reference<From>::type ref_type;294 325 enum { value = 295 326 (::boost::type_traits::ice_and< 296 327 ::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, 298 329 ::boost::is_void<To>::value 299 330 >::value, 300 331 ::boost::type_traits::ice_not< … … 309 340 template <typename From, typename To> 310 341 struct is_convertible_impl 311 342 { 312 typedef typename add_reference<From>::type ref_type;313 343 BOOST_STATIC_CONSTANT(bool, value = 314 344 (::boost::type_traits::ice_and< 315 345 ::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, 317 347 ::boost::is_void<To>::value 318 348 >::value, 319 349 ::boost::type_traits::ice_not<