c++: don't use YY_ASSERT at all if parse.assert is disabled
commitf4431ea11541ebb6a0f4d6cec8f120bd0639dd4a
authorAkim Demaille <akim.demaille@gmail.com>
Wed, 11 Nov 2020 08:28:32 +0000 (11 09:28 +0100)
committerAkim Demaille <akim.demaille@gmail.com>
Fri, 13 Nov 2020 05:17:52 +0000 (13 06:17 +0100)
treef94f0a014299f06308b22f319abd68a5392c174e
parentfe8c36ddcafdb6b49059fb023970cca8d2ca589a
c++: don't use YY_ASSERT at all if parse.assert is disabled

In some extreme situations (about 800 tokens), we generate a
single-line assertion long enough for Visual C++ to discard the end of
the line, thus falling into parse ends for the missing `);`.  On a
shorter example:

    YY_ASSERT (tok == token::TOK_YYEOF || tok == token::TOK_YYerror || tok == token::TOK_YYUNDEF || tok == token::TOK_ASSIGN || tok == token::TOK_MINUS || tok == token::TOK_PLUS || tok == token::TOK_STAR || tok == token::TOK_SLASH || tok == token::TOK_LPAREN || tok == token::TOK_RPAREN);

Whether NDEBUG is used or not is irrelevant, the parser dies anyway.

Reported by Jot Dot <jotdot@shaw.ca>.
https://lists.gnu.org/r/bug-bison/2020-11/msg00002.html

We should avoid emitting lines so long.

We probably should also use a range-based assertion (with extraneous
parens to pacify fascist compilers):

    YY_ASSERT ((token::TOK_YYEOF <= tok && tok <= token::TOK_YYUNDEF)
               || (token::TOK_ASSIGN <= tok && ...)

But anyway, we should simply not emit this assertion at all when not
asked for.

* data/skeletons/variant.hh: Do not define, nor use, YY_ASSERT when it
is not enabled.
NEWS
data/skeletons/variant.hh