* data/glr.c (yyrecoverSyntaxError, yyreturn):

Don't invoke destructor on unresolved entries.
* tests/glr-regression.at
(User destructor for unresolved GLR semantic value): New test case.
Problem reported by Joel E. Denny in:
http://lists.gnu.org/archive/html/bison-patches/2005-08/msg00016.html
This commit is contained in:
Paul Eggert
2005-08-25 06:11:35 +00:00
parent 15d29c1ffe
commit adc90f13ab
3 changed files with 87 additions and 6 deletions

View File

@@ -1,3 +1,12 @@
2005-08-24 Paul Eggert <eggert@cs.ucla.edu>
* data/glr.c (yyrecoverSyntaxError, yyreturn):
Don't invoke destructor on unresolved entries.
* tests/glr-regression.at
(User destructor for unresolved GLR semantic value): New test case.
Problem reported by Joel E. Denny in:
http://lists.gnu.org/archive/html/bison-patches/2005-08/msg00016.html
2005-08-21 Paul Eggert <eggert@cs.ucla.edu>
* lib/.cvsignore: Remove realloc.c, strncasecmp.c, xstrdup.c.

View File

@@ -1981,9 +1981,10 @@ yyrecoverSyntaxError (yyGLRStack* yystack,
}
}
]b4_location_if([[ yystack->yyerror_range[1].yystate.yyloc = yys->yyloc;]])[
yydestruct ("Error: popping",
yystos[yys->yylrState],
&yys->yysemantics.yysval]b4_location_if([, &yys->yyloc])[);
if (yys->yyresolved)
yydestruct ("Error: popping",
yystos[yys->yylrState],
&yys->yysemantics.yysval]b4_location_if([, &yys->yyloc])[);
yystack->yytops.yystates[0] = yys->yypred;
yystack->yynextFree -= 1;
yystack->yyspaceLeft += 1;
@@ -2183,9 +2184,10 @@ b4_syncline([@oline@], [@ofile@])])dnl
{
yyGLRState *yys = yystates[0];
]b4_location_if([[ yystack.yyerror_range[1].yystate.yyloc = yys->yyloc;]]
)[ yydestruct ("Cleanup: popping",
yystos[yys->yylrState],
&yys->yysemantics.yysval]b4_location_if([, &yys->yyloc])[);
)[ if (yys->yyresolved)
yydestruct ("Cleanup: popping",
yystos[yys->yylrState],
&yys->yysemantics.yysval]b4_location_if([, &yys->yyloc])[);
yystates[0] = yys->yypred;
yystack.yynextFree -= 1;
yystack.yyspaceLeft += 1;

View File

@@ -420,3 +420,73 @@ AT_CHECK([[./glr-regr4]], 0,
]], [])
AT_CLEANUP
## ---------------------------------------------------------------------- ##
## User destructor for unresolved GLR semantic value ##
## Thanks to Joel E. Denny for this test; see ##
## <http://lists.gnu.org/archive/html/help-bison/2005-07/msg00013.html>. ##
## ---------------------------------------------------------------------- ##
AT_SETUP([User destructor for unresolved GLR semantic value])
AT_DATA_GRAMMAR([glr-regr5.y],
[[%{
#include <stdio.h>
#include <stdlib.h>
static void yyerror (char const *);
static int yylex (void);
enum { MAGIC_VALUE = -1057808125 }; /* originally chosen at random */
%}
%glr-parser
%union { int value; }
%type <value> start
%destructor {
if ($$ != MAGIC_VALUE)
{
fprintf (stderr, "Bad destructor call.\n");
exit (EXIT_FAILURE);
}
} start
%%
start:
'a' { $$ = MAGIC_VALUE; }
| 'a' { $$ = MAGIC_VALUE; }
;
%%
static int
yylex (void)
{
static char const *input = "a";
return *input++;
}
static void
yyerror (char const *msg)
{
printf ("%s\n", msg);
}
int
main (void)
{
return yyparse () != 1;
}
]])
AT_CHECK([[bison -o glr-regr5.c glr-regr5.y]], 0, [],
[glr-regr5.y: conflicts: 1 reduce/reduce
])
AT_COMPILE([glr-regr5])
AT_CHECK([[./glr-regr5]], 0,
[syntax is ambiguous
])
AT_CLEANUP