diff options
author | Akim Demaille <akim.demaille@gmail.com> | 2020-11-11 09:28:32 +0100 |
---|---|---|
committer | Akim Demaille <akim.demaille@gmail.com> | 2020-11-13 06:17:52 +0100 |
commit | f4431ea11541ebb6a0f4d6cec8f120bd0639dd4a (patch) | |
tree | f94f0a014299f06308b22f319abd68a5392c174e | |
parent | fe8c36ddcafdb6b49059fb023970cca8d2ca589a (diff) | |
download | bison-f4431ea11541ebb6a0f4d6cec8f120bd0639dd4a.tar.gz |
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.
-rw-r--r-- | NEWS | 8 | ||||
-rw-r--r-- | data/skeletons/variant.hh | 17 |
2 files changed, 15 insertions, 10 deletions
@@ -4,9 +4,17 @@ GNU Bison NEWS ** Bug fixes +*** Bug fixes in yacc.c + In Yacc mode, all the tokens are defined twice: once as an enum, and then as a macro. YYEMPTY was missing its macro. +*** Bug fixes in lalr1.cc + + The lalr1.cc skeleton used to emit internal assertions (using YY_ASSERT) + even when the `parse.assert` %define variable is not enabled. It no + longer does. + ** Changes The YYBISON macro in generated "regular C parsers" (from the "yacc.c" diff --git a/data/skeletons/variant.hh b/data/skeletons/variant.hh index 736a2677..1fe40145 100644 --- a/data/skeletons/variant.hh +++ b/data/skeletons/variant.hh @@ -71,12 +71,12 @@ m4_map([ b4_symbol_tag_comment], [$@])dnl # ------------------- # The needed includes for variants support. m4_define([b4_variant_includes], -[b4_parse_assert_if([[#include <typeinfo>]])[ +[b4_parse_assert_if([[#include <typeinfo> #ifndef YY_ASSERT # include <cassert> # define YY_ASSERT assert #endif -]]) +]])]) @@ -110,8 +110,8 @@ m4_define([b4_value_type_declare], template <typename T> semantic_type (YY_RVREF (T) t)]b4_parse_assert_if([ : yytypeid_ (&typeid (T))])[ - { - YY_ASSERT (sizeof (T) <= size); + {]b4_parse_assert_if([[ + YY_ASSERT (sizeof (T) <= size);]])[ new (yyas_<T> ()) T (YY_MOVE (t)); } @@ -410,9 +410,6 @@ m4_define([_b4_token_constructor_define], : super_type(]b4_join([token_type (tok)], b4_symbol_if([$1], [has_type], [std::move (v)]), b4_locations_if([std::move (l)]))[) - { - YY_ASSERT (]m4_join([ || ], m4_map_sep([_b4_type_clause], [, ], [$@]))[); - } #else symbol_type (]b4_join( [int tok], @@ -422,10 +419,10 @@ m4_define([_b4_token_constructor_define], : super_type(]b4_join([token_type (tok)], b4_symbol_if([$1], [has_type], [v]), b4_locations_if([l]))[) - { - YY_ASSERT (]m4_join([ || ], m4_map_sep([_b4_type_clause], [, ], [$@]))[); - } #endif + {]b4_parse_assert_if([[ + YY_ASSERT (]m4_join([ || ], m4_map_sep([_b4_type_clause], [, ], [$@]))[); + ]])[} ]])]) |