summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAkim Demaille <akim.demaille@gmail.com>2020-11-11 09:28:32 +0100
committerAkim Demaille <akim.demaille@gmail.com>2020-11-13 06:17:52 +0100
commitf4431ea11541ebb6a0f4d6cec8f120bd0639dd4a (patch)
treef94f0a014299f06308b22f319abd68a5392c174e
parentfe8c36ddcafdb6b49059fb023970cca8d2ca589a (diff)
downloadbison-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--NEWS8
-rw-r--r--data/skeletons/variant.hh17
2 files changed, 15 insertions, 10 deletions
diff --git a/NEWS b/NEWS
index ebb3354a..c5775a69 100644
--- a/NEWS
+++ b/NEWS
@@ -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], [, ], [$@]))[);
+ ]])[}
]])])