Fix issue 11267.

Compiler yields compile error within a function witch used in unevaluate
context of constexpr function because of CWG 1581 [2].

1. https://llvm.org/bugs/show_bug.cgi?id=23135
2. http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1581
This commit is contained in:
Kohei Takahashi
2015-06-08 11:53:17 +09:00
parent 22268eb083
commit e0f10734b1
13 changed files with 155 additions and 22 deletions

View File

@ -94,13 +94,13 @@ namespace boost { namespace fusion {
{} {}
template<BOOST_PP_ENUM_PARAMS(FUSION_MAX_DEQUE_SIZE, typename U)> template<BOOST_PP_ENUM_PARAMS(FUSION_MAX_DEQUE_SIZE, typename U)>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED BOOST_FUSION_GPU_ENABLED
deque(deque<BOOST_PP_ENUM_PARAMS(FUSION_MAX_DEQUE_SIZE, U)> const& seq) deque(deque<BOOST_PP_ENUM_PARAMS(FUSION_MAX_DEQUE_SIZE, U)> const& seq)
: base(seq) : base(seq)
{} {}
template<typename Sequence> template<typename Sequence>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED BOOST_FUSION_GPU_ENABLED
deque(Sequence const& seq, typename disable_if<is_convertible<Sequence, T0> >::type* /*dummy*/ = 0) deque(Sequence const& seq, typename disable_if<is_convertible<Sequence, T0> >::type* /*dummy*/ = 0)
: base(base::from_iterator(fusion::begin(seq))) : base(base::from_iterator(fusion::begin(seq)))
{} {}
@ -129,7 +129,7 @@ FUSION_HASH if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) || \ #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) || \
(defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES)) (defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES))
template <typename T0_> template <typename T0_>
BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED BOOST_FUSION_GPU_ENABLED
explicit deque(T0_&& t0 explicit deque(T0_&& t0
, typename enable_if<is_convertible<T0_, T0> >::type* /*dummy*/ = 0 , typename enable_if<is_convertible<T0_, T0> >::type* /*dummy*/ = 0
) )
@ -140,7 +140,7 @@ FUSION_HASH if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
: base(std::forward<deque>(rhs)) : base(std::forward<deque>(rhs))
{} {}
template<BOOST_PP_ENUM_PARAMS(FUSION_MAX_DEQUE_SIZE, typename U)> template<BOOST_PP_ENUM_PARAMS(FUSION_MAX_DEQUE_SIZE, typename U)>
BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED BOOST_FUSION_GPU_ENABLED
deque(deque<BOOST_PP_ENUM_PARAMS(FUSION_MAX_DEQUE_SIZE, U)>&& seq deque(deque<BOOST_PP_ENUM_PARAMS(FUSION_MAX_DEQUE_SIZE, U)>&& seq
, typename disable_if< , typename disable_if<
is_convertible<deque<BOOST_PP_ENUM_PARAMS(FUSION_MAX_DEQUE_SIZE, U)>, T0> is_convertible<deque<BOOST_PP_ENUM_PARAMS(FUSION_MAX_DEQUE_SIZE, U)>, T0>

View File

@ -73,7 +73,7 @@ namespace boost { namespace fusion
: car(rhs.car), cdr(rhs.cdr) {} : car(rhs.car), cdr(rhs.cdr) {}
template <typename Sequence> template <typename Sequence>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED BOOST_FUSION_GPU_ENABLED
cons( cons(
Sequence const& seq Sequence const& seq
, typename boost::enable_if< , typename boost::enable_if<

View File

@ -60,7 +60,7 @@ namespace boost { namespace fusion
: inherited_type(rhs) {} : inherited_type(rhs) {}
template <typename Sequence> template <typename Sequence>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED BOOST_FUSION_GPU_ENABLED
list(Sequence const& rhs list(Sequence const& rhs
, typename boost::enable_if<traits::is_sequence<Sequence> >::type* = 0) , typename boost::enable_if<traits::is_sequence<Sequence> >::type* = 0)
: inherited_type(rhs) {} : inherited_type(rhs) {}

View File

@ -85,7 +85,7 @@ namespace boost { namespace fusion
: data(rhs.data) {} : data(rhs.data) {}
template <typename Sequence> template <typename Sequence>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED BOOST_FUSION_GPU_ENABLED
map(Sequence const& rhs) map(Sequence const& rhs)
: data(rhs) {} : data(rhs) {}

View File

@ -66,21 +66,21 @@ namespace boost { namespace fusion
{} {}
template <typename Sequence> template <typename Sequence>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED BOOST_FUSION_GPU_ENABLED
map(Sequence const& seq map(Sequence const& seq
, typename enable_if<traits::is_sequence<Sequence>>::type* /*dummy*/ = 0) , typename enable_if<traits::is_sequence<Sequence>>::type* /*dummy*/ = 0)
: base_type(begin(seq), detail::map_impl_from_iterator()) : base_type(begin(seq), detail::map_impl_from_iterator())
{} {}
template <typename Sequence> template <typename Sequence>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED BOOST_FUSION_GPU_ENABLED
map(Sequence& seq map(Sequence& seq
, typename enable_if<traits::is_sequence<Sequence>>::type* /*dummy*/ = 0) , typename enable_if<traits::is_sequence<Sequence>>::type* /*dummy*/ = 0)
: base_type(begin(seq), detail::map_impl_from_iterator()) : base_type(begin(seq), detail::map_impl_from_iterator())
{} {}
template <typename Sequence> template <typename Sequence>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED BOOST_FUSION_GPU_ENABLED
map(Sequence&& seq map(Sequence&& seq
, typename enable_if<traits::is_sequence<Sequence>>::type* /*dummy*/ = 0) , typename enable_if<traits::is_sequence<Sequence>>::type* /*dummy*/ = 0)
: base_type(begin(seq), detail::map_impl_from_iterator()) : base_type(begin(seq), detail::map_impl_from_iterator())
@ -93,7 +93,7 @@ namespace boost { namespace fusion
{} {}
template <typename First, typename ...T_> template <typename First, typename ...T_>
BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED BOOST_FUSION_GPU_ENABLED
map(First&& first, T_&&... rest) map(First&& first, T_&&... rest)
: base_type(BOOST_FUSION_FWD_ELEM(First, first), BOOST_FUSION_FWD_ELEM(T_, rest)...) : base_type(BOOST_FUSION_FWD_ELEM(First, first), BOOST_FUSION_FWD_ELEM(T_, rest)...)
{} {}

View File

@ -116,16 +116,6 @@ namespace boost { namespace fusion
: vec(rhs.vec) {} : vec(rhs.vec) {}
template <typename Sequence> template <typename Sequence>
// XXX:
#if defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES)
FUSION_HASH if !defined(BOOST_CLANG)
BOOST_CONSTEXPR
FUSION_HASH endif
#else
#if !defined(BOOST_CLANG)
BOOST_CONSTEXPR
#endif
#endif
BOOST_FUSION_GPU_ENABLED BOOST_FUSION_GPU_ENABLED
vector(Sequence const& rhs, vector(Sequence const& rhs,
typename boost::enable_if<traits::is_sequence<Sequence> >::type* = 0) typename boost::enable_if<traits::is_sequence<Sequence> >::type* = 0)

View File

@ -49,7 +49,7 @@ namespace boost { namespace fusion
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
template <typename Second2> template <typename Second2>
BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED BOOST_FUSION_GPU_ENABLED
pair(Second2&& val pair(Second2&& val
, typename boost::disable_if<is_lvalue_reference<Second2> >::type* /* dummy */ = 0 , typename boost::disable_if<is_lvalue_reference<Second2> >::type* /* dummy */ = 0
, typename boost::enable_if<is_convertible<Second2, Second> >::type* /*dummy*/ = 0 , typename boost::enable_if<is_convertible<Second2, Second> >::type* /*dummy*/ = 0

View File

@ -78,6 +78,7 @@ project
[ run sequence/list_make.cpp : : : : ] [ run sequence/list_make.cpp : : : : ]
[ run sequence/list_misc.cpp : : : : ] [ run sequence/list_misc.cpp : : : : ]
[ run sequence/list_mutate.cpp : : : : ] [ run sequence/list_mutate.cpp : : : : ]
[ run sequence/list_nest.cpp : : : : ]
[ run sequence/list_tie.cpp : : : : ] [ run sequence/list_tie.cpp : : : : ]
[ run sequence/list_value_at.cpp : : : : ] [ run sequence/list_value_at.cpp : : : : ]
[ run sequence/deque_comparison.cpp : : : : ] [ run sequence/deque_comparison.cpp : : : : ]
@ -89,6 +90,7 @@ project
[ run sequence/deque_misc.cpp : : : : ] [ run sequence/deque_misc.cpp : : : : ]
[ run sequence/deque_move.cpp : : : : ] [ run sequence/deque_move.cpp : : : : ]
[ run sequence/deque_mutate.cpp : : : : ] [ run sequence/deque_mutate.cpp : : : : ]
[ run sequence/deque_nest.cpp : : : : ]
[ run sequence/deque_tie.cpp : : : : ] [ run sequence/deque_tie.cpp : : : : ]
[ run sequence/deque_value_at.cpp : : : : ] [ run sequence/deque_value_at.cpp : : : : ]
[ run sequence/front_extended_deque.cpp : : : : ] [ run sequence/front_extended_deque.cpp : : : : ]
@ -131,6 +133,7 @@ project
[ run sequence/vector_move.cpp : : : : ] [ run sequence/vector_move.cpp : : : : ]
[ run sequence/vector_mutate.cpp : : : : ] [ run sequence/vector_mutate.cpp : : : : ]
[ run sequence/vector_n.cpp : : : : ] [ run sequence/vector_n.cpp : : : : ]
[ run sequence/vector_nest.cpp : : : : ]
[ run sequence/vector_hash.cpp : : : : ] [ run sequence/vector_hash.cpp : : : : ]
[ run sequence/vector_tie.cpp : : : : ] [ run sequence/vector_tie.cpp : : : : ]
[ run sequence/vector_value_at.cpp : : : : ] [ run sequence/vector_value_at.cpp : : : : ]
@ -184,6 +187,7 @@ project
[ compile support/pair_map.cpp : : : : ] [ compile support/pair_map.cpp : : : : ]
[ compile support/pair_set.cpp : : : : ] [ compile support/pair_set.cpp : : : : ]
[ compile support/pair_vector.cpp : : : : ] [ compile support/pair_vector.cpp : : : : ]
[ compile support/pair_nest.cpp : : : : ]
# [ compile-fail xxx.cpp : : : : ] # [ compile-fail xxx.cpp : : : : ]

View File

@ -0,0 +1,19 @@
/*=============================================================================
Copyright (C) 2015 Kohei Takahshi
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/container/deque/deque.hpp>
#include <boost/core/lightweight_test.hpp>
#define FUSION_SEQUENCE deque
#include "nest.hpp"
int
main()
{
test();
return boost::report_errors();
}

View File

@ -0,0 +1,19 @@
/*=============================================================================
Copyright (C) 2015 Kohei Takahshi
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/container/list/list.hpp>
#include <boost/core/lightweight_test.hpp>
#define FUSION_SEQUENCE list
#include "nest.hpp"
int
main()
{
test();
return boost::report_errors();
}

58
test/sequence/nest.hpp Normal file
View File

@ -0,0 +1,58 @@
/*=============================================================================
Copyright (C) 2015 Kohei Takahshi
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>
template <typename C>
void test_copy()
{
C src;
C dst = src;
(void)dst;
}
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
template <typename C>
void test_move()
{
C src;
C dst = std::move(src);
(void)dst;
}
#endif
template <typename C>
void test_all()
{
test_copy<C>();
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
test_move<C>();
#endif
}
void
test()
{
using namespace boost::fusion;
test_all<FUSION_SEQUENCE<FUSION_SEQUENCE<> > >();
test_all<FUSION_SEQUENCE<FUSION_SEQUENCE<>, int> >();
test_all<FUSION_SEQUENCE<int, FUSION_SEQUENCE<> > >();
test_all<FUSION_SEQUENCE<int, FUSION_SEQUENCE<>, float> >();
test_all<FUSION_SEQUENCE<FUSION_SEQUENCE<int> > >();
test_all<FUSION_SEQUENCE<FUSION_SEQUENCE<int>, int> >();
test_all<FUSION_SEQUENCE<int, FUSION_SEQUENCE<int> > >();
test_all<FUSION_SEQUENCE<int, FUSION_SEQUENCE<int>, float> >();
test_all<FUSION_SEQUENCE<FUSION_SEQUENCE<int, float> > >();
test_all<FUSION_SEQUENCE<FUSION_SEQUENCE<int, float>, int> >();
test_all<FUSION_SEQUENCE<int, FUSION_SEQUENCE<int, float> > >();
test_all<FUSION_SEQUENCE<int, FUSION_SEQUENCE<int, float>, float> >();
}

View File

@ -0,0 +1,19 @@
/*=============================================================================
Copyright (C) 2015 Kohei Takahshi
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/container/vector/vector.hpp>
#include <boost/core/lightweight_test.hpp>
#define FUSION_SEQUENCE vector
#include "nest.hpp"
int
main()
{
test();
return boost::report_errors();
}

View File

@ -0,0 +1,24 @@
/*=============================================================================
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/core/ignore_unused.hpp>
#include <boost/fusion/support/pair.hpp>
using namespace boost::fusion;
template <typename C>
void copy()
{
pair<int, C> src;
pair<int, C> dest = src;
boost::ignore_unused(dest);
}
int main()
{
copy<pair<void, float> >();
}