Boost logo

Boost Users :

Subject: Re: [Boost-users] [Spirit] Qi int_parser rejecting a negative signed std::intmax_t
From: Michael Powell (mwpowellhtx_at_[hidden])
Date: 2018-11-12 22:47:49


On Mon, Nov 12, 2018 at 5:43 PM Gavin Lambert via Boost-users
<boost-users_at_[hidden]> wrote:
>
> On 13/11/2018 05:27, Michael Powell wrote:
> > Oops, my mistake. An error in one of the rules. Fixed it, and can
> > demonstrate that negative values do not seem to parse correctly:
> >
> > http://coliru.stacked-crooked.com/a/370b6aa5c167434b
>
> Hex and octal literals produce unsigned values. You need to put those
> into a uintmax_t, not an intmax_t.
>
> FWIW, you can still use an intmax_t in your AST if you want, as the
> automatic attribute conversion will permit the twos-complement
> conversion (though it might annoy some sanitisers).
>
> hex_val %= no_case["0x"] >> uint_parser<std::uintmax_t, 16>{};
> oct_val %= "0" >> uint_parser<std::uintmax_t, 8>{};
> dec_val %= int_parser<ast::int_t, 10>{};

Hmm, I see... Maybe this is rinsing out in the conversion wash, then,
because the decimal phrase seems to handle negative values just fine,
whereas the hex and octal parsers fall flag on their face.

Anyway, it makes dealing with signage kind of tricky in the face of
those nuances.

> If you feel especially enthused, you can use
> std::make_unsigned_t<ast::int_t> instead.
> _______________________________________________
> Boost-users mailing list
> Boost-users_at_[hidden]
> https://lists.boost.org/mailman/listinfo.cgi/boost-users


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net