boostorg / spirit

Boost.org spirit module
http://boost.org/libs/spirit
393 stars 161 forks source link

x3::standard_wide::bool_ parser does not work with standard_wide string #706

Open drocheam opened 2 years ago

drocheam commented 2 years ago

It seems the bool parser is not working with wchar_t although being included in the x3::standard_wide namespace.

Minimal Example:

#include <string>
#include <boost/spirit/home/x3.hpp>

int main()
{
    namespace x3 = boost::spirit::x3;

    std::wstring test = L"true";
    bool res = 0;

    x3::phrase_parse(test.begin(), test.end(), x3::standard_wide::bool_, x3::standard_wide::space, res);

    return 0;
}

Compiled With: g++ -I -lboost main.cpp

On Manjaro Linux 21.2 and boost 1.76

Error (condensed):

/usr/include/boost/spirit/home/x3/string/detail/string_parse.hpp:24:38: error: no match for call to ‘(const boost::spirit::x3::case_compare<boost::spirit::char_encoding::standard_wide>) (char&, wchar_t&)’
   24 |             if (i == last || (compare(ch, *i) != 0))
      |                               ~~~~~~~^~~~~~~~
Kojoley commented 2 years ago

Thanks for the bug report.

There was a PR targeting the issue in case_compare https://github.com/boostorg/spirit/pull/655 but it has an issue. Maybe a better way to resolve this is to convert the char string in the default bool policy via case_compare encoding somehow https://github.com/boostorg/spirit/blob/ac63f8e6b5b258177ada155678547f3c363ee72d/include/boost/spirit/home/x3/numeric/bool_policies.hpp#L20-L45