Compare commits

..

12 Commits

Author SHA1 Message Date
71ad390cf0 Merge pull request #162 from boostorg/develop
Post beta merge
2017-12-03 00:08:31 +09:00
e6b5879511 Merge pull request #157 from boostorg/develop
Merge develop to master
2017-10-31 09:40:44 +09:00
84d8afbb31 Merge pull request #147 from boostorg/develop
Develop to Master
2017-06-19 23:43:44 +09:00
715a7fb729 Merge pull request #141 from boostorg/develop
Boost 1.63.0 beta release
2016-11-01 17:03:05 +09:00
3b96c3b70b Add, and update, documentation build targets. 2016-10-10 11:39:49 -05:00
904d3c2c01 Merge pull request #131 from boostorg/develop
post 1.61.0 beta1
2016-04-02 12:44:16 +08:00
0263c75cd8 Merge pull request #125 from boostorg/develop
Release Candidate for 1.61.0.
2016-03-03 06:58:37 +08:00
53ba3de15a Merge pull request #119 from boostorg/develop
Post 1.60.0 Beta bugfixes.
2015-12-11 15:06:59 +08:00
d6c853f7ad Merge pull request #111 from boostorg/develop
1.60.0 beta
2015-10-28 07:42:24 +08:00
dc55e5e103 Merge pull request #98 from Flast/bugfix/issue-11517
Fix #11517 (for master)
2015-08-04 08:14:48 +08:00
1646a7252b Merge pull request #95 from Flast/preprocess
Regenerate preprocessed files.
2015-07-28 08:03:50 +08:00
dae9964b15 Merge pull request #93 from Flast/bugfix/issue-11140
Fix a issue with nested fusion::tuple.
2015-07-27 15:26:37 +08:00
38 changed files with 317 additions and 353 deletions

View File

@ -1,5 +1,5 @@
# Copyright 2016, 2017 Peter Dimov
# Copyright 2017-2018 Kohei Takahashi
# Copyright 2017 Kohei Takahashi
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or copy at http://boost.org/LICENSE_1_0.txt)
@ -167,7 +167,6 @@ install:
- git submodule init libs/bind
- git submodule init libs/concept_check
- git submodule init libs/config
- git submodule init libs/container_hash
- git submodule init libs/conversion
- git submodule init libs/core
- git submodule init libs/detail
@ -202,4 +201,4 @@ install:
- ./b2 headers
script:
- ./b2 -j`(nproc || sysctl -n hw.ncpu) 2> /dev/null` libs/fusion/test toolset=$TOOLSET cxxstd=$CXXSTD
- ./b2 libs/fusion/test toolset=$TOOLSET cxxstd=$CXXSTD define=RUNNING_ON_TRAVIS=1

View File

@ -1,5 +1,5 @@
# Copyright 2016, 2017 Peter Dimov
# Copyright 2017-2018 Kohei Takahashi
# Copyright 2017 Kohei Takahashi
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or copy at http://boost.org/LICENSE_1_0.txt)
@ -39,7 +39,6 @@ install:
- git submodule init libs/bind
- git submodule init libs/concept_check
- git submodule init libs/config
- git submodule init libs/container_hash
- git submodule init libs/conversion
- git submodule init libs/core
- git submodule init libs/detail
@ -72,4 +71,4 @@ install:
build: off
test_script:
- b2 -j%NUMBER_OF_PROCESSORS% --hash libs/fusion/test toolset=%TOOLSET%
- b2 libs/fusion/test toolset=%TOOLSET% define=RUNNING_ON_APPVEYOR=1

View File

@ -2,7 +2,6 @@
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
@ -21,37 +20,39 @@
]
]
[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 __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 __stl__ [@http://en.wikipedia.org/wiki/Standard_Template_Library STL]]
[def __tuple__ [@http://www.boost.org/libs/tuple Boost.Tuple]]
[def __tuple__ [@http://www.boost.org/libs/tuple/doc/tuple_users_guide.html 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://sourceforge.net/projects/spirit/lists/spirit-general Spirit Mailing List]]
[def __list_archive__ [@https://sourceforge.net/p/spirit/mailman/spirit-general/ archive]]
[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 __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/libs/any Boost.Any Library]]
[def __boost_any__ [@http://www.boost.org/doc/html/any.html Boost.Any]]
[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/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_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_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/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 __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 __std_tuple_doc__ [@http://en.cppreference.com/w/cpp/utility/tuple `std::tuple`]]
[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 __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 __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]]

View File

@ -61,8 +61,11 @@ 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. Here is a link to
the archives: __list_archive__.
__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__.
[endsect]

View File

@ -1,7 +1,6 @@
[/==============================================================================
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
@ -9,20 +8,20 @@
===============================================================================/]
[section References]
# [@http://www.boost.org/libs/iterator/doc/new-iter-concepts.html New Iterator Concepts],
# [@http://boost.org/libs/iterator/doc/new-iter-concepts.html New Iterator Concepts],
David Abrahams, Jeremy Siek, Thomas Witt, 2004-11-01.
# [@http://www.boost.org/libs/tuple The Boost Tuple Library],
# [@http://boost.org/libs/tuple/doc/tuple_users_guide.html 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/libs/array The Boost Array Library],
# [@http://www.boost.org/doc/html/array.html Boost Array],
Nicolai Josuttis, 2002-2004.
# [@http://www.boost.org/libs/core/ref.html Boost.Core / Ref utility],
# [@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],
Jaakko Jarvi, Peter Dimov, Douglas Gregor, Dave Abrahams, 1999-2002.
# [@http://www.boost.org/libs/hana The Boost Hana Library],
Louis Dionne, 2017.
[endsect]

View File

@ -26,13 +26,7 @@ namespace boost { namespace fusion { namespace detail
BOOST_FUSION_BARRIER_BEGIN
template <int size>
struct as_deque
{
BOOST_STATIC_ASSERT_MSG(
size <= FUSION_MAX_DEQUE_SIZE
, "FUSION_MAX_DEQUE_SIZE limit is too low"
);
};
struct as_deque;
template <>
struct as_deque<0>

View File

@ -25,13 +25,7 @@ namespace boost { namespace fusion { namespace detail
BOOST_FUSION_BARRIER_BEGIN
template <int size, bool is_assoc>
struct as_map
{
BOOST_STATIC_ASSERT_MSG(
size <= FUSION_MAX_MAP_SIZE
, "FUSION_MAX_MAP_SIZE limit is too low"
);
};
struct as_map;
template <bool is_assoc>
struct as_map<0, is_assoc>

View File

@ -67,21 +67,24 @@ namespace boost { namespace fusion
: base_type(std::forward<map>(seq))
{}
template <typename Sequence, typename = typename enable_if<traits::is_sequence<Sequence>>::type>
template <typename Sequence>
BOOST_FUSION_GPU_ENABLED
map(Sequence const& seq)
map(Sequence const& seq
, typename enable_if<traits::is_sequence<Sequence>, detail::enabler_>::type = detail::enabler)
: base_type(begin(seq), detail::map_impl_from_iterator())
{}
template <typename Sequence, typename = typename enable_if<traits::is_sequence<Sequence>>::type>
template <typename Sequence>
BOOST_FUSION_GPU_ENABLED
map(Sequence& seq)
map(Sequence& seq
, typename enable_if<traits::is_sequence<Sequence>, detail::enabler_>::type = detail::enabler)
: base_type(begin(seq), detail::map_impl_from_iterator())
{}
template <typename Sequence, typename = typename enable_if<traits::is_sequence<Sequence>>::type>
template <typename Sequence>
BOOST_FUSION_GPU_ENABLED
map(Sequence&& seq)
map(Sequence&& seq
, typename enable_if<traits::is_sequence<Sequence>, detail::enabler_>::type = detail::enabler)
: base_type(begin(seq), detail::map_impl_from_iterator())
{}

View File

@ -25,13 +25,7 @@ namespace boost { namespace fusion { namespace detail
BOOST_FUSION_BARRIER_BEGIN
template <int size>
struct as_set
{
BOOST_STATIC_ASSERT_MSG(
size <= FUSION_MAX_SET_SIZE
, "FUSION_MAX_SET_SIZE limit is too low"
);
};
struct as_set;
template <>
struct as_set<0>

View File

@ -25,13 +25,7 @@ namespace boost { namespace fusion { namespace detail
BOOST_FUSION_BARRIER_BEGIN
template <int size>
struct as_vector
{
BOOST_STATIC_ASSERT_MSG(
size <= FUSION_MAX_VECTOR_SIZE
, "FUSION_MAX_VECTOR_SIZE limit is too low"
);
};
struct as_vector;
template <>
struct as_vector<0>

View File

@ -247,14 +247,14 @@ namespace boost { namespace fusion
template <typename J>
BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED
auto at_impl(J) -> decltype(at_detail<J::value>(&std::declval<vector_data&>()))
auto at_impl(J) -> decltype(at_detail<J::value>(this))
{
return at_detail<J::value>(this);
}
template <typename J>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
auto at_impl(J) const -> decltype(at_detail<J::value>(&std::declval<vector_data const&>()))
auto at_impl(J) const -> decltype(at_detail<J::value>(this))
{
return at_detail<J::value>(this);
}

View File

@ -8,6 +8,7 @@
#define FUSION_CATEGORY_OF_07202005_0308
#include <boost/fusion/support/config.hpp>
#include <boost/fusion/support/detail/category_of.hpp>
#include <boost/fusion/support/tag_of.hpp>
#include <boost/type_traits/is_base_of.hpp>
@ -43,10 +44,7 @@ namespace boost { namespace fusion
struct category_of_impl
{
template<typename T>
struct apply
{
typedef typename T::category type;
};
struct apply : detail::fusion_category_of<T> {};
};
template <>

View File

@ -15,7 +15,6 @@
#endif
namespace boost { namespace fusion { namespace detail {
#if defined(BOOST_NO_CXX17_FOLD_EXPRESSIONS)
template<typename ...Cond>
struct and_impl : false_type {};
@ -35,10 +34,6 @@ namespace boost { namespace fusion { namespace detail {
recursive. */
template<typename ...Cond>
struct and_ : and_impl1<Cond::value...> {};
#else
template <typename ...Cond>
struct and_ : integral_constant<bool, ((bool)Cond::value && ...)> {};
#endif
}}}
#endif // FUSION_AND_07152016_1625

View File

@ -0,0 +1,19 @@
/*=============================================================================
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 <typename T>
struct fusion_category_of
{
typedef typename T::category type;
};
}}}
#endif

View File

@ -9,17 +9,18 @@
#define FUSION_DETAIL_IS_MPL_SEQUENCE_29122006_1105
#include <boost/fusion/support/config.hpp>
#include <boost/fusion/support/detail/is_native_fusion_sequence.hpp>
#include <boost/fusion/support/sequence_base.hpp>
#include <boost/mpl/is_sequence.hpp>
#include <boost/mpl/and.hpp>
#include <boost/mpl/not.hpp>
#include <boost/type_traits/is_convertible.hpp>
namespace boost { namespace fusion { namespace detail
{
template <typename T>
struct is_mpl_sequence
: mpl::and_<
mpl::not_<is_native_fusion_sequence<T> >
mpl::not_<is_convertible<T, from_sequence_convertible_type> >
, mpl::is_sequence<T> >
{};
}}}

View File

@ -1,27 +0,0 @@
/*=============================================================================
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 <boost/fusion/support/config.hpp>
#include <boost/fusion/support/sequence_base.hpp>
#include <boost/mpl/and.hpp>
#include <boost/type_traits/is_complete.hpp>
#include <boost/type_traits/is_convertible.hpp>
namespace boost { namespace fusion { namespace detail
{
template <typename Sequence>
struct is_native_fusion_sequence
: mpl::and_<
is_complete<Sequence>
, is_convertible<Sequence, detail::from_sequence_convertible_type>
>
{};
}}}
#endif

View File

@ -0,0 +1,19 @@
/*=============================================================================
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 <typename T>
struct fusion_is_view
{
typedef typename T::is_view type;
};
}}}
#endif

View File

@ -0,0 +1,16 @@
/*=============================================================================
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 <int index>
struct unknown_key {};
}}}
#endif

View File

@ -10,10 +10,11 @@
#include <boost/fusion/support/config.hpp>
#include <boost/fusion/support/sequence_base.hpp>
#include <boost/fusion/support/tag_of.hpp>
#include <boost/fusion/support/detail/is_native_fusion_sequence.hpp>
#include <boost/mpl/bool.hpp>
#include <boost/mpl/is_sequence.hpp>
#include <boost/mpl/or.hpp>
#include <boost/mpl/bool.hpp>
#include <boost/type_traits/is_convertible.hpp>
#include <boost/type_traits/is_same.hpp>
namespace boost { namespace fusion
{
@ -66,7 +67,10 @@ namespace boost { namespace fusion
>
{};
using detail::is_native_fusion_sequence;
template <typename Sequence, typename Enable = void>
struct is_native_fusion_sequence
: is_convertible<Sequence, fusion::detail::from_sequence_convertible_type>
{};
}
}}

View File

@ -9,6 +9,7 @@
#include <boost/fusion/support/config.hpp>
#include <boost/mpl/bool.hpp>
#include <boost/fusion/support/detail/is_view.hpp>
#include <boost/fusion/support/tag_of.hpp>
namespace boost { namespace fusion
@ -27,9 +28,8 @@ namespace boost { namespace fusion
{
template <typename T>
struct apply
{
typedef typename T::is_view type;
};
: detail::fusion_is_view<T>
{};
};
template <>

View File

@ -8,16 +8,15 @@
#if !defined(FUSION_PAIR_07222005_1203)
#define FUSION_PAIR_07222005_1203
#include <iosfwd>
#include <utility>
#include <boost/fusion/support/config.hpp>
#include <iosfwd>
#include <boost/fusion/support/detail/access.hpp>
#include <boost/fusion/support/detail/as_fusion_element.hpp>
#include <boost/fusion/support/detail/enabler.hpp>
#include <boost/core/enable_if.hpp>
#include <boost/type_traits/is_same.hpp>
#include <boost/config.hpp>
#include <boost/utility/enable_if.hpp>
#include <boost/type_traits/is_convertible.hpp>
#include <boost/type_traits/remove_cv_ref.hpp>
#include <boost/type_traits/is_lvalue_reference.hpp>
#if defined (BOOST_MSVC)
# pragma warning(push)
@ -34,46 +33,54 @@ namespace boost { namespace fusion
pair()
: second() {}
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
pair(pair const& rhs)
: second(rhs.second) {}
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED
pair(pair&& rhs)
: second(BOOST_FUSION_FWD_ELEM(Second, rhs.second)) {}
#endif
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
pair(typename detail::call_param<Second>::type val)
: second(val) {}
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
template <typename Second2>
BOOST_FUSION_GPU_ENABLED
pair(typename remove_cv_ref<Second>::type&& val)
: second(BOOST_FUSION_FWD_ELEM(Second, val)) {}
pair(Second2&& val
, typename boost::disable_if<is_lvalue_reference<Second2> >::type* /* dummy */ = 0
, typename boost::enable_if<is_convertible<Second2, Second> >::type* /*dummy*/ = 0
) : second(BOOST_FUSION_FWD_ELEM(Second, val)) {}
#endif
template <typename Second2>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
pair(pair<First, Second2> const& rhs,
typename disable_if<is_same<Second, Second2>, detail::enabler_>::type = detail::enabler,
typename enable_if<is_convertible<Second2, Second>, detail::enabler_>::type = detail::enabler)
pair(pair<First, Second2> const& rhs)
: second(rhs.second) {}
template <typename Second2>
BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED
typename disable_if<is_same<Second, Second2>, pair&>::type
operator=(pair<First, Second2> const& rhs)
pair& operator=(pair<First, Second2> const& rhs)
{
second = rhs.second;
return *this;
}
BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED
pair& operator=(pair const& rhs)
{
second = rhs.second;
return *this;
}
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
template <typename Second2>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
pair(pair<First, Second2>&& rhs,
typename disable_if<is_same<Second, Second2>, detail::enabler_>::type = detail::enabler,
typename enable_if<is_convertible<Second2, Second>, detail::enabler_>::type = detail::enabler)
: second(std::move(rhs.second)) {}
template <typename Second2>
BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED
typename disable_if<is_same<Second, Second2>, pair&>::type
operator=(pair<First, Second2>&& rhs)
pair& operator=(pair&& rhs)
{
second = std::move(rhs.second);
second = BOOST_FUSION_FWD_ELEM(Second, rhs.second);
return *this;
}
#endif

View File

@ -1,7 +1,7 @@
##==============================================================================
# Copyright (c) 2003-2006 Joel de Guzman
# Copyright (c) 2013 Mateusz Loskot
# Copyright (c) 2014-2018 Kohei Takahashi
# Copyright (c) 2014-2017 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
@ -9,17 +9,10 @@
#==============================================================================
# bring in rules for testing
import testing ;
import os ;
import ../../config/checks/config : requires ;
if [ os.environ CI ]
{
CI_DEFINES = <define>CI_SKIP_KNOWN_FAILURE=1 ;
}
project
: requirements
$(CI_DEFINES)
;
{
@ -42,8 +35,7 @@ project
[ run algorithm/insert.cpp ]
[ run algorithm/insert_range.cpp ]
[ run algorithm/iter_fold.cpp ]
[ run algorithm/move.cpp : :
: [ requires cxx11_rvalue_references ] ]
[ run algorithm/move.cpp ]
[ run algorithm/none.cpp ]
[ run algorithm/pop_back.cpp ]
[ run algorithm/pop_front.cpp ]
@ -107,8 +99,7 @@ project
[ compile sequence/deque_is_constructible.cpp ]
[ run sequence/deque_make.cpp ]
[ run sequence/deque_misc.cpp ]
[ run sequence/deque_move.cpp : :
: [ requires cxx11_rvalue_references ] ]
[ run sequence/deque_move.cpp ]
[ run sequence/deque_mutate.cpp ]
[ run sequence/deque_nest.cpp ]
[ run sequence/deque_tie.cpp ]
@ -122,8 +113,7 @@ project
[ run sequence/map_construction.cpp ]
[ run sequence/map_copy.cpp ]
[ run sequence/map_misc.cpp ]
[ run sequence/map_move.cpp : :
: [ requires cxx11_rvalue_references ] ]
[ run sequence/map_move.cpp ]
[ run sequence/map_mutate.cpp ]
[ run sequence/map_tie.cpp ]
[ run sequence/nil.cpp ]
@ -162,8 +152,7 @@ project
[ run sequence/vector_iterator.cpp ]
[ run sequence/vector_make.cpp ]
[ run sequence/vector_misc.cpp ]
[ run sequence/vector_move.cpp : :
: [ requires cxx11_rvalue_references ] ]
[ run sequence/vector_move.cpp ]
[ run sequence/vector_mutate.cpp ]
[ run sequence/vector_n.cpp ]
[ run sequence/vector_nest.cpp ]
@ -208,28 +197,22 @@ project
[ run sequence/adt_attribute_proxy.cpp ]
[ run sequence/define_struct.cpp ]
[ run sequence/define_struct_empty.cpp ]
[ run sequence/define_struct_move.cpp : :
: [ requires cxx11_rvalue_references ] ]
[ run sequence/define_struct_move.cpp ]
[ run sequence/define_struct_inline.cpp ]
[ run sequence/define_struct_inline_empty.cpp ]
[ run sequence/define_struct_inline_move.cpp : :
: [ requires cxx11_rvalue_references ] ]
[ run sequence/define_struct_inline_move.cpp ]
[ run sequence/define_assoc_struct.cpp ]
[ run sequence/define_assoc_struct_empty.cpp ]
[ run sequence/define_assoc_struct_move.cpp : :
: [ requires cxx11_rvalue_references ] ]
[ run sequence/define_assoc_struct_move.cpp ]
[ run sequence/define_tpl_struct.cpp ]
[ run sequence/define_tpl_struct_empty.cpp ]
[ run sequence/define_tpl_struct_move.cpp : :
: [ requires cxx11_rvalue_references ] ]
[ run sequence/define_tpl_struct_move.cpp ]
[ run sequence/define_tpl_struct_inline.cpp ]
[ run sequence/define_tpl_struct_inline_empty.cpp ]
[ run sequence/define_tpl_struct_inline_move.cpp : :
: [ requires cxx11_rvalue_references ] ]
[ run sequence/define_tpl_struct_inline_move.cpp ]
[ run sequence/define_assoc_tpl_struct.cpp ]
[ run sequence/define_assoc_tpl_struct_empty.cpp ]
[ run sequence/define_assoc_tpl_struct_move.cpp : :
: [ requires cxx11_rvalue_references ] ]
[ run sequence/define_assoc_tpl_struct_move.cpp ]
[ run sequence/std_tuple.cpp : :
: [ requires cxx11_variadic_templates cxx11_hdr_tuple ] ]
[ run sequence/std_tuple_iterator.cpp : :
@ -254,21 +237,14 @@ project
[ run functional/invoke_procedure.cpp ]
[ run sequence/swap.cpp ]
[ compile support/is_sequence.cpp ]
[ compile support/pair_conversion.cpp ]
[ compile support/pair_deque.cpp ]
[ compile support/pair_list.cpp ]
[ compile support/pair_map.cpp ]
[ compile support/pair_set.cpp ]
[ compile support/pair_vector.cpp ]
[ compile support/pair_nest.cpp ]
[ compile support/index_sequence.cpp
: [ requires cxx11_variadic_templates ] ]
[ compile support/and.cpp
: [ requires cxx11_variadic_templates ] ]
[ compile support/tag_of.cpp ]
[ compile support/pair_trivially_copyable.cpp
: [ requires cxx11_hdr_type_traits ] ]
[ compile support/index_sequence.cpp ]
[ compile support/and.cpp ]
# [ compile-fail xxx.cpp ]

View File

@ -1,9 +1,13 @@
/*=============================================================================
Copyright (c) 2014,2018 Kohei Takahashi
Copyright (c) 2014 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 <boost/config.hpp>
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
#include <boost/core/lightweight_test.hpp>
#include <boost/fusion/container/vector/vector.hpp>
#include <boost/fusion/container/list/list.hpp>
@ -25,3 +29,12 @@ int main()
return boost::report_errors();
}
#else
int main()
{
// no thing to do
}
#endif

View File

@ -1,9 +1,13 @@
/*=============================================================================
Copyright (c) 2016,2018 Kohei Takahashi
Copyright (c) 2016 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 <boost/config.hpp>
#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
#include <boost/detail/lightweight_test.hpp>
#include <boost/fusion/adapted/struct/define_assoc_struct.hpp>
#include <utility>
@ -65,3 +69,10 @@ int main()
return boost::report_errors();
}
#else
int main()
{
}
#endif

View File

@ -1,9 +1,13 @@
/*=============================================================================
Copyright (c) 2016-2018 Kohei Takahashi
Copyright (c) 2016 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 <boost/config.hpp>
#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
#include <boost/detail/lightweight_test.hpp>
#include <boost/fusion/adapted/struct/define_struct_inline.hpp>
#include <utility>
@ -48,7 +52,7 @@ int main()
}
// Older MSVCs don't generate move ctor by default.
#if !(defined(CI_SKIP_KNOWN_FAILURE) && BOOST_WORKAROUND(BOOST_MSVC, < 1900))
#if !(defined(RUNNING_ON_APPVEYOR) && BOOST_WORKAROUND(BOOST_MSVC, < 1900))
{
ns::value x;
ns::value y(std::move(x)); // move
@ -66,8 +70,15 @@ int main()
BOOST_TEST(x.w.value == 0);
BOOST_TEST(y.w.value == 0);
}
#endif // !(ci && msvc < 14.0)
#endif // !(appveyor && msvc < 14.0)
return boost::report_errors();
}
#else
int main()
{
}
#endif

View File

@ -1,9 +1,13 @@
/*=============================================================================
Copyright (c) 2016,2018 Kohei Takahashi
Copyright (c) 2016 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 <boost/config.hpp>
#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
#include <boost/detail/lightweight_test.hpp>
#include <boost/fusion/adapted/struct/define_struct.hpp>
#include <utility>
@ -64,3 +68,10 @@ int main()
return boost::report_errors();
}
#else
int main()
{
}
#endif

View File

@ -1,9 +1,13 @@
/*=============================================================================
Copyright (c) 2016-2018 Kohei Takahashi
Copyright (c) 2016 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 <boost/config.hpp>
#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
#include <boost/detail/lightweight_test.hpp>
#include <boost/fusion/adapted/struct/define_struct_inline.hpp>
#include <utility>
@ -48,7 +52,7 @@ int main()
}
// Older MSVCs don't generate move ctor by default.
#if !(defined(CI_SKIP_KNOWN_FAILURE) && BOOST_WORKAROUND(BOOST_MSVC, < 1900))
#if !(defined(RUNNING_ON_APPVEYOR) && BOOST_WORKAROUND(BOOST_MSVC, < 1900))
{
ns::value<wrapper> x;
ns::value<wrapper> y(std::move(x)); // move
@ -66,8 +70,15 @@ int main()
BOOST_TEST(x.w.value == 0);
BOOST_TEST(y.w.value == 0);
}
#endif // !(ci && msvc < 14.0)
#endif // !(appveyor && msvc < 14.0)
return boost::report_errors();
}
#else
int main()
{
}
#endif

View File

@ -1,9 +1,13 @@
/*=============================================================================
Copyright (c) 2016,2018 Kohei Takahashi
Copyright (c) 2016 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 <boost/config.hpp>
#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
#include <boost/detail/lightweight_test.hpp>
#include <boost/fusion/adapted/struct/define_struct.hpp>
#include <utility>
@ -64,3 +68,10 @@ int main()
return boost::report_errors();
}
#else
int main()
{
}
#endif

View File

@ -1,11 +1,16 @@
/*=============================================================================
Copyright (c) 2012 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)
==============================================================================*/
#define BOOST_FUSION_DONT_USE_PREPROCESSED_FILES
#define BOOST_FUSION_DONT_USE_PREPROCESSED_FILES // $$$ JDG temp $$$
#include <boost/config.hpp>
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
#include <boost/fusion/container/deque/deque.hpp>
#define FUSION_SEQUENCE boost::fusion::deque<std::vector<x>>
@ -13,9 +18,16 @@
#include "move.hpp"
int main()
#else
#include <boost/detail/lightweight_test.hpp>
#endif
int
main()
{
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
test();
#endif
return boost::report_errors();
}

View File

@ -1,11 +1,15 @@
/*=============================================================================
Copyright (c) 2012 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)
==============================================================================*/
#define BOOST_FUSION_DONT_USE_PREPROCESSED_FILES
#define BOOST_FUSION_DONT_USE_PREPROCESSED_FILES // $$$ JDG temp $$$
#include <boost/config.hpp>
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
#include <boost/fusion/container/map/map.hpp>
struct k1 {};
@ -19,9 +23,16 @@ struct k2 {};
#include "move.hpp"
int main()
#else
#include <boost/detail/lightweight_test.hpp>
#endif
int
main()
{
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
test();
#endif
return boost::report_errors();
}

View File

@ -1,11 +1,15 @@
/*=============================================================================
Copyright (c) 2012 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)
==============================================================================*/
#define BOOST_FUSION_DONT_USE_PREPROCESSED_FILES
#define BOOST_FUSION_DONT_USE_PREPROCESSED_FILES // $$$ JDG temp $$$
#include <boost/config.hpp>
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
#include <boost/fusion/container/vector/vector.hpp>
#define FUSION_SEQUENCE boost::fusion::vector<std::vector<x>>
@ -13,9 +17,16 @@
#include "move.hpp"
int main()
#else
#include <boost/detail/lightweight_test.hpp>
#endif
int
main()
{
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
test();
#endif
return boost::report_errors();
}

View File

@ -1,28 +1,33 @@
/*=============================================================================
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)
==============================================================================*/
#include <boost/config.hpp>
#ifdef BOOST_NO_CXX11_VARIADIC_TEMPLATES
# error "does not meet requirements"
#endif
#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
#include <boost/detail/lightweight_test.hpp>
#include <boost/fusion/support/detail/and.hpp>
#include <boost/mpl/bool.hpp>
#include <boost/mpl/assert.hpp>
#include <boost/type_traits/integral_constant.hpp>
using namespace boost;
using namespace boost::fusion::detail;
int main() {
using namespace boost;
using namespace boost::fusion::detail;
BOOST_TEST((and_<>::value));
BOOST_TEST(!(and_<false_type>::value));
BOOST_TEST((and_<true_type>::value));
BOOST_TEST(!(and_<true_type, false_type>::value));
BOOST_TEST((and_<true_type, true_type>::value));
BOOST_TEST(!(and_<true_type, true_type, false_type>::value));
BOOST_TEST((and_<true_type, true_type, true_type>::value));
BOOST_TEST((and_<true_type, mpl::true_>::value));
return boost::report_errors();
}
#endif
BOOST_MPL_ASSERT((and_<>));
BOOST_MPL_ASSERT_NOT((and_<false_type>));
BOOST_MPL_ASSERT((and_<true_type>));
BOOST_MPL_ASSERT_NOT((and_<true_type, false_type>));
BOOST_MPL_ASSERT((and_<true_type, true_type>));
BOOST_MPL_ASSERT_NOT((and_<true_type, true_type, false_type>));
BOOST_MPL_ASSERT((and_<true_type, true_type, true_type>));
BOOST_MPL_ASSERT((and_<true_type, mpl::true_>));

View File

@ -1,14 +1,12 @@
/*=============================================================================
Copyright (c) 2015,2018 Kohei Takahashi
Copyright (c) 2015 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 <boost/config.hpp>
#ifdef BOOST_NO_CXX11_VARIADIC_TEMPLATES
# error "does not meet requirements"
#endif
#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
#include <boost/fusion/support/detail/index_sequence.hpp>
#include <boost/mpl/assert.hpp>
@ -30,3 +28,5 @@ BOOST_MPL_ASSERT((boost::is_same<detail::make_index_sequence<15>::type, detail::
BOOST_MPL_ASSERT((boost::is_same<detail::make_index_sequence<16>::type, detail::index_sequence<0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15> >));
BOOST_MPL_ASSERT((boost::is_same<detail::make_index_sequence<17>::type, detail::index_sequence<0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16> >));
#endif

View File

@ -1,17 +0,0 @@
/*=============================================================================
Copyright (c) 2018 Louis Dionne
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 <boost/fusion/support/is_sequence.hpp>
#include <boost/static_assert.hpp>
// Make sure fusion::is_sequence and fusion::is_native_fusion_sequence can be
// used with an incomplete type.
struct incomplete;
BOOST_STATIC_ASSERT(!boost::fusion::traits::is_sequence<incomplete>::value);
BOOST_STATIC_ASSERT(!boost::fusion::traits::is_native_fusion_sequence<incomplete>::value);
int main() { }

View File

@ -1,42 +0,0 @@
/*=============================================================================
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 <utility>
#include <boost/config.hpp>
#include <boost/fusion/support/pair.hpp>
using namespace boost::fusion;
struct eat_int
{
eat_int(int);
};
struct eat_pair
{
template <typename K, typename V>
eat_pair(pair<K, V>);
};
int main()
{
pair<void, int> p;
pair<void, eat_int> ci(p);
#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
pair<void, eat_int> mi(std::move(p));
#endif
// eat_pair can't be converted from int, but can be pair.
// So pair(eat_pair) should be called rather than pair(pair<void, eat_pair>).
pair<void, eat_pair> cp(p);
#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
pair<void, eat_pair> mp(std::move(p));
#endif
}

View File

@ -1,5 +1,5 @@
/*=============================================================================
Copyright (c) 2015,2018 Kohei Takahashi
Copyright (c) 2015 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,20 +10,15 @@
using namespace boost::fusion;
template <typename C>
void copy(C value)
void copy()
{
pair<int, C> src(value);
pair<int, C> src;
pair<int, C> dest = src;
boost::ignore_unused(dest);
}
int main()
{
copy<pair<void, float> >(42.195f);
copy<pair<int, float> >(42.195f);
float f;
pair<void, float&> r(f);
copy<pair<void, float&> >(r);
copy<pair<void, float> >();
}

View File

@ -1,50 +0,0 @@
/*=============================================================================
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 <type_traits>
#include <boost/fusion/support/pair.hpp>
#include <boost/mpl/assert.hpp>
using namespace boost::fusion;
struct non_trivially_copyable
{
non_trivially_copyable(const non_trivially_copyable&);
non_trivially_copyable operator=(const non_trivially_copyable&);
};
struct pod { };
BOOST_MPL_ASSERT_NOT((std::is_trivially_copyable<void>));
BOOST_MPL_ASSERT((std::is_trivially_copyable<int>));
BOOST_MPL_ASSERT_NOT((std::is_trivially_copyable<non_trivially_copyable>));
BOOST_MPL_ASSERT((std::is_trivially_copyable<pod>));
BOOST_MPL_ASSERT_NOT((std::is_trivially_copyable<int&>));
BOOST_MPL_ASSERT((std::is_trivially_copyable<void*>));
BOOST_MPL_ASSERT((std::is_trivially_copyable<pair<void, int> >));
BOOST_MPL_ASSERT((std::is_trivially_copyable<pair<int, int> >));
BOOST_MPL_ASSERT((std::is_trivially_copyable<pair<non_trivially_copyable, int> >));
BOOST_MPL_ASSERT_NOT((std::is_trivially_copyable<pair<int, non_trivially_copyable> >));
BOOST_MPL_ASSERT((std::is_trivially_copyable<pair<pod, int> >));
BOOST_MPL_ASSERT((std::is_trivially_copyable<pair<int, pod> >));
BOOST_MPL_ASSERT((std::is_trivially_copyable<pair<void, int&> >));
BOOST_MPL_ASSERT((std::is_trivially_copyable<pair<int, int&> >));
BOOST_MPL_ASSERT((std::is_trivially_copyable<pair<non_trivially_copyable, int&> >));
BOOST_MPL_ASSERT((std::is_trivially_copyable<pair<int, non_trivially_copyable&> >));
BOOST_MPL_ASSERT((std::is_trivially_copyable<pair<int, pod&> >));
BOOST_MPL_ASSERT((std::is_trivially_copyable<pair<int, pod&> >));
BOOST_MPL_ASSERT((std::is_trivially_copyable<pair<void, int*> >));
BOOST_MPL_ASSERT((std::is_trivially_copyable<pair<int, int*> >));
BOOST_MPL_ASSERT((std::is_trivially_copyable<pair<non_trivially_copyable, int*> >));
BOOST_MPL_ASSERT((std::is_trivially_copyable<pair<int, non_trivially_copyable*> >));
BOOST_MPL_ASSERT((std::is_trivially_copyable<pair<int, pod*> >));
BOOST_MPL_ASSERT((std::is_trivially_copyable<pair<int, pod*> >));

View File

@ -1,17 +0,0 @@
/*=============================================================================
Copyright (c) 2018 Louis Dionne
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 <boost/fusion/support/tag_of.hpp>
#include <boost/static_assert.hpp>
#include <boost/type_traits/is_same.hpp>
// Make sure tag_of can be used with an incomplete type.
struct incomplete;
typedef boost::fusion::traits::tag_of<incomplete>::type Tag;
BOOST_STATIC_ASSERT((boost::is_same<Tag, boost::fusion::non_fusion_tag>::value));
int main() { }