Subject: [Boost-bugs] [Boost C++ Libraries] #12732: Karma problem converting a char vector to string
From: Boost C++ Libraries (noreply_at_[hidden])
Date: 2017-01-06 15:16:39
#12732: Karma problem converting a char vector to string
----------------------------------------+------------------------
Reporter: Braden McDaniel <braden@â¦> | Owner: djowel
Type: Bugs | Status: new
Milestone: To Be Determined | Component: spirit
Version: Boost 1.63.0 | Severity: Regression
Keywords: |
----------------------------------------+------------------------
The version of Boost.Spirit.Karma included with Boost 1.63.0 appears to
have a problem converting a char vector to a string when building with
Apple Clang 8.0 using the `-std=c++14` (or `-std=gnu++14`) option.
Consider the following example:
{{{#!c++
#include <boost/spirit/include/karma.hpp>
#include <boost/fusion/include/adapt_struct.hpp>
struct foo {
std::string a, b;
};
BOOST_FUSION_ADAPT_STRUCT(
foo,
(std::string, a)
(std::string, b)
)
int main()
{
using namespace boost::spirit::karma;
typedef rule<std::back_insert_iterator<std::string>, foo(), space_type>
rule_t;
rule_t r
= +char_ << '(' << string << ')'
| skip[string] << string
;
foo f = {"a", "b"};
std::string s;
generate_delimited(std::back_inserter(s), r, space, f);
}
}}}
When compiled with the -std=c++14 and -stdlib=libc++ options, the
following errors are emitted:
{{{
$ c++ -I ~/Build/ng-core-Debug/API/inc -std=c++14 -stdlib=libc++ -o karma-
char-seq karma-char-seq.cpp
In file included from karma-char-seq.cpp:1:
In file included from /Users/mcdanb/Build/ng-core-
Debug/API/inc/boost/phoenix.hpp:11:
In file included from /Users/mcdanb/Build/ng-core-
Debug/API/inc/boost/phoenix/phoenix.hpp:11:
In file included from /Users/mcdanb/Build/ng-core-
Debug/API/inc/boost/phoenix/core.hpp:13:
In file included from /Users/mcdanb/Build/ng-core-
Debug/API/inc/boost/phoenix/core/debug.hpp:17:
In file included from /Users/mcdanb/Build/ng-core-
Debug/API/inc/boost/proto/proto.hpp:12:
In file included from /Users/mcdanb/Build/ng-core-
Debug/API/inc/boost/proto/core.hpp:21:
In file included from /Users/mcdanb/Build/ng-core-
Debug/API/inc/boost/proto/fusion.hpp:22:
In file included from /Users/mcdanb/Build/ng-core-
Debug/API/inc/boost/fusion/include/intrinsic.hpp:11:
In file included from /Users/mcdanb/Build/ng-core-
Debug/API/inc/boost/fusion/sequence/intrinsic.hpp:23:
In file included from /Users/mcdanb/Build/ng-core-
Debug/API/inc/boost/fusion/sequence/intrinsic/swap.hpp:15:
In file included from /Users/mcdanb/Build/ng-core-
Debug/API/inc/boost/fusion/view/zip_view.hpp:12:
In file included from /Users/mcdanb/Build/ng-core-
Debug/API/inc/boost/fusion/view/zip_view/zip_view.hpp:16:
In file included from /Users/mcdanb/Build/ng-core-
Debug/API/inc/boost/fusion/view/zip_view/detail/begin_impl.hpp:14:
In file included from /Users/mcdanb/Build/ng-core-
Debug/API/inc/boost/fusion/algorithm/transformation/transform.hpp:11:
In file included from /Users/mcdanb/Build/ng-core-
Debug/API/inc/boost/fusion/view/transform_view/transform_view.hpp:22:
In file included from /Users/mcdanb/Build/ng-core-
Debug/API/inc/boost/fusion/container/vector/vector10.hpp:25:
/Users/mcdanb/Build/ng-core-
Debug/API/inc/boost/fusion/container/vector/vector.hpp:168:19: error:
no matching constructor for initialization of
'std::__1::vector<char,
std::__1::allocator<char> >'
: elem(std::forward<U>(rhs))
^ ~~~~~~~~~~~~~~~~~~~~
/Users/mcdanb/Build/ng-core-
Debug/API/inc/boost/fusion/container/vector/vector.hpp:208:19: note:
in instantiation of function template specialization
'boost::fusion::vector_detail::store<0, std::__1::vector<char,
std::__1::allocator<char> > >::store<std::__1::basic_string<char> &,
void>' requested here
: store<I,
T>(forward_at_c<I>(std::forward<Sequence>(rhs)))...
^
/Users/mcdanb/Build/ng-core-
Debug/API/inc/boost/fusion/container/vector/vector.hpp:319:15: note:
in instantiation of function template specialization
'boost::fusion::vector_detail::vector_data<boost::fusion::detail::index_sequence<0,
1>, std::__1::vector<char, std::__1::allocator<char> >,
std::__1::basic_string<char> >::vector_data<foo, foo, void>'
requested
here
: base(vector_detail::each_elem(),
std::forward<Sequence>(seq))
^
/Users/mcdanb/Build/ng-core-
Debug/API/inc/boost/type_traits/is_convertible.hpp:482:56: note:
in instantiation of function template specialization
'boost::fusion::vector<std::__1::vector<char,
std::__1::allocator<char> >,
std::__1::basic_string<char> >::vector<foo, foo, void>' requested
here
struct is_convertible : public integral_constant<bool,
BOOST_IS_CONVERTI...
^
/Users/mcdanb/Build/ng-core-
Debug/API/inc/boost/type_traits/intrinsics.hpp:214:63: note:
expanded from macro 'BOOST_IS_CONVERTIBLE'
# define BOOST_IS_CONVERTIBLE(T,U) __is_convertible_to(T,U)
^
/Users/mcdanb/Build/ng-core-
Debug/API/inc/boost/spirit/home/support/attributes.hpp:309:13: note:
in instantiation of template class 'boost::is_convertible<foo,
boost::fusion::vector<std::__1::vector<char,
std::__1::allocator<char> >,
std::__1::basic_string<char> > >' requested here
: is_convertible<Attribute, Expected>
^
/Users/mcdanb/Build/ng-core-
Debug/API/inc/boost/mpl/aux_/nested_type_wknd.hpp:27:7: note:
in instantiation of template class
'boost::spirit::traits::detail::attribute_is_compatible<boost::fusion::vector<std::__1::vector<char,
std::__1::allocator<char> >, std::__1::basic_string<char> >, foo>'
requested here
: T::type
^
/Users/mcdanb/Build/ng-core-
Debug/API/inc/boost/mpl/aux_/preprocessed/gcc/or.hpp:51:11: note:
(skipping 12 contexts in backtrace; use -ftemplate-backtrace-limit=0
to
see all)
BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value
^
/Users/mcdanb/Build/ng-core-
Debug/API/inc/boost/mpl/aux_/nested_type_wknd.hpp:38:24: note:
expanded from macro 'BOOST_MPL_AUX_NESTED_TYPE_WKND'
::boost::mpl::aux::nested_type_wknd<T> \
^
/Users/mcdanb/Build/ng-core-
Debug/API/inc/boost/function/function_template.hpp:1072:5: note:
in instantiation of function template specialization
'boost::function3<bool,
boost::spirit::karma::detail::output_iterator<std::__1::back_insert_iterator<std::__1::basic_string<char>
>, mpl_::int_<15>, boost::spirit::unused_type> &,
boost::spirit::context<boost::fusion::cons<const foo &,
boost::fusion::nil_>, boost::fusion::vector<> > &, const
boost::spirit::karma::any_space<boost::spirit::char_encoding::standard>
&>::function3<boost::spirit::karma::detail::generator_binder<boost::spirit::karma::alternative<boost::fusion::cons<boost::spirit::karma::sequence<boost::fusion::cons<boost::spirit::karma::plus<boost::spirit::karma::any_char<boost::spirit::char_encoding::standard,
boost::spirit::unused_type> >,
boost::fusion::cons<boost::spirit::karma::literal_char<boost::spirit::char_encoding::standard,
boost::spirit::unused_type, true>,
boost::fusion::cons<boost::spirit::karma::any_string<boost::spirit::char_encoding::standard,
boost::spirit::unused_type>,
boost::fusion::cons<boost::spirit::karma::literal_char<boost::spirit::char_encoding::standard,
boost::spirit::unused_type, true>, boost::fusion::nil_> > > > >,
boost::fusion::cons<boost::spirit::karma::sequence<boost::fusion::cons<boost::spirit::karma::omit_directive<boost::spirit::karma::any_string<boost::spirit::char_encoding::standard,
boost::spirit::unused_type>, false>,
boost::fusion::cons<boost::spirit::karma::any_string<boost::spirit::char_encoding::standard,
boost::spirit::unused_type>, boost::fusion::nil_> > >,
boost::fusion::nil_> > >, mpl_::bool_<false> > >' requested here
base_type(f)
^
/Users/mcdanb/Build/ng-core-
Debug/API/inc/boost/function/function_template.hpp:1125:5: note:
in instantiation of function template specialization
'boost::function<bool
(boost::spirit::karma::detail::output_iterator<std::__1::back_insert_iterator<std::__1::basic_string<char>
>, mpl_::int_<15>, boost::spirit::unused_type> &,
boost::spirit::context<boost::fusion::cons<const foo &,
boost::fusion::nil_>, boost::fusion::vector<> > &, const
boost::spirit::karma::any_space<boost::spirit::char_encoding::standard>
&)>::function<boost::spirit::karma::detail::generator_binder<boost::spirit::karma::alternative<boost::fusion::cons<boost::spirit::karma::sequence<boost::fusion::cons<boost::spirit::karma::plus<boost::spirit::karma::any_char<boost::spirit::char_encoding::standard,
boost::spirit::unused_type> >,
boost::fusion::cons<boost::spirit::karma::literal_char<boost::spirit::char_encoding::standard,
boost::spirit::unused_type, true>,
boost::fusion::cons<boost::spirit::karma::any_string<boost::spirit::char_encoding::standard,
boost::spirit::unused_type>,
boost::fusion::cons<boost::spirit::karma::literal_char<boost::spirit::char_encoding::standard,
boost::spirit::unused_type, true>, boost::fusion::nil_> > > > >,
boost::fusion::cons<boost::spirit::karma::sequence<boost::fusion::cons<boost::spirit::karma::omit_directive<boost::spirit::karma::any_string<boost::spirit::char_encoding::standard,
boost::spirit::unused_type>, false>,
boost::fusion::cons<boost::spirit::karma::any_string<boost::spirit::char_encoding::standard,
boost::spirit::unused_type>, boost::fusion::nil_> > >,
boost::fusion::nil_> > >, mpl_::bool_<false> > >' requested here
self_type(f).swap(*this);
^
/Users/mcdanb/Build/ng-core-
Debug/API/inc/boost/spirit/home/karma/nonterminal/rule.hpp:192:19: note:
in instantiation of function template specialization
'boost::function<bool
(boost::spirit::karma::detail::output_iterator<std::__1::back_insert_iterator<std::__1::basic_string<char>
>, mpl_::int_<15>, boost::spirit::unused_type> &,
boost::spirit::context<boost::fusion::cons<const foo &,
boost::fusion::nil_>, boost::fusion::vector<> > &, const
boost::spirit::karma::any_space<boost::spirit::char_encoding::standard>
&)>::operator=<boost::spirit::karma::detail::generator_binder<boost::spirit::karma::alternative<boost::fusion::cons<boost::spirit::karma::sequence<boost::fusion::cons<boost::spirit::karma::plus<boost::spirit::karma::any_char<boost::spirit::char_encoding::standard,
boost::spirit::unused_type> >,
boost::fusion::cons<boost::spirit::karma::literal_char<boost::spirit::char_encoding::standard,
boost::spirit::unused_type, true>,
boost::fusion::cons<boost::spirit::karma::any_string<boost::spirit::char_encoding::standard,
boost::spirit::unused_type>,
boost::fusion::cons<boost::spirit::karma::literal_char<boost::spirit::char_encoding::standard,
boost::spirit::unused_type, true>, boost::fusion::nil_> > > > >,
boost::fusion::cons<boost::spirit::karma::sequence<boost::fusion::cons<boost::spirit::karma::omit_directive<boost::spirit::karma::any_string<boost::spirit::char_encoding::standard,
boost::spirit::unused_type>, false>,
boost::fusion::cons<boost::spirit::karma::any_string<boost::spirit::char_encoding::standard,
boost::spirit::unused_type>, boost::fusion::nil_> > >,
boost::fusion::nil_> > >, mpl_::bool_<false> > >' requested here
lhs.f = detail::bind_generator<Auto>(
^
/Users/mcdanb/Build/ng-core-
Debug/API/inc/boost/spirit/home/karma/nonterminal/rule.hpp:201:13: note:
in instantiation of function template specialization
'boost::spirit::karma::rule<std::__1::back_insert_iterator<std::__1::basic_string<char>
>, foo (),
boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,
boost::proto::argsns_::term<boost::spirit::tag::char_code<boost::spirit::tag::space,
boost::spirit::char_encoding::standard> >, 0>,
boost::spirit::unused_type,
boost::spirit::unused_type>::define<mpl_::bool_<false>,
boost::proto::exprns_::expr<boost::proto::tagns_::tag::bitwise_or,
boost::proto::argsns_::list2<const
boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_left,
boost::proto::argsns_::list2<const
boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_left,
boost::proto::argsns_::list2<const
boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_left,
boost::proto::argsns_::list2<const
boost::proto::exprns_::expr<boost::proto::tagns_::tag::unary_plus,
boost::proto::argsns_::list1<const
boost::spirit::terminal<boost::spirit::tag::char_code<boost::spirit::tag::char_,
boost::spirit::char_encoding::standard> > &>, 1> &,
boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,
boost::proto::argsns_::term<const char &>, 0> >, 2> &, const
boost::spirit::terminal<boost::spirit::tag::char_code<boost::spirit::tag::string,
boost::spirit::char_encoding::standard> > &>, 2> &,
boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,
boost::proto::argsns_::term<const char &>, 0> >, 2> &, const
boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_left,
boost::proto::argsns_::list2<const
boost::proto::exprns_::expr<boost::proto::tagns_::tag::subscript,
boost::proto::argsns_::list2<const
boost::spirit::terminal<boost::spirit::tag::skip> &, const
boost::spirit::terminal<boost::spirit::tag::char_code<boost::spirit::tag::string,
boost::spirit::char_encoding::standard> > &>, 2> &, const
boost::spirit::terminal<boost::spirit::tag::char_code<boost::spirit::tag::string,
boost::spirit::char_encoding::standard> > &>, 2> &>, 2> >' requested
here
define<mpl::false_>(*this, expr,
traits::matches<karma::doma...
^
karma-char-seq.cpp:24:13: note: in instantiation of function template
specialization
'boost::spirit::karma::rule<std::__1::back_insert_iterator<std::__1::basic_string<char>
>, foo (),
boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,
boost::proto::argsns_::term<boost::spirit::tag::char_code<boost::spirit::tag::space,
boost::spirit::char_encoding::standard> >, 0>,
boost::spirit::unused_type,
boost::spirit::unused_type>::rule<boost::proto::exprns_::expr<boost::proto::tagns_::tag::bitwise_or,
boost::proto::argsns_::list2<const
boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_left,
boost::proto::argsns_::list2<const
boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_left,
boost::proto::argsns_::list2<const
boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_left,
boost::proto::argsns_::list2<const
boost::proto::exprns_::expr<boost::proto::tagns_::tag::unary_plus,
boost::proto::argsns_::list1<const
boost::spirit::terminal<boost::spirit::tag::char_code<boost::spirit::tag::char_,
boost::spirit::char_encoding::standard> > &>, 1> &,
boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,
boost::proto::argsns_::term<const char &>, 0> >, 2> &, const
boost::spirit::terminal<boost::spirit::tag::char_code<boost::spirit::tag::string,
boost::spirit::char_encoding::standard> > &>, 2> &,
boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,
boost::proto::argsns_::term<const char &>, 0> >, 2> &, const
boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_left,
boost::proto::argsns_::list2<const
boost::proto::exprns_::expr<boost::proto::tagns_::tag::subscript,
boost::proto::argsns_::list2<const
boost::spirit::terminal<boost::spirit::tag::skip> &, const
boost::spirit::terminal<boost::spirit::tag::char_code<boost::spirit::tag::string,
boost::spirit::char_encoding::standard> > &>, 2> &, const
boost::spirit::terminal<boost::spirit::tag::char_code<boost::spirit::tag::string,
boost::spirit::char_encoding::standard> > &>, 2> &>, 2> >' requested
here
= +char_ << '(' << string << ')'
^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/vector:489:40:
note:
candidate constructor not viable: no known conversion from
'std::__1::basic_string<char>' to 'const allocator_type' (aka 'const
std::__1::allocator<char>') for 1st argument
_LIBCPP_INLINE_VISIBILITY explicit vector(const allocator_type& __a)
^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/vector:501:14:
note:
candidate constructor not viable: no known conversion from
'std::__1::basic_string<char>' to 'size_type' (aka 'unsigned long')
for
1st argument
explicit vector(size_type __n);
^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/vector:537:5:
note:
candidate constructor not viable: no known conversion from
'std::__1::basic_string<char>' to 'initializer_list<value_type>'
(aka
'initializer_list<char>') for 1st argument
vector(initializer_list<value_type> __il);
^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/vector:549:5:
note:
candidate constructor not viable: no known conversion from
'std::__1::basic_string<char>' to 'const std::__1::vector<char,
std::__1::allocator<char> >' for 1st argument
vector(const vector& __x);
^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/vector:555:5:
note:
candidate constructor not viable: no known conversion from
'std::__1::basic_string<char>' to 'std::__1::vector<char,
std::__1::allocator<char> >' for 1st argument
vector(vector&& __x)
^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/vector:508:9:
note:
candidate constructor template not viable: requires 2 arguments, but
1 was
provided
vector(_InputIterator __first,
^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/vector:516:9:
note:
candidate constructor template not viable: requires at least 3
arguments,
but 1 was provided
vector(_InputIterator __first, _InputIterator __last, const
allo...
^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/vector:523:9:
note:
candidate constructor template not viable: requires 2 arguments, but
1 was
provided
vector(_ForwardIterator __first,
^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/vector:530:9:
note:
candidate constructor template not viable: requires at least 3
arguments,
but 1 was provided
vector(_ForwardIterator __first, _ForwardIterator __last, const
...
^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/vector:483:5:
note:
candidate constructor not viable: requires 0 arguments, but 1 was
provided
vector()
_NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value)
^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/vector:503:14:
note:
candidate constructor not viable: requires 2 arguments, but 1 was
provided
explicit vector(size_type __n, const allocator_type& __a);
^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/vector:505:5:
note:
candidate constructor not viable: requires 2 arguments, but 1 was
provided
vector(size_type __n, const_reference __x);
^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/vector:539:5:
note:
candidate constructor not viable: requires 2 arguments, but 1 was
provided
vector(initializer_list<value_type> __il, const allocator_type& __a);
^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/vector:550:5:
note:
candidate constructor not viable: requires 2 arguments, but 1 was
provided
vector(const vector& __x, const allocator_type& __a);
^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/vector:562:5:
note:
candidate constructor not viable: requires 2 arguments, but 1 was
provided
vector(vector&& __x, const allocator_type& __a);
^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/vector:506:5:
note:
candidate constructor not viable: requires 3 arguments, but 1 was
provided
vector(size_type __n, const_reference __x, const allocator_type& __a);
^
1 error generated.
}}}
The problem construct appears to be `+char_`. The error goes away if it is
replaced with `string`; but the error also goes away if the alternative is
removed from the rule.
This code worked fine with the Boost.Spirit.Karma included with Boost
1.62.0.
-- Ticket URL: <https://svn.boost.org/trac/boost/ticket/12732> Boost C++ Libraries <http://www.boost.org/> Boost provides free peer-reviewed portable C++ source libraries.
This archive was generated by hypermail 2.1.7 : 2017-02-16 18:50:20 UTC