fix: don't die when EOF token is defined twice

With

    %token EOF 0 EOF 0

we get

    input.y:3.14-16: warning: symbol EOF redeclared [-Wother]
        3 | %token EOF 0 EOF 0
          |              ^~~
    input.y:3.8-10: previous declaration
        3 | %token EOF 0 EOF 0
          |        ^~~
    Assertion failed: (nsyms == ntokens + nvars), function check_and_convert_grammar,
        file /Users/akim/src/gnu/bison/src/reader.c, line 839.

Reported by Marc Schönefeld.

* src/symtab.c (symbol_user_token_number_set): Register only the
first definition of the end of input token.
* tests/input.at (Symbol redeclared): Check that case.
This commit is contained in:
Akim Demaille
2019-09-07 16:32:20 +02:00
parent 375eb71489
commit f8db8fe4d7
3 changed files with 9 additions and 2 deletions

1
THANKS
View File

@@ -100,6 +100,7 @@ Lie Yan lie.yan@kaust.edu.sa
Magnus Fromreide magfr@lysator.liu.se Magnus Fromreide magfr@lysator.liu.se
Marc Autret autret_m@epita.fr Marc Autret autret_m@epita.fr
Marc Mendiola mmendiol@usc.edu Marc Mendiola mmendiol@usc.edu
Marc Schönefeld marc.schoenefeld@gmx.org
Mark Boyall wolfeinstein@gmail.com Mark Boyall wolfeinstein@gmail.com
Martin Jacobs martin.jacobs@arcor.de Martin Jacobs martin.jacobs@arcor.de
Martin Mokrejs mmokrejs@natur.cuni.cz Martin Mokrejs mmokrejs@natur.cuni.cz

View File

@@ -495,7 +495,7 @@ symbol_user_token_number_set (symbol *sym, int user_token_number, location loc)
{ {
*user_token_numberp = user_token_number; *user_token_numberp = user_token_number;
/* User defined $end token? */ /* User defined $end token? */
if (user_token_number == 0) if (user_token_number == 0 && !endtoken)
{ {
endtoken = sym->content->symbol; endtoken = sym->content->symbol;
/* It is always mapped to 0, so it was already counted in /* It is always mapped to 0, so it was already counted in

View File

@@ -624,7 +624,7 @@ AT_SETUP([Symbol redeclared])
AT_DATA([[input.y]], AT_DATA([[input.y]],
[[%token FOO FOO [[%token FOO FOO
%token BAR 12 BAR 12 %token BAR 12 BAR 12
%token EOF 0 EOF 0
%% %%
exp: FOO BAR exp: FOO BAR
]]) ]])
@@ -642,6 +642,12 @@ input.y:2.15-17: warning: symbol BAR redeclared [-Wother]
input.y:2.8-10: previous declaration input.y:2.8-10: previous declaration
2 | %token BAR 12 BAR 12 2 | %token BAR 12 BAR 12
| ^~~ | ^~~
input.y:3.14-16: warning: symbol EOF redeclared [-Wother]
3 | %token EOF 0 EOF 0
| ^~~
input.y:3.8-10: previous declaration
3 | %token EOF 0 EOF 0
| ^~~
]]) ]])
AT_CLEANUP AT_CLEANUP