When a literal string is used to define two different tokens,

`bison -v' segfaults.
Reported by Piotr Gackiewicz, and fixed by Neil Booth.
* tests/regression.m4: New file.
Include the core of the sample provided by Piotr Gackiewicz.
* src/reader.c (parse_token_decl): Diagnose bad cases, and proceed
properly.
This commit is contained in:
Akim Demaille
2000-10-04 11:52:53 +00:00
parent a9e64249c8
commit 8e03724b11
6 changed files with 58 additions and 11 deletions

View File

@@ -1,3 +1,14 @@
2000-10-04 Akim Demaille <akim@epita.fr>
When a literal string is used to define two different tokens,
`bison -v' segfaults.
Reported by Piotr Gackiewicz, and fixed by Neil Booth.
* tests/regression.m4: New file.
Include the core of the sample provided by Piotr Gackiewicz.
* src/reader.c (parse_token_decl): Diagnose bad cases, and proceed
properly.
2000-10-04 Akim Demaille <akim@epita.fr>
* src/reader.c (parse_expect_decl): Keep `count' within the size

1
THANKS
View File

@@ -5,6 +5,7 @@ Jim Meyering meyering@gnu.org
Neil Booth NeilB@earthling.net
Noah Friedman friedman@gnu.org
Paul Eggert eggert@twinsun.com
Piotr Gackiewicz gacek@intertel.com.pl
Richard Stallman rms@gnu.org
Many people are not named here because we lost track of them. We

View File

@@ -372,17 +372,25 @@ parse_token_decl (symbol_class what_is, symbol_class what_is_not)
}
else if (token == IDENTIFIER && *symval->tag == '\"' && symbol)
{
if (symval->alias)
warn (_("symbol `%s' used more than once as a literal string"),
symval->tag);
else if (symbol->alias)
warn (_("symbol `%s' given more than one literal string"),
symbol->tag);
else
{
symval->class = token_sym;
symval->type_name = typename;
symval->user_token_number = symbol->user_token_number;
symbol->user_token_number = SALIAS;
symval->alias = symbol;
symbol->alias = symval;
/* symbol and symval combined are only one symbol */
nsyms--;
}
translations = 1;
symval->class = token_sym;
symval->type_name = typename;
symval->user_token_number = symbol->user_token_number;
symbol->user_token_number = SALIAS;
symval->alias = symbol;
symbol->alias = symval;
symbol = NULL;
nsyms--; /* symbol and symval combined are only one symbol */
symbol = NULL;
}
else if (token == IDENTIFIER)
{

View File

@@ -21,7 +21,7 @@
# Distribute the testsuite since GNU M4 is needed to build it.
noinst_SCRIPTS = testsuite
SUITE = calc.m4
SUITE = calc.m4 regression.m4
EXTRA_DIST = atgeneral.m4 suite.m4 $(SUITE)

26
tests/regression.m4 Normal file
View File

@@ -0,0 +1,26 @@
# -*- Autoconf -*-
cat <<EOF
Regression tests.
EOF
AT_SETUP(Duplicate string)
AT_DATA([duplicate.y],
[[/* `Bison -v' used to dump core when two tokens are defined with the same
string, as LE and GE below. */
%token NUM
%token LE "<="
%token GE "<="
%%
exp: '(' exp ')' | NUM ;
%%
]])
AT_CHECK([bison -v duplicate.y -o duplicate.c], 0, ignore, ignore)
AT_CLEANUP(duplicate.*)

View File

@@ -5,3 +5,4 @@
AT_INIT([bison])
AT_INCLUDE([calc.m4])
AT_INCLUDE([regression.m4])