From 02270ed668030f7df865c75278e6219a034a55e4 Mon Sep 17 00:00:00 2001 From: jzmaddock Date: Thu, 10 May 2018 10:31:24 +0100 Subject: [PATCH] is_virtual_base_of: tentative fixes for clang and older gcc versions. [CI SKIP] --- .../boost/type_traits/is_virtual_base_of.hpp | 31 +++++++++++++++++-- test/is_virtual_base_of_test.cpp | 8 ----- 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/include/boost/type_traits/is_virtual_base_of.hpp b/include/boost/type_traits/is_virtual_base_of.hpp index d2efebb..cf890b9 100644 --- a/include/boost/type_traits/is_virtual_base_of.hpp +++ b/include/boost/type_traits/is_virtual_base_of.hpp @@ -11,9 +11,10 @@ #include #include +#include namespace boost { -namespace detail { + namespace detail { #ifdef BOOST_MSVC @@ -23,7 +24,31 @@ namespace detail { #pragma GCC system_header #endif -#if !defined(BOOST_NO_SFINAE_EXPR) && !defined(BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS) && !defined(BOOST_NO_CXX11_NULLPTR) +#if !defined(BOOST_NO_SFINAE_EXPR) && !defined(BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS) && !defined(BOOST_NO_CXX11_NULLPTR) && !BOOST_WORKAROUND(BOOST_GCC, <= 40800) + +#ifdef __clang__ + + template + constexpr bool is_virtual_base_impl(...) { return true; } + + template(std::declval()))>* = + nullptr> + constexpr bool is_virtual_base_impl(int) { return false; } + + } // namespace detail + + template + struct is_virtual_base_of : public + boost::integral_constant< + bool, + boost::is_base_of::value && + detail::is_virtual_base_impl(0) && + !detail::is_virtual_base_impl(0) + > {}; + + +#else template struct is_virtual_base_of_impl @@ -63,6 +88,8 @@ struct is_virtual_base_of_impl template struct is_virtual_base_of : public integral_constant::value)>{}; +#endif // __clang__ + #else template diff --git a/test/is_virtual_base_of_test.cpp b/test/is_virtual_base_of_test.cpp index 16707a0..aa6435c 100644 --- a/test/is_virtual_base_of_test.cpp +++ b/test/is_virtual_base_of_test.cpp @@ -145,11 +145,3 @@ BOOST_CHECK_INTEGRAL_CONSTANT((::tt::is_virtual_base_of