From 6c96720080bbb8b24c8c1e73e6cd7567e2fd19bf Mon Sep 17 00:00:00 2001 From: Kohei Takahashi Date: Sat, 17 Feb 2018 17:27:20 +0900 Subject: [PATCH 01/17] CI: Remove build branch restriction --- .travis.yml | 5 ----- appveyor.yml | 5 ----- 2 files changed, 10 deletions(-) diff --git a/.travis.yml b/.travis.yml index 9db3bca0..37e78e50 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,11 +11,6 @@ os: - linux - osx -branches: - only: - - master - - develop - env: matrix: - BOGUS_JOB=true diff --git a/appveyor.yml b/appveyor.yml index d75679ef..fb161009 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -7,11 +7,6 @@ version: 1.0.{build}-{branch} shallow_clone: true -branches: - only: - - master - - develop - environment: matrix: - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013 From 28ea5daccebf0303c3179d404d7ad939519c291b Mon Sep 17 00:00:00 2001 From: Kohei Takahashi Date: Sat, 17 Feb 2018 17:45:49 +0900 Subject: [PATCH 02/17] CI: Added more build target --- .travis.yml | 32 ++++++++++++++++++++++++++++++++ appveyor.yml | 17 ++++++++++++++++- 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 37e78e50..fab21c73 100644 --- a/.travis.yml +++ b/.travis.yml @@ -25,6 +25,27 @@ matrix: - os: linux env: TOOLSET=gcc CXXSTD=03,11,1y + - os: linux + env: TOOLSET=gcc-4.4 CXXSTD=03,0x + addons: + apt: + packages: + - g++-4.4 + + - os: linux + env: TOOLSET=gcc-4.5 CXXSTD=03,0x + addons: + apt: + packages: + - g++-4.5 + + - os: linux + env: TOOLSET=gcc-4.6 CXXSTD=03,0x + addons: + apt: + packages: + - g++-4.6 + - os: linux env: TOOLSET=gcc-4.7 CXXSTD=03,11 addons: @@ -148,6 +169,17 @@ matrix: - ubuntu-toolchain-r-test - llvm-toolchain-trusty-4.0 + - os: linux + env: TOOLSET=clang-5.0 CXXSTD=03,11,14,1z,2a + addons: + apt: + packages: + - clang-5.0 + - libstdc++-4.9-dev + sources: + - ubuntu-toolchain-r-test + - llvm-toolchain-trusty-5.0 + - os: osx env: TOOLSET=clang COMPILER=clang++ CXXSTD=03,11,14,1z diff --git a/appveyor.yml b/appveyor.yml index fb161009..4613ff61 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -11,16 +11,31 @@ environment: matrix: - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013 TOOLSET: msvc-9.0 + CXXSTD: latest # fake - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013 TOOLSET: msvc-10.0 + CXXSTD: latest # fake - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013 TOOLSET: msvc-11.0 + CXXSTD: latest # fake - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013 TOOLSET: msvc-12.0 + CXXSTD: latest # fake - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015 TOOLSET: msvc-14.0 + CXXSTD: 14 + - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015 + TOOLSET: msvc-14.0 + CXXSTD: latest - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 TOOLSET: msvc-14.1 + CXXSTD: 14 + - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 + TOOLSET: msvc-14.1 + CXXSTD: 17 + - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 + TOOLSET: msvc-14.1 + CXXSTD: latest install: - set BOOST_BRANCH=develop @@ -67,4 +82,4 @@ install: build: off test_script: - - b2 -j%NUMBER_OF_PROCESSORS% --hash libs/fusion/test toolset=%TOOLSET% + - b2 -j%NUMBER_OF_PROCESSORS% --hash libs/fusion/test toolset=%TOOLSET% cxxstd=%CXXSTD% From d0c17119e72238e41fcb688b3e91e04ccedcb824 Mon Sep 17 00:00:00 2001 From: Kohei Takahashi Date: Sat, 17 Feb 2018 17:46:03 +0900 Subject: [PATCH 03/17] CI: skip known to fail --- test/sequence/define_struct_inline_move.cpp | 6 +++--- test/sequence/define_tpl_struct_inline_move.cpp | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/test/sequence/define_struct_inline_move.cpp b/test/sequence/define_struct_inline_move.cpp index 951f7e4f..3c707404 100644 --- a/test/sequence/define_struct_inline_move.cpp +++ b/test/sequence/define_struct_inline_move.cpp @@ -47,8 +47,8 @@ int main() BOOST_TEST(y.w.value == 42); } - // Older MSVCs don't generate move ctor by default. -#if !(defined(CI_SKIP_KNOWN_FAILURE) && BOOST_WORKAROUND(BOOST_MSVC, < 1900)) + // Older MSVCs and gcc 4.4 don't generate move ctor by default. +#if !(defined(CI_SKIP_KNOWN_FAILURE) && (BOOST_WORKAROUND(BOOST_MSVC, < 1900) || BOOST_WORKAROUND(BOOST_GCC, / 100 == 404))) { ns::value x; ns::value y(std::move(x)); // move @@ -66,7 +66,7 @@ int main() BOOST_TEST(x.w.value == 0); BOOST_TEST(y.w.value == 0); } -#endif // !(ci && msvc < 14.0) +#endif // !(ci && (msvc < 14.0 || gcc 4.4.x)) return boost::report_errors(); } diff --git a/test/sequence/define_tpl_struct_inline_move.cpp b/test/sequence/define_tpl_struct_inline_move.cpp index b95da6f6..39a00079 100644 --- a/test/sequence/define_tpl_struct_inline_move.cpp +++ b/test/sequence/define_tpl_struct_inline_move.cpp @@ -47,8 +47,8 @@ int main() BOOST_TEST(y.w.value == 42); } - // Older MSVCs don't generate move ctor by default. -#if !(defined(CI_SKIP_KNOWN_FAILURE) && BOOST_WORKAROUND(BOOST_MSVC, < 1900)) + // Older MSVCs and gcc 4.4 don't generate move ctor by default. +#if !(defined(CI_SKIP_KNOWN_FAILURE) && (BOOST_WORKAROUND(BOOST_MSVC, < 1900) || BOOST_WORKAROUND(BOOST_GCC, / 100 == 404))) { ns::value x; ns::value y(std::move(x)); // move @@ -66,7 +66,7 @@ int main() BOOST_TEST(x.w.value == 0); BOOST_TEST(y.w.value == 0); } -#endif // !(ci && msvc < 14.0) +#endif // !(ci && (msvc < 14.0 || gcc 4.4.x)) return boost::report_errors(); } From eb0cbbc34789feceac5f152a22bb36396eba0118 Mon Sep 17 00:00:00 2001 From: Kohei Takahashi Date: Sun, 18 Feb 2018 21:25:51 +0900 Subject: [PATCH 04/17] CI: trusty doesn't provide gcc 4.5 --- .travis.yml | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/.travis.yml b/.travis.yml index fab21c73..0528f49d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -26,19 +26,12 @@ matrix: env: TOOLSET=gcc CXXSTD=03,11,1y - os: linux - env: TOOLSET=gcc-4.4 CXXSTD=03,0x + env: TOOLSET=gcc-4.4 CXXSTD=98,0x addons: apt: packages: - g++-4.4 - - os: linux - env: TOOLSET=gcc-4.5 CXXSTD=03,0x - addons: - apt: - packages: - - g++-4.5 - - os: linux env: TOOLSET=gcc-4.6 CXXSTD=03,0x addons: From eeeee9bfbbab6a747167b089a88bc9b20ca3ea63 Mon Sep 17 00:00:00 2001 From: Kohei Takahashi Date: Mon, 19 Feb 2018 22:40:56 +0900 Subject: [PATCH 05/17] Fixed ambiguous call of hash_value ADL also picks stdext::hash_value which msvc providing. --- test/sequence/hash.hpp | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/test/sequence/hash.hpp b/test/sequence/hash.hpp index 7dea0a3f..b298f418 100644 --- a/test/sequence/hash.hpp +++ b/test/sequence/hash.hpp @@ -1,5 +1,6 @@ /*============================================================================= Copyright (c) 2014 Christoph Weiss + Copyright (c) 2017 Kohei Takahashi Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) @@ -11,24 +12,24 @@ #include #include -void -hash_test() +void hash_test() { - using namespace boost::fusion; + namespace fusion = boost::fusion; + using namespace fusion; const FUSION_SEQUENCE v0(42, 'x', false, "Aurea prima"); const FUSION_SEQUENCE v1(42, 'x', false, "Aurea prima"); - BOOST_TEST(hash_value(v0) == hash_value(v1)); - + BOOST_TEST(fusion::hash_value(v0) == fusion::hash_value(v1)); + const FUSION_SEQUENCE w(41, 'x', false, "Aurea prima"); - BOOST_TEST(hash_value(w) != hash_value(v0)); - + BOOST_TEST(fusion::hash_value(w) != fusion::hash_value(v0)); + const FUSION_SEQUENCE x(42, 'y', false, "Aurea prima"); - BOOST_TEST(hash_value(x) != hash_value(v0)); - + BOOST_TEST(fusion::hash_value(x) != fusion::hash_value(v0)); + const FUSION_SEQUENCE y(42, 'x', true, "Aurea prima"); - BOOST_TEST(hash_value(y) != hash_value(v0)); - + BOOST_TEST(fusion::hash_value(y) != fusion::hash_value(v0)); + const FUSION_SEQUENCE z(42, 'x', false, "quae vindice nullo"); - BOOST_TEST(hash_value(z) != hash_value(v0)); + BOOST_TEST(fusion::hash_value(z) != fusion::hash_value(v0)); } From 25c6334c58c0e7f062be1aff877f6e96bccae65e Mon Sep 17 00:00:00 2001 From: Kohei Takahashi Date: Sat, 3 Mar 2018 16:20:08 +0900 Subject: [PATCH 06/17] meta: Update failure toolset name --- meta/explicit-failures-markup.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/meta/explicit-failures-markup.xml b/meta/explicit-failures-markup.xml index 27438953..c2e6ea97 100644 --- a/meta/explicit-failures-markup.xml +++ b/meta/explicit-failures-markup.xml @@ -9,8 +9,8 @@ - - + + The compiler doesn't generate defaulted move ctor/assgin thus perform copy construction/assginment. Even though such case, From 9de32721749b635ff3e04e690da89cf06602c122 Mon Sep 17 00:00:00 2001 From: Kohei Takahashi Date: Tue, 6 Mar 2018 00:40:41 +0900 Subject: [PATCH 07/17] Added workaround for GCC 4.4/c++0x Teh call of ctor is ambiguous since gcc 4.4 allows binding rvalue to lvalue reference. --- .../fusion/container/deque/detail/keyed_element.hpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/include/boost/fusion/container/deque/detail/keyed_element.hpp b/include/boost/fusion/container/deque/detail/keyed_element.hpp index 15b68667..3ab88b92 100644 --- a/include/boost/fusion/container/deque/detail/keyed_element.hpp +++ b/include/boost/fusion/container/deque/detail/keyed_element.hpp @@ -13,6 +13,11 @@ #include #include +#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && BOOST_WORKAROUND(BOOST_GCC, / 100 == 404) +#include +#include +#endif + namespace boost { namespace fusion { struct fusion_sequence_tag; @@ -114,8 +119,13 @@ namespace boost { namespace fusion { namespace detail {} #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) +#if BOOST_WORKAROUND(BOOST_GCC, / 100 == 404) + template >::type> +#else + typedef Value Value_; +#endif BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED - keyed_element(Value&& value, Rest&& rest) + keyed_element(Value_&& value, Rest&& rest) : Rest(std::move(rest)) , value_(BOOST_FUSION_FWD_ELEM(Value, value)) {} From e962c1abb5312df23868a83ac66dd9da9773ca5f Mon Sep 17 00:00:00 2001 From: Kohei Takahashi Date: Wed, 18 Apr 2018 22:31:35 +0900 Subject: [PATCH 08/17] Fixed vector compile error with C-style array --- .../boost/fusion/container/vector/detail/value_at_impl.hpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/include/boost/fusion/container/vector/detail/value_at_impl.hpp b/include/boost/fusion/container/vector/detail/value_at_impl.hpp index a2b9b2f6..d7270aed 100644 --- a/include/boost/fusion/container/vector/detail/value_at_impl.hpp +++ b/include/boost/fusion/container/vector/detail/value_at_impl.hpp @@ -23,6 +23,7 @@ /////////////////////////////////////////////////////////////////////////////// #include #include +#include namespace boost { namespace fusion { @@ -35,7 +36,7 @@ namespace boost { namespace fusion template static inline BOOST_FUSION_GPU_ENABLED - U value_at_impl(store const volatile*); + mpl::identity value_at_impl(store const volatile*); } namespace extension @@ -49,8 +50,8 @@ namespace boost { namespace fusion template struct apply { - typedef - decltype(vector_detail::value_at_impl(boost::declval())) + typedef typename + decltype(vector_detail::value_at_impl(boost::declval()))::type type; }; }; From 96b2e51828e2df9bf6540a62687b9e62bf4039c8 Mon Sep 17 00:00:00 2001 From: Kohei Takahashi Date: Wed, 18 Apr 2018 22:33:36 +0900 Subject: [PATCH 09/17] Added test for #176 --- test/Jamfile | 1 + test/sequence/github-176.cpp | 50 ++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 test/sequence/github-176.cpp diff --git a/test/Jamfile b/test/Jamfile index a61239d0..9492e83f 100644 --- a/test/Jamfile +++ b/test/Jamfile @@ -237,6 +237,7 @@ project [ run sequence/ref_vector.cpp ] [ run sequence/flatten_view.cpp ] [ compile sequence/github-159.cpp ] + [ run sequence/github-176.cpp ] [ compile sequence/size.cpp ] diff --git a/test/sequence/github-176.cpp b/test/sequence/github-176.cpp new file mode 100644 index 00000000..553e83c2 --- /dev/null +++ b/test/sequence/github-176.cpp @@ -0,0 +1,50 @@ +/*============================================================================= + Copyright (c) 2018 Kohei Takahashi + + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +==============================================================================*/ + +#include +#include +#include +#include +#include +#include + +template +void test_at() +{ + Sequence seq; + + // zero initialized + BOOST_TEST(boost::fusion::at_c<0>(seq)[0] == 0); + BOOST_TEST(boost::fusion::at_c<0>(seq)[1] == 0); + BOOST_TEST(boost::fusion::at_c<0>(seq)[2] == 0); + + int (&arr)[3] = boost::fusion::deref(boost::fusion::begin(seq)); + + arr[0] = 2; + arr[1] = 4; + arr[2] = 6; + + BOOST_TEST(boost::fusion::at_c<0>(seq)[0] == 2); + BOOST_TEST(boost::fusion::at_c<0>(seq)[1] == 4); + BOOST_TEST(boost::fusion::at_c<0>(seq)[2] == 6); + + boost::fusion::at_c<0>(seq)[1] = 42; + + BOOST_TEST(boost::fusion::at_c<0>(seq)[0] == 2); + BOOST_TEST(boost::fusion::at_c<0>(seq)[1] == 42); + BOOST_TEST(boost::fusion::at_c<0>(seq)[2] == 6); +} + +int main() +{ + using namespace boost::fusion; + + test_at >(); + test_at >(); + test_at >(); + test_at >(); +} From dd695c1dbd07476d324fbd7973008fbafc129748 Mon Sep 17 00:00:00 2001 From: Kohei Takahashi Date: Wed, 18 Apr 2018 22:38:09 +0900 Subject: [PATCH 10/17] Fixed a compile error bug similar to previous vector's one --- include/boost/fusion/container/map/detail/map_impl.hpp | 6 +----- .../fusion/container/map/detail/value_at_key_impl.hpp | 7 ++----- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/include/boost/fusion/container/map/detail/map_impl.hpp b/include/boost/fusion/container/map/detail/map_impl.hpp index c62145ba..360c5d09 100644 --- a/include/boost/fusion/container/map/detail/map_impl.hpp +++ b/include/boost/fusion/container/map/detail/map_impl.hpp @@ -125,11 +125,7 @@ namespace boost { namespace fusion { namespace detail } BOOST_FUSION_GPU_ENABLED - value_type get_val(mpl::identity); - BOOST_FUSION_GPU_ENABLED - pair_type get_val(mpl::int_); - BOOST_FUSION_GPU_ENABLED - value_type get_val(mpl::identity) const; + mpl::identity get_val(mpl::identity) const; BOOST_FUSION_GPU_ENABLED pair_type get_val(mpl::int_) const; diff --git a/include/boost/fusion/container/map/detail/value_at_key_impl.hpp b/include/boost/fusion/container/map/detail/value_at_key_impl.hpp index 94d2da47..10873087 100644 --- a/include/boost/fusion/container/map/detail/value_at_key_impl.hpp +++ b/include/boost/fusion/container/map/detail/value_at_key_impl.hpp @@ -8,9 +8,6 @@ #define BOOST_FUSION_MAP_DETAIL_VALUE_AT_KEY_IMPL_02042013_0821 #include -#include -#include -#include #include #include @@ -29,8 +26,8 @@ namespace boost { namespace fusion template struct apply { - typedef - decltype(boost::declval().get_val(mpl::identity())) + typedef typename + decltype(boost::declval().get_val(mpl::identity()))::type type; }; }; From 757541f9d2f22faebf18665c3b6fe03203b428cf Mon Sep 17 00:00:00 2001 From: Kohei Takahashi Date: Wed, 18 Apr 2018 22:39:55 +0900 Subject: [PATCH 11/17] Updated c-style array test for associative container --- test/sequence/github-176.cpp | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/test/sequence/github-176.cpp b/test/sequence/github-176.cpp index 553e83c2..82960e9a 100644 --- a/test/sequence/github-176.cpp +++ b/test/sequence/github-176.cpp @@ -6,9 +6,12 @@ ==============================================================================*/ #include +#include #include #include #include +#include +#include #include #include @@ -39,6 +42,36 @@ void test_at() BOOST_TEST(boost::fusion::at_c<0>(seq)[2] == 6); } +template inline T& value(T& v) { return v; } +template inline T& value(boost::fusion::pair& v) { return v.second; } + +template +void test_at_key() +{ + Sequence seq; + + // zero initialized + BOOST_TEST(boost::fusion::at_key(seq)[0] == 0); + BOOST_TEST(boost::fusion::at_key(seq)[1] == 0); + BOOST_TEST(boost::fusion::at_key(seq)[2] == 0); + + int (&arr)[3] = value(boost::fusion::deref(boost::fusion::begin(seq))); + + arr[0] = 2; + arr[1] = 4; + arr[2] = 6; + + BOOST_TEST(boost::fusion::at_key(seq)[0] == 2); + BOOST_TEST(boost::fusion::at_key(seq)[1] == 4); + BOOST_TEST(boost::fusion::at_key(seq)[2] == 6); + + boost::fusion::at_key(seq)[1] = 42; + + BOOST_TEST(boost::fusion::at_key(seq)[0] == 2); + BOOST_TEST(boost::fusion::at_key(seq)[1] == 42); + BOOST_TEST(boost::fusion::at_key(seq)[2] == 6); +} + int main() { using namespace boost::fusion; @@ -47,4 +80,7 @@ int main() test_at >(); test_at >(); test_at >(); + + test_at_key >(); + test_at_key > >(); } From a273cd8131a5b5ebd25282e8c79f68e25a5f2610 Mon Sep 17 00:00:00 2001 From: Kohei Takahashi Date: Thu, 19 Apr 2018 00:21:41 +0900 Subject: [PATCH 12/17] Added workaround for msvc-14.x --- .../container/map/detail/value_at_key_impl.hpp | 8 ++++---- .../container/vector/detail/value_at_impl.hpp | 9 ++++----- include/boost/fusion/support/config.hpp | 14 +++++++++++++- 3 files changed, 21 insertions(+), 10 deletions(-) diff --git a/include/boost/fusion/container/map/detail/value_at_key_impl.hpp b/include/boost/fusion/container/map/detail/value_at_key_impl.hpp index 10873087..da6259e6 100644 --- a/include/boost/fusion/container/map/detail/value_at_key_impl.hpp +++ b/include/boost/fusion/container/map/detail/value_at_key_impl.hpp @@ -1,5 +1,6 @@ /*============================================================================= Copyright (c) 2001-2013 Joel de Guzman + Copyright (c) 2018 Kohei Takahashi Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) @@ -8,7 +9,6 @@ #define BOOST_FUSION_MAP_DETAIL_VALUE_AT_KEY_IMPL_02042013_0821 #include -#include #include namespace boost { namespace fusion @@ -26,9 +26,9 @@ namespace boost { namespace fusion template struct apply { - typedef typename - decltype(boost::declval().get_val(mpl::identity()))::type - type; + typedef typename BOOST_FUSION_IDENTIFIED_TYPE(( + boost::declval().get_val(mpl::identity()) + )) type; }; }; } diff --git a/include/boost/fusion/container/vector/detail/value_at_impl.hpp b/include/boost/fusion/container/vector/detail/value_at_impl.hpp index d7270aed..a2dd5fcd 100644 --- a/include/boost/fusion/container/vector/detail/value_at_impl.hpp +++ b/include/boost/fusion/container/vector/detail/value_at_impl.hpp @@ -1,5 +1,5 @@ /*============================================================================= - Copyright (c) 2014 Kohei Takahashi + Copyright (c) 2014,2018 Kohei Takahashi Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) @@ -7,7 +7,6 @@ #ifndef FUSION_VALUE_AT_IMPL_16122014_1641 #define FUSION_VALUE_AT_IMPL_16122014_1641 -#include #include #include @@ -50,9 +49,9 @@ namespace boost { namespace fusion template struct apply { - typedef typename - decltype(vector_detail::value_at_impl(boost::declval()))::type - type; + typedef typename BOOST_FUSION_IDENTIFIED_TYPE(( + vector_detail::value_at_impl(boost::declval()) + )) type; }; }; } diff --git a/include/boost/fusion/support/config.hpp b/include/boost/fusion/support/config.hpp index 23554531..65fe2f35 100644 --- a/include/boost/fusion/support/config.hpp +++ b/include/boost/fusion/support/config.hpp @@ -1,6 +1,6 @@ /*============================================================================= Copyright (c) 2014 Eric Niebler - Copyright (c) 2014 Kohei Takahashi + Copyright (c) 2014,2018 Kohei Takahashi Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) @@ -96,4 +96,16 @@ namespace std #define BOOST_FUSION_CONSTEXPR_THIS BOOST_CONSTEXPR #endif + +// Workaround for compiler which doesn't compile decltype(expr)::type. +// It expects decltype(expr) deduced as mpl::identity. +#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1913)) +# include +# define BOOST_FUSION_IDENTIFIED_TYPE(parenthesized_expr) \ + boost::mpl::identity::type::type +#else +# define BOOST_FUSION_IDENTIFIED_TYPE(parenthesized_expr) \ + decltype parenthesized_expr ::type +#endif + #endif From 7443cb110177331bc16ba02f50d84a5eef7bbf78 Mon Sep 17 00:00:00 2001 From: Kohei Takahashi Date: Fri, 20 Apr 2018 13:04:02 +0900 Subject: [PATCH 13/17] Changed availability condition to what Boost.TT providing --- test/sequence/traits.hpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/test/sequence/traits.hpp b/test/sequence/traits.hpp index b409936e..2bff18d8 100644 --- a/test/sequence/traits.hpp +++ b/test/sequence/traits.hpp @@ -1,5 +1,6 @@ /*============================================================================= Copyright (C) 2016 Lee Clagett + Copyright (C) 2018 Kohei Takahashi Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) @@ -38,9 +39,7 @@ bool is_convertible(bool has_conversion) } // is_constructible has a few requirements -#if !defined(BOOST_NO_CXX11_DECLTYPE) && \ - !defined(BOOST_NO_CXX11_TEMPLATES) && \ - !defined(BOOST_NO_SFINAE_EXPR) +#ifdef BOOST_TT_IS_CONSTRUCTIBLE_CONFORMING #define FUSION_TEST_HAS_CONSTRUCTIBLE From a95a838779db7dfd35bc6807a94a5f65d735ba5e Mon Sep 17 00:00:00 2001 From: Kohei Takahashi Date: Sat, 21 Apr 2018 18:22:24 +0900 Subject: [PATCH 14/17] Added workaround to test is_constructible on GCC < 4.7 always fail to test non unary ctor --- test/sequence/traits.hpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/test/sequence/traits.hpp b/test/sequence/traits.hpp index 2bff18d8..3684604e 100644 --- a/test/sequence/traits.hpp +++ b/test/sequence/traits.hpp @@ -87,7 +87,9 @@ void test_constructible() BOOST_TEST(( is_constructible, convertible>(true) )); - + + // boost::is_constructible always fail to test ctor which takes 2 or more arguments on GCC 4.7. +#if !BOOST_WORKAROUND(BOOST_GCC, < 40700) BOOST_TEST(( is_constructible, int, int>(true) )); @@ -130,6 +132,7 @@ void test_constructible() FUSION_SEQUENCE, convertible, convertible >(true) )); +#endif // !(gcc < 4.7) } #endif // is_constructible is available From e818089a9182ee231fceb13d7e8301a3e471dbf0 Mon Sep 17 00:00:00 2001 From: Kohei Takahashi Date: Sat, 21 Apr 2018 19:18:09 +0900 Subject: [PATCH 15/17] likewise --- test/sequence/tuple_traits.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/sequence/tuple_traits.cpp b/test/sequence/tuple_traits.cpp index 6d18c231..f065504a 100644 --- a/test/sequence/tuple_traits.cpp +++ b/test/sequence/tuple_traits.cpp @@ -65,10 +65,13 @@ main() BOOST_TEST((is_constructible, int, int>(false))); BOOST_TEST((is_constructible< tuple >(true))); + // boost::is_constructible always fail to test ctor which takes 2 or more arguments on GCC 4.7. +#if !BOOST_WORKAROUND(BOOST_GCC, < 40700) BOOST_TEST((is_constructible, int, int>(true))); BOOST_TEST(( is_constructible, int, int>(true) )); +#endif // !(gcc < 4.7) BOOST_TEST((is_constructible, int, int>(false))); BOOST_TEST((is_constructible, int, int>(false))); BOOST_TEST(( From 3b8fb67b52ad02ca4d5ba379661f0c19b23e732c Mon Sep 17 00:00:00 2001 From: Kohei Takahashi Date: Sun, 22 Apr 2018 03:44:57 +0900 Subject: [PATCH 16/17] Update WA condition --- include/boost/fusion/support/config.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/boost/fusion/support/config.hpp b/include/boost/fusion/support/config.hpp index 65fe2f35..5a0f572e 100644 --- a/include/boost/fusion/support/config.hpp +++ b/include/boost/fusion/support/config.hpp @@ -99,7 +99,7 @@ namespace std // Workaround for compiler which doesn't compile decltype(expr)::type. // It expects decltype(expr) deduced as mpl::identity. -#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1913)) +#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1913)) || BOOST_WORKAROUND(BOOST_GCC, < 40700) # include # define BOOST_FUSION_IDENTIFIED_TYPE(parenthesized_expr) \ boost::mpl::identity::type::type From e8da43a5395bd9712bee186f3250b3d43ff43cb0 Mon Sep 17 00:00:00 2001 From: Kohei Takahashi Date: Thu, 26 Apr 2018 00:02:57 +0900 Subject: [PATCH 17/17] Added workaround for gcc 4.6 with C array --- include/boost/fusion/container/list/cons.hpp | 4 ++++ test/sequence/github-176.cpp | 3 +++ 2 files changed, 7 insertions(+) diff --git a/include/boost/fusion/container/list/cons.hpp b/include/boost/fusion/container/list/cons.hpp index 0dd91b0c..dd7f8873 100644 --- a/include/boost/fusion/container/list/cons.hpp +++ b/include/boost/fusion/container/list/cons.hpp @@ -70,6 +70,10 @@ namespace boost { namespace fusion cons(cons const& rhs) : car(rhs.car), cdr(rhs.cdr) {} +#if BOOST_WORKAROUND(BOOST_GCC, / 100 == 406) && !defined(BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS) + // Workaround for `array used as initializer` compile error on gcc 4.6 w/ c++0x. + template +#endif BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED cons(cons const& rhs) : car(rhs.car), cdr(rhs.cdr) {} diff --git a/test/sequence/github-176.cpp b/test/sequence/github-176.cpp index 82960e9a..3301220d 100644 --- a/test/sequence/github-176.cpp +++ b/test/sequence/github-176.cpp @@ -81,6 +81,9 @@ int main() test_at >(); test_at >(); +#if !BOOST_WORKAROUND(BOOST_GCC, / 100 == 406) || defined(BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS) + // FIXME: gcc 4.6 w/ c++0x doesn't like set with array... test_at_key >(); +#endif test_at_key > >(); }