mirror of
https://github.com/boostorg/hana.git
synced 2026-01-21 17:02:25 +00:00
Enable building boost.hana with VS2107 15.8 (with five source workarounds)
Here is the test result: 100% tests passed, 0 tests failed out of 1103 Here are the details of the source workarounds: 1. Active issues we are working on a. Multiple copy/move ctors VC doesn't correctly handle multiple copy/move ctors. The workaround is under macro BOOST_HANA_WORKAROUND_MSVC_MULTIPLECTOR_106654. b. Forward declaration of class template member function returning decltype(auto) (this issue is exposed by a recent change in boost 1.68) To deduce the actual return type, the compiler expects the function definition to be on the pending list for temploid, which isn't always the case when generic lambda is involved. The workaround is under macro BOOST_HANA_WORKAROUND_MSVC_DECLTYPEAUTO_RETURNTYPE_662735 2. Issues fixed in the development branch of MSVC Parsing template id VC sometimes incorrectly parses a comparison operation as a template id. The workaround is under macro BOOST_HANA_WORKAROUND_MSVC_RDPARSER_TEMPLATEID_616568. 3. Issues fixed conditionally a. Empty base optimization VC doesn't always do EBO (empty base optimization). Changing this will break the ABI of MSVC and we provide a __declspec(empty_bases) to enable EBO. We have a blog post on this: https://blogs.msdn.microsoft.com/vcblog/2016/03/30/optimizing-the-layout-of-empty-base-classes-in-vs2015-update-2-3/. Some tests in hana have static_assert on the size of certain types which relies on EBO being applied: hana\test\detail\ebo.cpp hana\test\issues\github_202.cpp hana\test\pair\empty_storage.cpp hana\test\tuple\empty_member.cpp The workaround is under macro BOOST_HANA_WORKAROUND_MSVC_EMPTYBASE. b. Variadic macro expansion The implementation of variadic macro isn't conformant and the macro expansion often results in incorrect result. The issue is fixed under /experimental:preprocessor and isn't on by default yet. We have a blog post on this: https://blogs.msdn.microsoft.com/vcblog/2018/07/06/msvc-preprocessor-progress-towards-conformance/. The workaround is under macro BOOST_HANA_WORKAROUND_MSVC_PREPROCESSOR_616033. Here is the list of files impacted by the source workarounds: BOOST_HANA_WORKAROUND_MSVC_MULTIPLECTOR_106654 hana\test\_include\laws\base.hpp hana\test\map\cnstr.trap.cpp hana\test\set\cnstr.trap.cpp hana\test\tuple\cnstr.trap.cpp BOOST_HANA_WORKAROUND_MSVC_DECLTYPEAUTO_RETURNTYPE_662735 hana\test\_include\laws\euclidean_ring.hpp hana\test\_include\laws\group.hpp hana\test\_include\laws\monad_plus.hpp hana\test\_include\laws\monoid.hpp hana\test\_include\laws\ring.hpp BOOST_HANA_WORKAROUND_MSVC_RDPARSER_TEMPLATEID_616568 hana\include\boost\hana\basic_tuple.hpp hana\include\boost\hana\string.hpp hana\include\boost\hana\tuple.hpp BOOST_HANA_WORKAROUND_MSVC_EMPTYBASE hana\include\boost\hana\basic_tuple.hpp hana\include\boost\hana\pair.hpp hana\include\boost\hana\tuple.hpp hana\include\boost\hana\detail\integral_constant.hpp hana\test\detail\ebo.cpp BOOST_HANA_WORKAROUND_MSVC_PREPROCESSOR_616033 hana\include\boost\hana\detail\preprocessor.hpp hana\include\boost\hana\detail\struct_macros.hpp BTW, 1. There are some warnings which I don't fix. I will likely address them in a separate PR. They look legit and don't impact the build and tests. 2. Appveyor currently doesn't provide 15.8 Preview 5 which contains all the compiler fixes we made in the previous months. I plan to update appveyor.yml after Appveyor provides 15.8 RTM.
This commit is contained in:
@@ -85,14 +85,20 @@ function(boost_hana_set_test_properties target)
|
||||
endif()
|
||||
endmacro()
|
||||
|
||||
setflag(BOOST_HANA_HAS_FDIAGNOSTICS_COLOR -fdiagnostics-color)
|
||||
setflag(BOOST_HANA_HAS_FTEMPLATE_BACKTRACE_LIMIT -ftemplate-backtrace-limit=0)
|
||||
setflag(BOOST_HANA_HAS_PEDANTIC -pedantic)
|
||||
setflag(BOOST_HANA_HAS_WALL -Wall)
|
||||
setflag(BOOST_HANA_HAS_WERROR -Werror)
|
||||
setflag(BOOST_HANA_HAS_WEXTRA -Wextra)
|
||||
setflag(BOOST_HANA_HAS_WNO_UNUSED_LOCAL_TYPEDEFS -Wno-unused-local-typedefs)
|
||||
setflag(BOOST_HANA_HAS_WWRITE_STRINGS -Wwrite-strings)
|
||||
if (NOT MSVC)
|
||||
setflag(BOOST_HANA_HAS_FDIAGNOSTICS_COLOR -fdiagnostics-color)
|
||||
setflag(BOOST_HANA_HAS_FTEMPLATE_BACKTRACE_LIMIT -ftemplate-backtrace-limit=0)
|
||||
setflag(BOOST_HANA_HAS_PEDANTIC -pedantic)
|
||||
setflag(BOOST_HANA_HAS_WALL -Wall)
|
||||
setflag(BOOST_HANA_HAS_WERROR -Werror)
|
||||
setflag(BOOST_HANA_HAS_WEXTRA -Wextra)
|
||||
setflag(BOOST_HANA_HAS_WNO_UNUSED_LOCAL_TYPEDEFS -Wno-unused-local-typedefs)
|
||||
setflag(BOOST_HANA_HAS_WWRITE_STRINGS -Wwrite-strings)
|
||||
else()
|
||||
setflag(BOOST_HANA_HAS_MSVC_EHSC -EHsc)
|
||||
setflag(BOOST_HANA_HAS_MSVC_BIGOBJ -bigobj)
|
||||
setflag(BOOST_HANA_HAS_MSVC_TERNARY -Zc:ternary)
|
||||
endif()
|
||||
|
||||
if (NOT BOOST_HANA_ENABLE_EXCEPTIONS)
|
||||
setflag(BOOST_HANA_HAS_FNO_EXCEPTIONS -fno-exceptions)
|
||||
@@ -107,11 +113,13 @@ function(boost_hana_set_test_properties target)
|
||||
endif()
|
||||
|
||||
if (BOOST_HANA_ENABLE_STRING_UDL)
|
||||
target_compile_definitions(${target} PRIVATE -DBOOST_HANA_CONFIG_ENABLE_STRING_UDL)
|
||||
# GCC pretends to have the flag, but produces a "unrecognized command line option"
|
||||
# warning when we use it.
|
||||
if (NOT ${CMAKE_CXX_COMPILER_ID} STREQUAL "GNU")
|
||||
setflag(BOOST_HANA_HAS_WNO_GNU_STRING_UDL -Wno-gnu-string-literal-operator-template)
|
||||
if (NOT MSVC)
|
||||
target_compile_definitions(${target} PRIVATE -DBOOST_HANA_CONFIG_ENABLE_STRING_UDL)
|
||||
# GCC pretends to have the flag, but produces a "unrecognized command line option"
|
||||
# warning when we use it.
|
||||
if (NOT ${CMAKE_CXX_COMPILER_ID} STREQUAL "GNU")
|
||||
setflag(BOOST_HANA_HAS_WNO_GNU_STRING_UDL -Wno-gnu-string-literal-operator-template)
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
@@ -42,10 +42,18 @@ BOOST_HANA_NAMESPACE_BEGIN
|
||||
struct from_other { };
|
||||
|
||||
template <typename Indices, typename ...Xn>
|
||||
#ifdef BOOST_HANA_WORKAROUND_MSVC_EMPTYBASE
|
||||
struct __declspec(empty_bases) basic_tuple_impl;
|
||||
#else
|
||||
struct basic_tuple_impl;
|
||||
#endif
|
||||
|
||||
template <std::size_t ...n, typename ...Xn>
|
||||
#ifdef BOOST_HANA_WORKAROUND_MSVC_EMPTYBASE
|
||||
struct __declspec(empty_bases) basic_tuple_impl<std::index_sequence<n...>, Xn...>
|
||||
#else
|
||||
struct basic_tuple_impl<std::index_sequence<n...>, Xn...>
|
||||
#endif
|
||||
: detail::ebo<bti<n>, Xn>...
|
||||
{
|
||||
static constexpr std::size_t size_ = sizeof...(Xn);
|
||||
@@ -193,7 +201,11 @@ BOOST_HANA_NAMESPACE_BEGIN
|
||||
static constexpr auto apply(Xs&& xs, N const&) {
|
||||
constexpr std::size_t len = detail::decay<Xs>::type::size_;
|
||||
return drop_front_helper<N::value>(static_cast<Xs&&>(xs), std::make_index_sequence<
|
||||
#ifdef BOOST_HANA_WORKAROUND_MSVC_RDPARSER_TEMPLATEID_616568
|
||||
(N::value < len) ? len - N::value : 0
|
||||
#else
|
||||
N::value < len ? len - N::value : 0
|
||||
#endif
|
||||
>{});
|
||||
}
|
||||
};
|
||||
|
||||
@@ -20,7 +20,32 @@ Distributed under the Boost Software License, Version 1.0.
|
||||
#if defined(_MSC_VER) && !defined(__clang__) // MSVC
|
||||
// This must be checked first, because otherwise it produces a fatal
|
||||
// error due to unrecognized #warning directives used below.
|
||||
#if _MSC_VER < 1915
|
||||
# pragma message("Warning: the native Microsoft compiler is not supported due to lack of proper C++14 support.")
|
||||
#else
|
||||
// 1. Active issues
|
||||
// Multiple copy/move ctors
|
||||
#define BOOST_HANA_WORKAROUND_MSVC_MULTIPLECTOR_106654
|
||||
|
||||
// Forward declaration of class template member function returning decltype(auto)
|
||||
#define BOOST_HANA_WORKAROUND_MSVC_DECLTYPEAUTO_RETURNTYPE_662735
|
||||
|
||||
// 2. Issues fixed in the development branch of MSVC
|
||||
// RDParser incorrectly parses a comparison operation as a template id
|
||||
// This issue only impacts /permissive- or /std:c++17
|
||||
#define BOOST_HANA_WORKAROUND_MSVC_RDPARSER_TEMPLATEID_616568
|
||||
|
||||
// 3. Issues fixed conditionally
|
||||
// Requires __declspec(empty_bases)
|
||||
// Empty base optimization
|
||||
#define BOOST_HANA_WORKAROUND_MSVC_EMPTYBASE
|
||||
|
||||
#if !defined(_MSVC_TRADITIONAL) || _MSVC_TRADITIONAL
|
||||
// Requires /experimental:preprocessor
|
||||
// Variadic macro expansion
|
||||
#define BOOST_HANA_WORKAROUND_MSVC_PREPROCESSOR_616033
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#elif defined(__clang__) && defined(_MSC_VER) // Clang-cl (Clang for Windows)
|
||||
|
||||
@@ -72,7 +97,9 @@ Distributed under the Boost Software License, Version 1.0.
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
#if (__cplusplus < 201400)
|
||||
# if defined(_MSC_VER)
|
||||
#if _MSC_VER < 1915
|
||||
# pragma message("Warning: Your compiler doesn't provide C++14 or higher capabilities. Try adding the compiler flag '-std=c++14' or '-std=c++1y'.")
|
||||
#endif
|
||||
# else
|
||||
# warning "Your compiler doesn't provide C++14 or higher capabilities. Try adding the compiler flag '-std=c++14' or '-std=c++1y'."
|
||||
# endif
|
||||
|
||||
@@ -231,7 +231,11 @@ BOOST_HANA_NAMESPACE_BEGIN
|
||||
};
|
||||
#else
|
||||
template <typename T, T v>
|
||||
#ifdef BOOST_HANA_WORKAROUND_MSVC_EMPTYBASE
|
||||
struct __declspec(empty_bases) integral_constant
|
||||
#else
|
||||
struct integral_constant
|
||||
#endif
|
||||
: std::integral_constant<T, v>
|
||||
, detail::operators::adl<integral_constant<T, v>>
|
||||
{
|
||||
|
||||
@@ -22,7 +22,12 @@ Distributed under the Boost Software License, Version 1.0.
|
||||
|
||||
//! @ingroup group-details
|
||||
//! Expands to its first argument.
|
||||
#ifdef BOOST_HANA_WORKAROUND_MSVC_PREPROCESSOR_616033
|
||||
#define BOOST_HANA_PP_FRONT(...) BOOST_HANA_PP_FRONT_IMPL_I(__VA_ARGS__)
|
||||
#define BOOST_HANA_PP_FRONT_IMPL_I(...) BOOST_HANA_PP_CONCAT(BOOST_HANA_PP_FRONT_IMPL(__VA_ARGS__, ),)
|
||||
#else
|
||||
#define BOOST_HANA_PP_FRONT(...) BOOST_HANA_PP_FRONT_IMPL(__VA_ARGS__, )
|
||||
#endif
|
||||
#define BOOST_HANA_PP_FRONT_IMPL(e0, ...) e0
|
||||
|
||||
//! @ingroup group-details
|
||||
|
||||
@@ -67,8 +67,13 @@ BOOST_HANA_NAMESPACE_BEGIN namespace struct_detail {
|
||||
//!
|
||||
//! Specifically, `BOOST_HANA_PP_NARG(x1, ..., xn)` expands to `n`. It is
|
||||
//! an error to call this macro with 0 arguments.
|
||||
#ifdef BOOST_HANA_WORKAROUND_MSVC_PREPROCESSOR_616033
|
||||
#define BOOST_HANA_PP_NARG(...) \
|
||||
BOOST_HANA_PP_CONCAT(BOOST_HANA_PP_NARG_IMPL(__VA_ARGS__, 40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,),)
|
||||
#else
|
||||
#define BOOST_HANA_PP_NARG(...) \
|
||||
BOOST_HANA_PP_NARG_IMPL(__VA_ARGS__, 40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,)
|
||||
#endif
|
||||
|
||||
#define BOOST_HANA_PP_NARG_IMPL(e1,e2,e3,e4,e5,e6,e7,e8,e9,e10,e11,e12,e13,e14,e15,e16,e17,e18,e19,e20,e21,e22,e23,e24,e25,e26,e27,e28,e29,e30,e31,e32,e33,e34,e35,e36,e37,e38,e39,e40, N, ...) N
|
||||
|
||||
@@ -80,8 +85,14 @@ BOOST_HANA_NAMESPACE_BEGIN namespace struct_detail {
|
||||
#define BOOST_HANA_PP_BACK(...) \
|
||||
BOOST_HANA_PP_BACK_IMPL(BOOST_HANA_PP_NARG(__VA_ARGS__), __VA_ARGS__)
|
||||
|
||||
#ifdef BOOST_HANA_WORKAROUND_MSVC_PREPROCESSOR_616033
|
||||
#define BOOST_HANA_PP_BACK_IMPL(N, ...) BOOST_HANA_PP_BACK_IMPL_I(N, __VA_ARGS__)
|
||||
#define BOOST_HANA_PP_BACK_IMPL_I(N, ...) \
|
||||
BOOST_HANA_PP_CONCAT(BOOST_HANA_PP_CONCAT(BOOST_HANA_PP_BACK_IMPL_, N)(__VA_ARGS__),)
|
||||
#else
|
||||
#define BOOST_HANA_PP_BACK_IMPL(N, ...) \
|
||||
BOOST_HANA_PP_CONCAT(BOOST_HANA_PP_BACK_IMPL_, N)(__VA_ARGS__)
|
||||
#endif
|
||||
|
||||
|
||||
#define BOOST_HANA_PP_BACK_IMPL_1(e1) e1
|
||||
@@ -173,8 +184,14 @@ BOOST_HANA_NAMESPACE_BEGIN namespace struct_detail {
|
||||
#define BOOST_HANA_PP_DROP_BACK(...) \
|
||||
BOOST_HANA_PP_DROP_BACK_IMPL(BOOST_HANA_PP_NARG(__VA_ARGS__), __VA_ARGS__)
|
||||
|
||||
#ifdef BOOST_HANA_WORKAROUND_MSVC_PREPROCESSOR_616033
|
||||
#define BOOST_HANA_PP_DROP_BACK_IMPL(N, ...) BOOST_HANA_PP_DROP_BACK_IMPL_I(N, __VA_ARGS__)
|
||||
#define BOOST_HANA_PP_DROP_BACK_IMPL_I(N, ...) \
|
||||
BOOST_HANA_PP_CONCAT(BOOST_HANA_PP_CONCAT(BOOST_HANA_PP_DROP_BACK_IMPL_, N)(__VA_ARGS__),)
|
||||
#else
|
||||
#define BOOST_HANA_PP_DROP_BACK_IMPL(N, ...) \
|
||||
BOOST_HANA_PP_CONCAT(BOOST_HANA_PP_DROP_BACK_IMPL_, N)(__VA_ARGS__)
|
||||
#endif
|
||||
|
||||
|
||||
#define BOOST_HANA_PP_DROP_BACK_IMPL_1(e1)
|
||||
@@ -271,8 +288,14 @@ struct BOOST_HANA_ADAPT_STRUCT_must_be_called_in_the_global_namespace;
|
||||
static_assert(true, "force the usage of a trailing semicolon") \
|
||||
/**/
|
||||
|
||||
#ifdef BOOST_HANA_WORKAROUND_MSVC_PREPROCESSOR_616033
|
||||
#define BOOST_HANA_ADAPT_STRUCT_IMPL(N, ...) BOOST_HANA_ADAPT_STRUCT_IMPL_I(N, __VA_ARGS__)
|
||||
#define BOOST_HANA_ADAPT_STRUCT_IMPL_I(N, ...) \
|
||||
BOOST_HANA_PP_CONCAT(BOOST_HANA_PP_CONCAT(BOOST_HANA_ADAPT_STRUCT_IMPL_, N)(__VA_ARGS__),)
|
||||
#else
|
||||
#define BOOST_HANA_ADAPT_STRUCT_IMPL(N, ...) \
|
||||
BOOST_HANA_PP_CONCAT(BOOST_HANA_ADAPT_STRUCT_IMPL_, N)(__VA_ARGS__)
|
||||
#endif
|
||||
|
||||
|
||||
#define BOOST_HANA_ADAPT_STRUCT_IMPL_1(TYPE ) \
|
||||
@@ -1109,8 +1132,14 @@ struct BOOST_HANA_ADAPT_ADT_must_be_called_in_the_global_namespace;
|
||||
static_assert(true, "force the usage of a trailing semicolon") \
|
||||
/**/
|
||||
|
||||
#ifdef BOOST_HANA_WORKAROUND_MSVC_PREPROCESSOR_616033
|
||||
#define BOOST_HANA_ADAPT_ADT_IMPL(N, ...) BOOST_HANA_ADAPT_ADT_IMPL_I(N, __VA_ARGS__)
|
||||
#define BOOST_HANA_ADAPT_ADT_IMPL_I(N, ...) \
|
||||
BOOST_HANA_PP_CONCAT(BOOST_HANA_PP_CONCAT(BOOST_HANA_ADAPT_ADT_IMPL_, N)(__VA_ARGS__),)
|
||||
#else
|
||||
#define BOOST_HANA_ADAPT_ADT_IMPL(N, ...) \
|
||||
BOOST_HANA_PP_CONCAT(BOOST_HANA_ADAPT_ADT_IMPL_, N)(__VA_ARGS__)
|
||||
#endif
|
||||
|
||||
|
||||
#define BOOST_HANA_ADAPT_ADT_IMPL_1(TYPE ) \
|
||||
@@ -1981,8 +2010,14 @@ struct BOOST_HANA_ADAPT_ADT_must_be_called_in_the_global_namespace;
|
||||
#define BOOST_HANA_DEFINE_STRUCT(...) \
|
||||
BOOST_HANA_DEFINE_STRUCT_IMPL(BOOST_HANA_PP_NARG(__VA_ARGS__), __VA_ARGS__)
|
||||
|
||||
#ifdef BOOST_HANA_WORKAROUND_MSVC_PREPROCESSOR_616033
|
||||
#define BOOST_HANA_DEFINE_STRUCT_IMPL(N, ...) BOOST_HANA_DEFINE_STRUCT_IMPL_I(N, __VA_ARGS__)
|
||||
#define BOOST_HANA_DEFINE_STRUCT_IMPL_I(N, ...) \
|
||||
BOOST_HANA_PP_CONCAT(BOOST_HANA_PP_CONCAT(BOOST_HANA_DEFINE_STRUCT_IMPL_, N)(__VA_ARGS__),)
|
||||
#else
|
||||
#define BOOST_HANA_DEFINE_STRUCT_IMPL(N, ...) \
|
||||
BOOST_HANA_PP_CONCAT(BOOST_HANA_DEFINE_STRUCT_IMPL_, N)(__VA_ARGS__)
|
||||
#endif
|
||||
|
||||
|
||||
#define BOOST_HANA_DEFINE_STRUCT_IMPL_1(TYPE ) \
|
||||
|
||||
@@ -37,7 +37,11 @@ BOOST_HANA_NAMESPACE_BEGIN
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
//! @cond
|
||||
template <typename First, typename Second>
|
||||
#ifdef BOOST_HANA_WORKAROUND_MSVC_EMPTYBASE
|
||||
struct __declspec(empty_bases) pair : detail::operators::adl<pair<First, Second>>
|
||||
#else
|
||||
struct pair : detail::operators::adl<pair<First, Second>>
|
||||
#endif
|
||||
, private detail::ebo<detail::pix<0>, First>
|
||||
, private detail::ebo<detail::pix<1>, Second>
|
||||
{
|
||||
|
||||
@@ -271,7 +271,11 @@ BOOST_HANA_NAMESPACE_BEGIN
|
||||
template <char ...xs, typename N>
|
||||
static constexpr auto apply(string<xs...> const& s, N const&) {
|
||||
return helper<N::value>(s, std::make_index_sequence<
|
||||
#ifdef BOOST_HANA_WORKAROUND_MSVC_RDPARSER_TEMPLATEID_616568
|
||||
(N::value < sizeof...(xs)) ? sizeof...(xs) - N::value : 0
|
||||
#else
|
||||
N::value < sizeof...(xs) ? sizeof...(xs) - N::value : 0
|
||||
#endif
|
||||
>{});
|
||||
}
|
||||
|
||||
|
||||
@@ -75,7 +75,11 @@ BOOST_HANA_NAMESPACE_BEGIN
|
||||
// tuple
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
template <>
|
||||
#ifdef BOOST_HANA_WORKAROUND_MSVC_EMPTYBASE
|
||||
struct __declspec(empty_bases) tuple<> final
|
||||
#else
|
||||
struct tuple<> final
|
||||
#endif
|
||||
: detail::operators::adl<tuple<>>
|
||||
, detail::iterable_operators<tuple<>>
|
||||
{
|
||||
@@ -84,7 +88,11 @@ BOOST_HANA_NAMESPACE_BEGIN
|
||||
};
|
||||
|
||||
template <typename ...Xn>
|
||||
#ifdef BOOST_HANA_WORKAROUND_MSVC_EMPTYBASE
|
||||
struct __declspec(empty_bases) tuple final
|
||||
#else
|
||||
struct tuple final
|
||||
#endif
|
||||
: detail::operators::adl<tuple<Xn...>>
|
||||
, detail::iterable_operators<tuple<Xn...>>
|
||||
{
|
||||
@@ -256,7 +264,11 @@ BOOST_HANA_NAMESPACE_BEGIN
|
||||
static constexpr auto apply(Xs&& xs, N const&) {
|
||||
constexpr std::size_t len = decltype(hana::length(xs))::value;
|
||||
return helper<N::value>(static_cast<Xs&&>(xs), std::make_index_sequence<
|
||||
#ifdef BOOST_HANA_WORKAROUND_MSVC_RDPARSER_TEMPLATEID_616568
|
||||
(N::value < len) ? len - N::value : 0
|
||||
#else
|
||||
N::value < len ? len - N::value : 0
|
||||
#endif
|
||||
>{});
|
||||
}
|
||||
};
|
||||
|
||||
@@ -94,7 +94,9 @@ namespace boost { namespace hana {
|
||||
struct trap_construct {
|
||||
trap_construct() = default;
|
||||
trap_construct(trap_construct const&) = default;
|
||||
#ifndef BOOST_HANA_WORKAROUND_MSVC_MULTIPLECTOR_106654
|
||||
trap_construct(trap_construct&) = default;
|
||||
#endif
|
||||
trap_construct(trap_construct&&) = default;
|
||||
|
||||
template <typename X>
|
||||
|
||||
@@ -39,6 +39,10 @@ namespace boost { namespace hana { namespace test {
|
||||
static_assert(EuclideanRing<decltype(x)>{}, "");
|
||||
});
|
||||
|
||||
#ifdef BOOST_HANA_WORKAROUND_MSVC_DECLTYPEAUTO_RETURNTYPE_662735
|
||||
zero<D>(); // force adding zero<D>'s member function to pending temploid list
|
||||
#endif
|
||||
|
||||
foreach2(xs, [](auto a, auto b) {
|
||||
|
||||
// commutativity
|
||||
|
||||
@@ -29,6 +29,10 @@ namespace boost { namespace hana { namespace test {
|
||||
static_assert(Group<decltype(x)>{}, "");
|
||||
});
|
||||
|
||||
#ifdef BOOST_HANA_WORKAROUND_MSVC_DECLTYPEAUTO_RETURNTYPE_662735
|
||||
zero<G>(); // force adding zero<G>'s member function to pending temploid list
|
||||
#endif
|
||||
|
||||
foreach2(xs, [](auto x, auto y) {
|
||||
|
||||
// left inverse
|
||||
|
||||
@@ -46,6 +46,10 @@ namespace boost { namespace hana { namespace test {
|
||||
struct TestMonadPlus<M, laws> {
|
||||
template <typename Xs, typename Predicates, typename Values>
|
||||
TestMonadPlus(Xs xs, Predicates predicates, Values values) {
|
||||
#ifdef BOOST_HANA_WORKAROUND_MSVC_DECLTYPEAUTO_RETURNTYPE_662735
|
||||
empty<M>(); // force adding empty<M>'s member function to pending temploid list
|
||||
#endif
|
||||
|
||||
hana::for_each(xs, [](auto a) {
|
||||
static_assert(MonadPlus<decltype(a)>{}, "");
|
||||
|
||||
|
||||
@@ -26,6 +26,10 @@ namespace boost { namespace hana { namespace test {
|
||||
struct TestMonoid<M, laws> {
|
||||
template <typename Xs>
|
||||
TestMonoid(Xs xs) {
|
||||
#ifdef BOOST_HANA_WORKAROUND_MSVC_DECLTYPEAUTO_RETURNTYPE_662735
|
||||
zero<M>(); // force adding zero<M>'s member function to pending temploid list
|
||||
#endif
|
||||
|
||||
hana::for_each(xs, hana::capture(xs)([](auto xs, auto a) {
|
||||
static_assert(Monoid<decltype(a)>{}, "");
|
||||
|
||||
|
||||
@@ -35,6 +35,10 @@ namespace boost { namespace hana { namespace test {
|
||||
struct TestRing<R, laws> {
|
||||
template <typename Xs>
|
||||
TestRing(Xs xs) {
|
||||
#ifdef BOOST_HANA_WORKAROUND_MSVC_DECLTYPEAUTO_RETURNTYPE_662735
|
||||
one<R>(); // force adding one<R>'s member function to pending temploid list
|
||||
#endif
|
||||
|
||||
hana::for_each(xs, hana::capture(xs)([](auto xs, auto x) {
|
||||
static_assert(Ring<decltype(x)>{}, "");
|
||||
|
||||
|
||||
@@ -15,7 +15,11 @@ using hana::detail::ebo;
|
||||
|
||||
template <int> struct empty { };
|
||||
template <int> struct idx;
|
||||
#ifdef BOOST_HANA_WORKAROUND_MSVC_EMPTYBASE
|
||||
template <typename ...Bases> struct __declspec(empty_bases) inherit : Bases... { };
|
||||
#else
|
||||
template <typename ...Bases> struct inherit : Bases... { };
|
||||
#endif
|
||||
|
||||
static_assert(sizeof(inherit<>) == sizeof(inherit<ebo<idx<0>, empty<0>>>), "");
|
||||
static_assert(sizeof(inherit<>) == sizeof(inherit<ebo<idx<0>, empty<0>>, ebo<idx<1>, empty<1>>>), "");
|
||||
|
||||
@@ -20,7 +20,9 @@ template <int i>
|
||||
struct Trap {
|
||||
Trap() = default;
|
||||
Trap(Trap const&) = default;
|
||||
#ifndef BOOST_HANA_WORKAROUND_MSVC_MULTIPLECTOR_106654
|
||||
Trap(Trap&) = default;
|
||||
#endif
|
||||
Trap(Trap&&) = default;
|
||||
|
||||
template <typename X>
|
||||
|
||||
@@ -19,7 +19,9 @@ template <int i>
|
||||
struct Trap {
|
||||
Trap() = default;
|
||||
Trap(Trap const&) = default;
|
||||
#ifndef BOOST_HANA_WORKAROUND_MSVC_MULTIPLECTOR_106654
|
||||
Trap(Trap&) = default;
|
||||
#endif
|
||||
Trap(Trap&&) = default;
|
||||
|
||||
template <typename X>
|
||||
|
||||
@@ -14,7 +14,9 @@ namespace hana = boost::hana;
|
||||
struct Trap1 {
|
||||
Trap1() = default;
|
||||
Trap1(Trap1 const&) = default;
|
||||
#ifndef BOOST_HANA_WORKAROUND_MSVC_MULTIPLECTOR_106654
|
||||
Trap1(Trap1&) = default;
|
||||
#endif
|
||||
Trap1(Trap1&&) = default;
|
||||
|
||||
template <typename X>
|
||||
@@ -27,7 +29,9 @@ struct Trap1 {
|
||||
struct Trap2 {
|
||||
Trap2() = default;
|
||||
Trap2(Trap2 const&) = default;
|
||||
#ifndef BOOST_HANA_WORKAROUND_MSVC_MULTIPLECTOR_106654
|
||||
Trap2(Trap2&) = default;
|
||||
#endif
|
||||
Trap2(Trap2&&) = default;
|
||||
|
||||
template <typename X>
|
||||
@@ -40,7 +44,9 @@ struct Trap2 {
|
||||
struct Trap3 {
|
||||
Trap3() = default;
|
||||
Trap3(Trap3 const&) = default;
|
||||
#ifndef BOOST_HANA_WORKAROUND_MSVC_MULTIPLECTOR_106654
|
||||
Trap3(Trap3&) = default;
|
||||
#endif
|
||||
Trap3(Trap3&&) = default;
|
||||
|
||||
template <typename X>
|
||||
|
||||
Reference in New Issue
Block a user