X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/d88cf117910f0023d3a0f53c2380aec40a748c3d..14594e38ada5b5aa89d513ea8ae658996862f7c8:/tests/regression.at diff --git a/tests/regression.at b/tests/regression.at index 01a60c89..c7ed4b74 100644 --- a/tests/regression.at +++ b/tests/regression.at @@ -1,7 +1,6 @@ # Bison Regressions. -*- Autotest -*- -# Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software -# Foundation, Inc. +# Copyright (C) 2001-2012 Free Software Foundation, Inc. # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -393,7 +392,8 @@ input.y:3.14: invalid character: `}' input.y:4.1: invalid character: `%' input.y:4.2: invalid character: `&' input.y:5.1-17: invalid directive: `%a-does-not-exist' -input.y:6.1-2: invalid directive: `%-' +input.y:6.1: invalid character: `%' +input.y:6.2: invalid character: `-' input.y:7.1-8.0: missing `%}' at end of file input.y:7.1-8.0: syntax error, unexpected %{...%} ]]) @@ -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]]) @@ -1358,16 +1362,13 @@ AT_CLEANUP # Imagine the case where YYSTACK_ALLOC_MAXIMUM = YYSIZE_MAXIMUM and an # invocation of yysyntax_error has caused yymsg_alloc to grow to exactly # YYSTACK_ALLOC_MAXIMUM (perhaps because the normal doubling of size had -# to be clipped to YYSTACK_ALLOC_MAXIMUM). Now imagine a subsequent -# invocation of yysyntax_error that overflows during its size -# calculation and thus returns YYSIZE_MAXIMUM to yyparse. Then, yyparse -# will invoke yyerror using the old contents of yymsg. This bug needs -# to be fixed. +# to be clipped to YYSTACK_ALLOC_MAXIMUM). In an old version of yacc.c, +# a subsequent invocation of yysyntax_error that overflows during its +# size calculation would return YYSIZE_MAXIMUM to yyparse. Then, +# yyparse would invoke yyerror using the old contents of yymsg. AT_SETUP([[%error-verbose overflow]]) -AT_XFAIL_IF([[:]]) - AT_DATA_GRAMMAR([input.y], [[%code { #include <stdio.h> @@ -1378,9 +1379,12 @@ AT_DATA_GRAMMAR([input.y], large enough to overflow size_t. */ #define YYSIZE_T unsigned char - /* Bring in malloc so yacc.c doesn't try to provide a malloc prototype - using our YYSIZE_T. */ + /* Bring in malloc and set EXIT_SUCCESS so yacc.c doesn't try to + provide a malloc prototype using our YYSIZE_T. */ #include <stdlib.h> + #ifndef EXIT_SUCCESS + # define EXIT_SUCCESS 0 + #endif /* Max depth is usually much smaller than YYSTACK_ALLOC_MAXIMUM, and we don't want gcc to warn everywhere this constant would be too big @@ -1477,3 +1481,193 @@ memory exhausted ]]) AT_CLEANUP + + + +## ------------------------ ## +## LAC: Exploratory stack. ## +## ------------------------ ## + +AT_SETUP([[LAC: Exploratory stack]]) + +m4_pushdef([AT_LAC_CHECK], [ + +AT_BISON_OPTION_PUSHDEFS([$1]) + +AT_DATA_GRAMMAR([input.y], +[[%code { + #include <stdio.h> + void yyerror (char const *); + int yylex (]AT_PURE_IF([[YYSTYPE *]], [[void]])[); +} + +]$1[ +%error-verbose +%token 'c' + +%% + +// default reductions in inconsistent states +// v v v v v v v v v v v v v v +S: A B A A B A A A A B A A A A A A A B C C A A A A A A A A A A A A B ; +// ^ ^ ^ +// LAC reallocs + +A: 'a' | /*empty*/ { printf ("inconsistent default reduction\n"); } ; +B: 'b' ; +C: /*empty*/ { printf ("consistent default reduction\n"); } ; + +%% + +void +yyerror (char const *msg) +{ + fprintf (stderr, "%s\n", msg); +} + +int +yylex (]AT_PURE_IF([[YYSTYPE *v]], [[void]])[) +{ + static char const *input = "bbbbc";]AT_PURE_IF([[ + *v = 0;]])[ + return *input++; +} + +int +main (void) +{ + yydebug = 1; + return yyparse (); +} +]]) + +AT_BISON_CHECK([[-Dparse.lac=full -Dparse.lac.es-capacity-initial=1 \ + -Dparse.lac.memory-trace=full \ + -t -o input.c input.y]], [[0]], [], +[[input.y: conflicts: 21 shift/reduce +]]) +AT_COMPILE([[input]]) +AT_PARSER_CHECK([[./input > stdout.txt 2> stderr.txt]], [[1]]) + +# Make sure syntax error doesn't forget that 'a' is expected. It would +# be forgotten without lookahead correction. +AT_CHECK([[grep 'syntax error,' stderr.txt]], [[0]], +[[syntax error, unexpected 'c', expecting 'a' or 'b' +]]) + +# Check number of default reductions in inconsistent states to be sure +# syntax error is detected before unnecessary reductions are performed. +AT_CHECK([[perl -0777 -ne 'print s/inconsistent default reduction//g;' \ + < stdout.txt || exit 77]], [[0]], [[14]]) + +# Check number of default reductions in consistent states to be sure +# it is performed before the syntax error is detected. +AT_CHECK([[perl -0777 -ne 'print s/\bconsistent default reduction//g;' \ + < stdout.txt || exit 77]], [[0]], [[2]]) + +# Check number of reallocs to be sure reallocated memory isn't somehow +# lost between LAC invocations. +AT_CHECK([[perl -0777 -ne 'print s/\(realloc//g;' < stderr.txt \ + || exit 77]], [[0]], [[3]]) + +AT_BISON_OPTION_POPDEFS +]) + +AT_LAC_CHECK([[%define api.push-pull pull]]) +AT_LAC_CHECK([[%define api.push-pull pull %define api.pure]]) +AT_LAC_CHECK([[%define api.push-pull both]]) +AT_LAC_CHECK([[%define api.push-pull both %define api.pure]]) + +m4_popdef([AT_LAC_CHECK]) + +AT_CLEANUP + + + +## ------------------------ ## +## LAC: Memory exhaustion. ## +## ------------------------ ## + +AT_SETUP([[LAC: Memory exhaustion]]) + +m4_pushdef([AT_LAC_CHECK], [ + +AT_DATA_GRAMMAR([input.y], +[[%code { + #include <stdio.h> + void yyerror (char const *); + int yylex (void); + #define YYMAXDEPTH 8 +} + +%error-verbose + +%% + +S: A A A A A A A A A ; +A: /*empty*/ | 'a' ; + +%% + +void +yyerror (char const *msg) +{ + fprintf (stderr, "%s\n", msg); +} + +int +yylex (void) +{ + static char const *input = "]$1["; + return *input++; +} + +int +main (void) +{ + yydebug = 1; + return yyparse (); +} +]]) + +AT_BISON_CHECK([[-Dparse.lac=full -Dparse.lac.es-capacity-initial=1 \ + -t -o input.c input.y]], [[0]], [], +[[input.y: conflicts: 8 shift/reduce +]]) +AT_COMPILE([[input]]) + +]) + +# Check for memory exhaustion during parsing. +AT_LAC_CHECK([[]]) +AT_PARSER_CHECK([[./input]], [[2]], [[]], +[[Starting parse +Entering state 0 +Reading a token: Now at end of input. +LAC: initial context established for $end +LAC: checking lookahead $end: R2 G3 R2 G5 R2 G6 R2 G7 R2 G8 R2 G9 R2 G10 R2 G11 R2 (max size exceeded) +memory exhausted +Cleanup: discarding lookahead token $end () +Stack now 0 +]]) + +# Induce an immediate syntax error with an undefined token, and check +# for memory exhaustion while building syntax error message. +AT_LAC_CHECK([[z]], [[0]]) +AT_PARSER_CHECK([[./input]], [[2]], [[]], +[[Starting parse +Entering state 0 +Reading a token: Next token is token $undefined () +LAC: initial context established for $undefined +LAC: checking lookahead $undefined: Always Err +Constructing syntax error message +LAC: checking lookahead $end: R2 G3 R2 G5 R2 G6 R2 G7 R2 G8 R2 G9 R2 G10 R2 G11 R2 (max size exceeded) +syntax error +memory exhausted +Cleanup: discarding lookahead token $undefined () +Stack now 0 +]]) + +m4_popdef([AT_LAC_CHECK]) + +AT_CLEANUP