From 03bff14498de17523a4348d1c9dce05d40a13d07 Mon Sep 17 00:00:00 2001 From: jzmaddock Date: Sun, 27 Apr 2014 16:51:19 +0100 Subject: [PATCH] Updated fix for https://svn.boost.org/trac/boost/ticket/9910#comment:2 C++11 version of is_convertible does not need a check for is_abstract. --- include/boost/type_traits/is_convertible.hpp | 7 +++++-- test/is_convertible_test.cpp | 6 ++++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/include/boost/type_traits/is_convertible.hpp b/include/boost/type_traits/is_convertible.hpp index 1f083a7..a844cec 100644 --- a/include/boost/type_traits/is_convertible.hpp +++ b/include/boost/type_traits/is_convertible.hpp @@ -56,7 +56,9 @@ namespace detail { #if !defined(BOOST_NO_SFINAE_EXPR) && !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) - // This is a C++11 conforming version: + // This is a C++11 conforming version, place this first and use it wherever possible: + +# define BOOST_TT_CXX11_IS_CONVERTIBLE template struct or_helper @@ -416,7 +418,8 @@ struct is_convertible_impl_dispatch_base typedef is_convertible_impl_select< ::boost::is_arithmetic::value, ::boost::is_arithmetic::value, -#ifndef BOOST_NO_IS_ABSTRACT +#if !defined(BOOST_NO_IS_ABSTRACT) && !defined(BOOST_TT_CXX11_IS_CONVERTIBLE) + // We need to filter out abstract types, only if we don't have a strictly conforming C++11 version: ::boost::is_abstract::value #else false diff --git a/test/is_convertible_test.cpp b/test/is_convertible_test.cpp index 9bcc3e0..3872e99 100644 --- a/test/is_convertible_test.cpp +++ b/test/is_convertible_test.cpp @@ -56,7 +56,7 @@ struct bug_5271b #endif -#if ((!defined(BOOST_NO_SFINAE_EXPR) && !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)) || defined(BOOST_IS_CONVERTIBLE)) && !defined(BOOST_NO_CXX11_DELETED_FUNCTIONS) +#if (defined(BOOST_TT_CXX11_IS_CONVERTIBLE) || defined(BOOST_IS_CONVERTIBLE)) && !defined(BOOST_NO_CXX11_DELETED_FUNCTIONS) struct bug9910 { bug9910() = default; @@ -206,11 +206,13 @@ BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_convertible::value), fal BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_convertible::value), true); #endif -#if ((!defined(BOOST_NO_SFINAE_EXPR) && !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)) || defined(BOOST_IS_CONVERTIBLE)) && !defined(BOOST_NO_CXX11_DELETED_FUNCTIONS) +#if (defined(BOOST_TT_CXX11_IS_CONVERTIBLE) || defined(BOOST_IS_CONVERTIBLE)) && !defined(BOOST_NO_CXX11_DELETED_FUNCTIONS) #ifndef _MSC_VER // MSVC gives the wrong answer here, see https://connect.microsoft.com/VisualStudio/feedback/details/858956/std-is-convertible-returns-incorrect-value BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_convertible::value), false); #endif +// From https://svn.boost.org/trac/boost/ticket/9910#comment:2: +BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_convertible::value), false); #endif TT_TEST_END