diff --git a/.travis.yml b/.travis.yml index 9db3bca0..0528f49d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,11 +11,6 @@ os: - linux - osx -branches: - only: - - master - - develop - env: matrix: - BOGUS_JOB=true @@ -30,6 +25,20 @@ matrix: - os: linux env: TOOLSET=gcc CXXSTD=03,11,1y + - os: linux + env: TOOLSET=gcc-4.4 CXXSTD=98,0x + addons: + apt: + packages: + - g++-4.4 + + - 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: @@ -153,6 +162,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 d75679ef..4613ff61 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -7,25 +7,35 @@ version: 1.0.{build}-{branch} shallow_clone: true -branches: - only: - - master - - develop - 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 @@ -72,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% diff --git a/doc/fusion.qbk b/doc/fusion.qbk index 0a24cb32..6d6987d5 100644 --- a/doc/fusion.qbk +++ b/doc/fusion.qbk @@ -2,6 +2,7 @@ Copyright (C) 2001-2011 Joel de Guzman Copyright (C) 2006 Dan Marsden Copyright (C) 2010 Christopher Schmidt + Copyright (C) 2018 Kohei Takahashi Use, modification and distribution is subject to the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at @@ -20,39 +21,37 @@ ] ] -[def __spirit__ [@http://spirit.sourceforge.net Spirit]] -[def __phoenix__ [@http://www.boost.org/libs/phoenix/index.html Phoenix]] -[def __mpl__ [@http://www.boost.org/libs/mpl/index.html MPL]] +[def __spirit__ [@http://boost-spirit.com/home/ Spirit]] +[def __phoenix__ [@http://www.boost.org/libs/phoenix Phoenix]] +[def __mpl__ [@http://www.boost.org/libs/mpl MPL]] [def __stl__ [@http://en.wikipedia.org/wiki/Standard_Template_Library STL]] -[def __tuple__ [@http://www.boost.org/libs/tuple/doc/tuple_users_guide.html Boost.Tuple]] +[def __tuple__ [@http://www.boost.org/libs/tuple Boost.Tuple]] [def __tr1__tuple__ [@http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2002/n1403.pdf TR1 Tuple]] [def __boost_tools__ [@http://www.boost.org/tools/index.html Boost Tools]] -[def __spirit_list__ [@https://lists.sourceforge.net/lists/listinfo/spirit-general Spirit Mailing List]] -[def __spirit_general__ [@news://news.gmane.org/gmane.comp.spirit.general Spirit General NNTP news portal]] -[def __gmane__ [@http://www.gmane.org Gmane]] -[def __mlist_archive__ [@http://news.gmane.org/gmane.comp.parsers.spirit.general]] +[def __spirit_list__ [@https://sourceforge.net/projects/spirit/lists/spirit-general Spirit Mailing List]] +[def __list_archive__ [@https://sourceforge.net/p/spirit/mailman/spirit-general/ archive]] [def __jaakko_jarvi__ [@http://www.boost.org/people/jaakko_jarvi.htm Jaakko Jarvi]] [def __david_abrahams__ [@http://www.boost.org/people/dave_abrahams.htm David Abrahams]] [def __the_forwarding_problem__ [@http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2002/n1385.htm The Forwarding Problem]] -[def __boost_any__ [@http://www.boost.org/doc/html/any.html Boost.Any]] +[def __boost_any__ [@http://www.boost.org/libs/any Boost.Any Library]] [def __new_iterator_concepts__ [@http://www.boost.org/libs/iterator/doc/new-iter-concepts.html New Iterator Concepts]] -[def __boost_array_library__ [@http://www.boost.org/doc/html/array.html Boost.Array Library]] -[def __boost_variant_library__ [@http://www.boost.org/doc/html/variant.html Boost.Variant Library]] -[def __boost_tuple_library__ [@http://www.boost.org/libs/tuple/doc/tuple_users_guide.html Boost.Tuple Library]] -[def __boost_ref__ [@http://www.boost.org/doc/html/ref.html Boost.Ref]] -[def __boost_ref_call__ [@http://www.boost.org/doc/html/ref.html `ref`]] -[def __boost_result_of__ [@http://www.boost.org/libs/utility/utility.htm#result_of Boost.ResultOf]] +[def __boost_array_library__ [@http://www.boost.org/libs/array Boost.Array Library]] +[def __boost_variant_library__ [@http://www.boost.org/libs/variant Boost.Variant Library]] +[def __boost_tuple_library__ [@http://www.boost.org/libs/tuple Boost.Tuple Library]] +[def __boost_ref__ [@http://www.boost.org/libs/core/ref.html Ref utility]] +[def __boost_ref_call__ [@http://www.boost.org/libs/core/ref.html `ref`]] +[def __boost_result_of__ [@http://www.boost.org/libs/utility/utility.htm#result_of ResultOf utility]] [def __boost_result_of_call__ [@http://www.boost.org/libs/utility/utility.htm#result_of `boost::result_of`]] -[def __boost_enable_if__ [@http://www.boost.org/libs/utility/enable_if.html Boost.EnableIf utility]] -[def __boost_shared_ptr_call__ [@http://www.boost.org/libs/smart_ptr/shared_ptr.htm `boost::shared_ptr`]] -[def __boost_func_forward__ [@http://www.boost.org/libs/functional/forward/doc/html/index.html Boost.Functional/Forward]] -[def __boost_func_factory__ [@http://www.boost.org/libs/functional/factory/doc/html/index.html Boost.Functional/Factory]] -[def __boost_func_hash__ [@http://www.boost.org/doc/html/hash.html Boost.Functional/Hash]] -[def __std_pair_doc__ [@http://www.sgi.com/tech/stl/pair.html `std::pair`]] +[def __boost_enable_if__ [@http://www.boost.org/libs/core/doc/html/core/enable_if.html EnableIf utility]] +[def __boost_shared_ptr_call__ [@http://www.boost.org/libs/smart_ptr#shared_ptr `boost::shared_ptr`]] +[def __boost_func_forward__ [@http://www.boost.org/libs/functional/forward Boost.Functional/Forward Library]] +[def __boost_func_factory__ [@http://www.boost.org/libs/functional/factory Boost.Functional/Factory Library]] +[def __boost_func_hash__ [@http://www.boost.org/doc/html/hash.html Boost.ContainerHash Library]] +[def __std_pair_doc__ [@http://en.cppreference.com/w/cpp/utility/pair `std::pair`]] [def __std_tuple_doc__ [@http://en.cppreference.com/w/cpp/utility/tuple `std::tuple`]] -[def __std_plus_doc__ [@http://www.sgi.com/tech/stl/plus.html `std::plus`]] -[def __std_minus_doc__ [@http://www.sgi.com/tech/stl/minus.html `std::minus`]] +[def __std_plus_doc__ [@http://en.cppreference.com/w/cpp/utility/functional/plus `std::plus`]] +[def __std_minus_doc__ [@http://en.cppreference.com/w/cpp/utility/functional/minus `std::minus`]] [def __mpl_integral_constant__ [@http://www.boost.org/libs/mpl/doc/refmanual/integral-constant.html MPL Integral Constant]] [def __mpl_boolean_constant__ [@http://www.boost.org/libs/mpl/doc/refmanual/integral-constant.html MPL Boolean Constant]] diff --git a/doc/preface.qbk b/doc/preface.qbk index 2fff963a..a6ab573f 100644 --- a/doc/preface.qbk +++ b/doc/preface.qbk @@ -61,11 +61,8 @@ tool. QuickBook can be found in the __boost_tools__. [heading Support] Please direct all questions to Spirit's mailing list. You can subscribe to the -__spirit_list__. The mailing list has a searchable archive. A search link to -this archive is provided in __spirit__'s home page. You may also read and post -messages to the mailing list through __spirit_general__ (thanks to __gmane__). -The news group mirrors the mailing list. Here is a link to the archives: -__mlist_archive__. +__spirit_list__. The mailing list has a searchable archive. Here is a link to +the archives: __list_archive__. [endsect] diff --git a/doc/references.qbk b/doc/references.qbk index d0d63019..a07815d4 100644 --- a/doc/references.qbk +++ b/doc/references.qbk @@ -1,6 +1,7 @@ [/============================================================================== Copyright (C) 2001-2011 Joel de Guzman Copyright (C) 2006 Dan Marsden + Copyright (C) 2018 Kohei Takahashi Use, modification and distribution is subject to the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at @@ -8,20 +9,20 @@ ===============================================================================/] [section References] -# [@http://boost.org/libs/iterator/doc/new-iter-concepts.html New Iterator Concepts], +# [@http://www.boost.org/libs/iterator/doc/new-iter-concepts.html New Iterator Concepts], David Abrahams, Jeremy Siek, Thomas Witt, 2004-11-01. -# [@http://boost.org/libs/tuple/doc/tuple_users_guide.html The Boost Tuple Library], +# [@http://www.boost.org/libs/tuple The Boost Tuple Library], Jaakko Jarvi, 2001. -# [@http://www.boost.org/libs/spirit/ Spirit Parser Library], +# [@http://www.boost.org/libs/spirit Spirit Parser Library], Joel de Guzman, 2001-2006. -# [@http://www.boost.org/libs/mpl/ The Boost MPL Library], +# [@http://www.boost.org/libs/mpl The Boost MPL Library], Aleksey Gurtovoy and David Abrahams, 2002-2004. -# [@http://www.boost.org/doc/html/array.html Boost Array], +# [@http://www.boost.org/libs/array The Boost Array Library], Nicolai Josuttis, 2002-2004. -# [@http://www.sgi.com/tech/stl/ Standard Template Library Programmer's Guide], - Hewlett-Packard Company, 1994. -# [@http://www.boost.org/doc/html/ref.html Boost.Ref], +# [@http://www.boost.org/libs/core/ref.html Boost.Core / Ref utility], Jaakko Jarvi, Peter Dimov, Douglas Gregor, Dave Abrahams, 1999-2002. +# [@http://www.boost.org/libs/hana The Boost Hana Library], + Louis Dionne, 2017. [endsect] 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)) {} 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/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..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,10 +9,6 @@ #define BOOST_FUSION_MAP_DETAIL_VALUE_AT_KEY_IMPL_02042013_0821 #include -#include -#include -#include -#include #include namespace boost { namespace fusion @@ -29,9 +26,9 @@ namespace boost { namespace fusion template struct apply { - typedef - decltype(boost::declval().get_val(mpl::identity())) - 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 a2b9b2f6..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 @@ -23,6 +22,7 @@ /////////////////////////////////////////////////////////////////////////////// #include #include +#include namespace boost { namespace fusion { @@ -35,7 +35,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,9 +49,9 @@ namespace boost { namespace fusion template struct apply { - typedef - decltype(vector_detail::value_at_impl(boost::declval())) - type; + typedef typename BOOST_FUSION_IDENTIFIED_TYPE(( + vector_detail::value_at_impl(boost::declval()) + )) type; }; }; } diff --git a/include/boost/fusion/support/category_of.hpp b/include/boost/fusion/support/category_of.hpp index 92b0ea1b..7397c45a 100644 --- a/include/boost/fusion/support/category_of.hpp +++ b/include/boost/fusion/support/category_of.hpp @@ -8,7 +8,6 @@ #define FUSION_CATEGORY_OF_07202005_0308 #include -#include #include #include @@ -44,7 +43,10 @@ namespace boost { namespace fusion struct category_of_impl { template - struct apply : detail::fusion_category_of {}; + struct apply + { + typedef typename T::category type; + }; }; template <> diff --git a/include/boost/fusion/support/config.hpp b/include/boost/fusion/support/config.hpp index 23554531..d27266ed 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,2015,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,24 @@ 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)) || BOOST_WORKAROUND(BOOST_GCC, < 40700) +# 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 + + +// Workaround for GCC 4.6 that rejects defaulted function with noexcept. +#if BOOST_WORKAROUND(BOOST_GCC, / 100 == 406) +# define BOOST_FUSION_NOEXCEPT_ON_DEFAULTED +#else +# define BOOST_FUSION_NOEXCEPT_ON_DEFAULTED BOOST_NOEXCEPT +#endif + #endif diff --git a/include/boost/fusion/support/detail/and.hpp b/include/boost/fusion/support/detail/and.hpp index 1b310dda..42926cb1 100644 --- a/include/boost/fusion/support/detail/and.hpp +++ b/include/boost/fusion/support/detail/and.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) @@ -8,6 +9,7 @@ #define FUSION_AND_07152016_1625 #include +#include #include #if defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) @@ -15,6 +17,8 @@ #endif namespace boost { namespace fusion { namespace detail { +#if defined(BOOST_NO_CXX17_FOLD_EXPRESSIONS) \ + || BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1913)) template struct and_impl : false_type {}; @@ -34,6 +38,10 @@ namespace boost { namespace fusion { namespace detail { recursive. */ template struct and_ : and_impl1 {}; +#else + template + struct and_ : integral_constant {}; +#endif }}} #endif // FUSION_AND_07152016_1625 diff --git a/include/boost/fusion/support/detail/category_of.hpp b/include/boost/fusion/support/detail/category_of.hpp deleted file mode 100644 index e7ac44e5..00000000 --- a/include/boost/fusion/support/detail/category_of.hpp +++ /dev/null @@ -1,19 +0,0 @@ -/*============================================================================= - Copyright (c) 2001-2011 Joel de Guzman - - 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) -==============================================================================*/ -#if !defined(FUSION_CATEGORY_OF_07212005_1025) -#define FUSION_CATEGORY_OF_07212005_1025 - -namespace boost { namespace fusion { namespace detail -{ - template - struct fusion_category_of - { - typedef typename T::category type; - }; -}}} - -#endif diff --git a/include/boost/fusion/support/detail/is_mpl_sequence.hpp b/include/boost/fusion/support/detail/is_mpl_sequence.hpp index 24b86624..16b6db12 100644 --- a/include/boost/fusion/support/detail/is_mpl_sequence.hpp +++ b/include/boost/fusion/support/detail/is_mpl_sequence.hpp @@ -9,19 +9,17 @@ #define FUSION_DETAIL_IS_MPL_SEQUENCE_29122006_1105 #include -#include +#include #include #include #include -#include -#include namespace boost { namespace fusion { namespace detail { template struct is_mpl_sequence : mpl::and_< - mpl::not_, is_convertible > > + mpl::not_ > , mpl::is_sequence > {}; }}} diff --git a/include/boost/fusion/support/detail/is_native_fusion_sequence.hpp b/include/boost/fusion/support/detail/is_native_fusion_sequence.hpp new file mode 100644 index 00000000..189c784d --- /dev/null +++ b/include/boost/fusion/support/detail/is_native_fusion_sequence.hpp @@ -0,0 +1,27 @@ +/*============================================================================= + 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) +==============================================================================*/ +#ifndef BOOST_FUSION_IS_NATIVE_FUSION_SEQUENCE +#define BOOST_FUSION_IS_NATIVE_FUSION_SEQUENCE + +#include +#include +#include +#include +#include + +namespace boost { namespace fusion { namespace detail +{ + template + struct is_native_fusion_sequence + : mpl::and_< + is_complete + , is_convertible + > + {}; +}}} + +#endif diff --git a/include/boost/fusion/support/detail/is_view.hpp b/include/boost/fusion/support/detail/is_view.hpp deleted file mode 100644 index c518dfc4..00000000 --- a/include/boost/fusion/support/detail/is_view.hpp +++ /dev/null @@ -1,19 +0,0 @@ -/*============================================================================= - Copyright (c) 2001-2011 Joel de Guzman - - 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) -==============================================================================*/ -#if !defined(FUSION_IS_VIEW_03202006_0018) -#define FUSION_IS_VIEW_03202006_0018 - -namespace boost { namespace fusion { namespace detail -{ - template - struct fusion_is_view - { - typedef typename T::is_view type; - }; -}}} - -#endif diff --git a/include/boost/fusion/support/detail/unknown_key.hpp b/include/boost/fusion/support/detail/unknown_key.hpp deleted file mode 100644 index 9466b9c0..00000000 --- a/include/boost/fusion/support/detail/unknown_key.hpp +++ /dev/null @@ -1,16 +0,0 @@ -/*============================================================================= - Copyright (c) 2001-2011 Joel de Guzman - - 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) -==============================================================================*/ -#if !defined(FUSION_UNKNOWN_KEY_09242005_1219) -#define FUSION_UNKNOWN_KEY_09242005_1219 - -namespace boost { namespace fusion { namespace detail -{ - template - struct unknown_key {}; -}}} - -#endif diff --git a/include/boost/fusion/support/is_sequence.hpp b/include/boost/fusion/support/is_sequence.hpp index af7c84e1..95a9423f 100644 --- a/include/boost/fusion/support/is_sequence.hpp +++ b/include/boost/fusion/support/is_sequence.hpp @@ -10,13 +10,10 @@ #include #include #include -#include +#include #include #include -#include -#include #include -#include namespace boost { namespace fusion { @@ -69,13 +66,7 @@ namespace boost { namespace fusion > {}; - template - struct is_native_fusion_sequence - : mpl::and_< - is_complete, - is_convertible - > - {}; + using detail::is_native_fusion_sequence; } }} diff --git a/include/boost/fusion/support/is_view.hpp b/include/boost/fusion/support/is_view.hpp index c54e60e1..a6ca7259 100644 --- a/include/boost/fusion/support/is_view.hpp +++ b/include/boost/fusion/support/is_view.hpp @@ -9,7 +9,6 @@ #include #include -#include #include namespace boost { namespace fusion @@ -28,8 +27,9 @@ namespace boost { namespace fusion { template struct apply - : detail::fusion_is_view - {}; + { + typedef typename T::is_view type; + }; }; template <> diff --git a/include/boost/fusion/support/unused.hpp b/include/boost/fusion/support/unused.hpp index 964839ab..c376d07f 100644 --- a/include/boost/fusion/support/unused.hpp +++ b/include/boost/fusion/support/unused.hpp @@ -1,5 +1,6 @@ /*============================================================================= Copyright (c) 2001-2011 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) @@ -10,7 +11,6 @@ #include #include -#include #if defined(BOOST_MSVC) # pragma warning(push) # pragma warning(disable: 4522) // multiple assignment operators specified warning @@ -23,9 +23,16 @@ namespace boost { namespace fusion struct unused_type { BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED - unused_type() BOOST_NOEXCEPT + BOOST_DEFAULTED_FUNCTION( + unused_type() BOOST_FUSION_NOEXCEPT_ON_DEFAULTED, { - } + }) + + BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED + BOOST_DEFAULTED_FUNCTION( + unused_type(unused_type const&) BOOST_FUSION_NOEXCEPT_ON_DEFAULTED, + { + }) template BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED @@ -33,35 +40,12 @@ namespace boost { namespace fusion { } - template - BOOST_FUSION_CONSTEXPR_THIS BOOST_FUSION_GPU_ENABLED - unused_type const& - operator=(T const&) const BOOST_NOEXCEPT - { - return *this; - } - - template - BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED - unused_type& - operator=(T const&) BOOST_NOEXCEPT - { - return *this; - } - BOOST_FUSION_CONSTEXPR_THIS BOOST_FUSION_GPU_ENABLED unused_type const& operator=(unused_type const&) const BOOST_NOEXCEPT { return *this; } - - BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED - unused_type& - operator=(unused_type const&) BOOST_NOEXCEPT - { - return *this; - } }; BOOST_CONSTEXPR_OR_CONST unused_type unused = unused_type(); 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, diff --git a/test/Jamfile b/test/Jamfile index a61239d0..9289033c 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 ] @@ -266,6 +267,7 @@ project [ compile support/and.cpp : [ requires cxx11_variadic_templates ] ] [ compile support/tag_of.cpp ] + [ compile support/unused.cpp ] # [ compile-fail xxx.cpp ] 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(); } diff --git a/test/sequence/github-176.cpp b/test/sequence/github-176.cpp new file mode 100644 index 00000000..3301220d --- /dev/null +++ b/test/sequence/github-176.cpp @@ -0,0 +1,89 @@ +/*============================================================================= + 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 +#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); +} + +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; + + test_at >(); + test_at >(); + 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 > >(); +} 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)); } diff --git a/test/sequence/traits.hpp b/test/sequence/traits.hpp index b409936e..3684604e 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 @@ -88,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) )); @@ -131,6 +132,7 @@ void test_constructible() FUSION_SEQUENCE, convertible, convertible >(true) )); +#endif // !(gcc < 4.7) } #endif // is_constructible is available 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(( diff --git a/test/support/and.cpp b/test/support/and.cpp index b657ead5..604a68d7 100644 --- a/test/support/and.cpp +++ b/test/support/and.cpp @@ -11,24 +11,18 @@ # error "does not meet requirements" #endif -#include #include #include -#include +#include -int main() { - using namespace boost; - using namespace boost::fusion::detail; - - BOOST_TEST((and_<>::value)); - BOOST_TEST(!(and_::value)); - BOOST_TEST((and_::value)); - BOOST_TEST(!(and_::value)); - BOOST_TEST((and_::value)); - BOOST_TEST(!(and_::value)); - BOOST_TEST((and_::value)); - BOOST_TEST((and_::value)); - - return boost::report_errors(); -} +using namespace boost; +using namespace boost::fusion::detail; +BOOST_MPL_ASSERT((and_<>)); +BOOST_MPL_ASSERT_NOT((and_)); +BOOST_MPL_ASSERT((and_)); +BOOST_MPL_ASSERT_NOT((and_)); +BOOST_MPL_ASSERT((and_)); +BOOST_MPL_ASSERT_NOT((and_)); +BOOST_MPL_ASSERT((and_)); +BOOST_MPL_ASSERT((and_)); diff --git a/test/support/unused.cpp b/test/support/unused.cpp new file mode 100644 index 00000000..28d2ffda --- /dev/null +++ b/test/support/unused.cpp @@ -0,0 +1,95 @@ +/*============================================================================= + 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 +#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES +#include +#endif + +struct T { }; + +void unused_construction() +{ + boost::fusion::unused_type dephault; + + boost::fusion::unused_type BOOST_ATTRIBUTE_UNUSED parenthesis(); +#ifndef BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX + boost::fusion::unused_type BOOST_ATTRIBUTE_UNUSED brace{}; + boost::fusion::unused_type BOOST_ATTRIBUTE_UNUSED list_copy = {}; +#endif + + boost::fusion::unused_type copy_copy BOOST_ATTRIBUTE_UNUSED = dephault; + boost::fusion::unused_type copy_direct BOOST_ATTRIBUTE_UNUSED (dephault); +#ifndef BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX + boost::fusion::unused_type copy_copy_brace_direct BOOST_ATTRIBUTE_UNUSED = {dephault}; + boost::fusion::unused_type copy_direct_brace BOOST_ATTRIBUTE_UNUSED {dephault}; +#endif + +#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES + boost::fusion::unused_type move_copy BOOST_ATTRIBUTE_UNUSED = std::move(dephault); + boost::fusion::unused_type move_direct BOOST_ATTRIBUTE_UNUSED (std::move(dephault)); +#ifndef BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX + boost::fusion::unused_type move_copy_brace_direct BOOST_ATTRIBUTE_UNUSED = {std::move(dephault)}; + boost::fusion::unused_type move_direct_brace BOOST_ATTRIBUTE_UNUSED {std::move(dephault)}; +#endif +#endif + + + T value; + + boost::fusion::unused_type T_copy_copy BOOST_ATTRIBUTE_UNUSED = value; + boost::fusion::unused_type T_copy_direct BOOST_ATTRIBUTE_UNUSED (value); +#ifndef BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX + boost::fusion::unused_type T_copy_copy_brace_direct BOOST_ATTRIBUTE_UNUSED = {value}; + boost::fusion::unused_type T_copy_direct_brace BOOST_ATTRIBUTE_UNUSED {value}; +#endif + +#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES + boost::fusion::unused_type T_move_copy BOOST_ATTRIBUTE_UNUSED = std::move(value); + boost::fusion::unused_type T_move_direct BOOST_ATTRIBUTE_UNUSED (std::move(value)); +#ifndef BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX + boost::fusion::unused_type T_move_copy_brace_direct BOOST_ATTRIBUTE_UNUSED = {std::move(value)}; + boost::fusion::unused_type T_move_direct_brace BOOST_ATTRIBUTE_UNUSED {std::move(value)}; +#endif +#endif +} + +void unused_assignment() +{ + boost::fusion::unused_type val1, val2; + + val1 = val2; +#ifndef BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX + val1 = {}; +#endif +#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES + val1 = std::move(val2); +#endif + + + T value; + + val1 = value; +#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES + val1 = std::move(value); +#endif +} + +boost::type_traits::yes_type test_unused(boost::fusion::detail::unused_only const&); +boost::type_traits::no_type test_unused(...); + +void only_unused() +{ + BOOST_STATIC_ASSERT((sizeof(test_unused(boost::fusion::unused)) == sizeof(boost::type_traits::yes_type))); + BOOST_STATIC_ASSERT((sizeof(test_unused(0)) == sizeof(boost::type_traits::no_type))); + + boost::fusion::unused_type my_unused; + BOOST_STATIC_ASSERT((sizeof(test_unused(my_unused)) == sizeof(boost::type_traits::yes_type))); +}