From 82f677c169568df1ff767ce51dfded1df804bcc3 Mon Sep 17 00:00:00 2001 From: Louis Dionne Date: Wed, 28 Feb 2018 20:03:07 -0800 Subject: [PATCH] Allow incomplete types in fusion::tag_of and fusion::is_native_fusion_sequence --- .../fusion/support/detail/is_mpl_sequence.hpp | 3 ++- include/boost/fusion/support/is_sequence.hpp | 9 +++++++-- test/Jamfile | 2 ++ test/support/is_sequence.cpp | 17 +++++++++++++++++ test/support/tag_of.cpp | 17 +++++++++++++++++ 5 files changed, 45 insertions(+), 3 deletions(-) create mode 100644 test/support/is_sequence.cpp create mode 100644 test/support/tag_of.cpp diff --git a/include/boost/fusion/support/detail/is_mpl_sequence.hpp b/include/boost/fusion/support/detail/is_mpl_sequence.hpp index 1c485f91..24b86624 100644 --- a/include/boost/fusion/support/detail/is_mpl_sequence.hpp +++ b/include/boost/fusion/support/detail/is_mpl_sequence.hpp @@ -13,6 +13,7 @@ #include #include #include +#include #include namespace boost { namespace fusion { namespace detail @@ -20,7 +21,7 @@ namespace boost { namespace fusion { namespace detail template struct is_mpl_sequence : mpl::and_< - mpl::not_ > + mpl::not_, is_convertible > > , mpl::is_sequence > {}; }}} diff --git a/include/boost/fusion/support/is_sequence.hpp b/include/boost/fusion/support/is_sequence.hpp index 6b9b2118..af7c84e1 100644 --- a/include/boost/fusion/support/is_sequence.hpp +++ b/include/boost/fusion/support/is_sequence.hpp @@ -10,9 +10,11 @@ #include #include #include +#include +#include #include #include -#include +#include #include #include @@ -69,7 +71,10 @@ namespace boost { namespace fusion template struct is_native_fusion_sequence - : is_convertible + : mpl::and_< + is_complete, + is_convertible + > {}; } }} diff --git a/test/Jamfile b/test/Jamfile index 82d715bb..a61239d0 100644 --- a/test/Jamfile +++ b/test/Jamfile @@ -254,6 +254,7 @@ project [ run functional/invoke_procedure.cpp ] [ run sequence/swap.cpp ] + [ compile support/is_sequence.cpp ] [ compile support/pair_deque.cpp ] [ compile support/pair_list.cpp ] [ compile support/pair_map.cpp ] @@ -264,6 +265,7 @@ project : [ requires cxx11_variadic_templates ] ] [ compile support/and.cpp : [ requires cxx11_variadic_templates ] ] + [ compile support/tag_of.cpp ] # [ compile-fail xxx.cpp ] diff --git a/test/support/is_sequence.cpp b/test/support/is_sequence.cpp new file mode 100644 index 00000000..428f6354 --- /dev/null +++ b/test/support/is_sequence.cpp @@ -0,0 +1,17 @@ +/*============================================================================= + 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 +#include + + +// 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::value); +BOOST_STATIC_ASSERT(!boost::fusion::traits::is_native_fusion_sequence::value); + +int main() { } diff --git a/test/support/tag_of.cpp b/test/support/tag_of.cpp new file mode 100644 index 00000000..ee2da10d --- /dev/null +++ b/test/support/tag_of.cpp @@ -0,0 +1,17 @@ +/*============================================================================= + 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 +#include +#include + + +// Make sure tag_of can be used with an incomplete type. +struct incomplete; +typedef boost::fusion::traits::tag_of::type Tag; +BOOST_STATIC_ASSERT((boost::is_same::value)); + +int main() { }