From 9d6af153184eea964fef7f87d76a60fe29f715b5 Mon Sep 17 00:00:00 2001 From: "Joel E. Denny" Date: Sun, 1 May 2011 21:53:35 -0400 Subject: [PATCH] Fix precedence for end token. Since Bison 2.3b, which restored the ability of precedence directives to assign user token numbers, doing so for user token number 0 has produced an assertion failure. * NEWS (2.5): Document fix. * src/symtab.c (symbol_user_token_number_set): In the case of the end token, don't decrement ntokens if it was never incremented. * tests/regression.at (Token number in precedence declaration): Extend. --- ChangeLog | 12 ++++++++++++ NEWS | 10 ++++++++++ src/symtab.c | 5 +++-- tests/regression.at | 10 +++++++--- 4 files changed, 32 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index ce380959..d29e4f2b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2011-05-01 Joel E. Denny + + Fix precedence for end token. + Since Bison 2.3b, which restored the ability of precedence + directives to assign user token numbers, doing so for user token + number 0 has produced an assertion failure. + * NEWS (2.5): Document fix. + * src/symtab.c (symbol_user_token_number_set): In the case of the + end token, don't decrement ntokens if it was never incremented. + * tests/regression.at (Token number in precedence declaration): + Extend. + 2011-05-01 Joel E. Denny Prepare for 2.5 release. diff --git a/NEWS b/NEWS index 3eb2cc69..e063b782 100644 --- a/NEWS +++ b/NEWS @@ -343,6 +343,16 @@ Bison News bison -Wnone gram.y +** Precedence directives can now assign token number 0: + + Since Bison 2.3b, which restored the ability of precedence + directives to assign token numbers, doing so for token number 0 has + produced an assertion failure. For example: + + %left END 0 + + This bug has been fixed. + * Changes in version 2.4.3 (2010-08-05): ** Bison now obeys -Werror and --warnings=error for warnings about diff --git a/src/symtab.c b/src/symtab.c index f9f78b31..f065c80d 100644 --- a/src/symtab.c +++ b/src/symtab.c @@ -368,10 +368,11 @@ symbol_user_token_number_set (symbol *sym, int user_token_number, location loc) if (user_token_number == 0) { endtoken = sym; - endtoken->number = 0; /* It is always mapped to 0, so it was already counted in NTOKENS. */ - --ntokens; + if (endtoken->number != NUMBER_UNDEFINED) + --ntokens; + endtoken->number = 0; } } diff --git a/tests/regression.at b/tests/regression.at index 68a41319..c07b7442 100644 --- a/tests/regression.at +++ b/tests/regression.at @@ -1205,12 +1205,15 @@ AT_DATA_GRAMMAR([input.y], %} %error-verbose +%right END 0 %left TK1 1 TK2 2 "tok alias" 3 %% -start: TK1 sr_conflict "tok alias" ; - +start: + TK1 sr_conflict "tok alias" + | start %prec END + ; sr_conflict: TK2 | TK2 "tok alias" @@ -1240,7 +1243,8 @@ main (void) ]]) AT_BISON_CHECK([[-o input.c input.y]], [[0]],, -[[input.y:24.5-19: warning: rule useless in parser due to conflicts: sr_conflict: TK2 "tok alias" +[[input.y:23.5-19: warning: rule useless in parser due to conflicts: start: start +input.y:27.5-19: warning: rule useless in parser due to conflicts: sr_conflict: TK2 "tok alias" ]]) AT_COMPILE([[input]]) AT_PARSER_CHECK([[./input]]) -- 2.47.2