X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/ae952af2272fd49967349ca7280fec8c3937fb0f..e4f0316ae096a728e62032fa33bc6c42cf4b6455:/tests/glr-regression.at diff --git a/tests/glr-regression.at b/tests/glr-regression.at index c9b745bc..9e3cec79 100644 --- a/tests/glr-regression.at +++ b/tests/glr-regression.at @@ -972,7 +972,7 @@ AT_DATA_GRAMMAR([glr-regr12.y], start: alt1 %dprec 1 | alt2 %dprec 2 - ; + ; alt1: PARENT_RHS_AFTER { @@ -1547,7 +1547,7 @@ yyerror (char const *msg) static int yylex (void) { - static const char *input = "ab"; + static char const *input = "ab"; if (*input == 'b') lookahead_value = 1; return *input++; @@ -1576,3 +1576,88 @@ AT_CHECK([[./glr-regr16]], 0, [], ]) AT_CLEANUP + + +## ------------------------------------------------------------------------- ## +## Uninitialized location when reporting ambiguity. ## +## ------------------------------------------------------------------------- ## + +AT_SETUP([Uninitialized location when reporting ambiguity]) +AT_DATA_GRAMMAR([glr-regr17.y], +[[ +%glr-parser +%locations +%pure-parser +%error-verbose + +%union { int dummy; } + +%{ + static void yyerror (YYLTYPE *, char const *); + static int yylex (YYSTYPE *, YYLTYPE *); +%} + +%initial-action { + @$.first_line = 1; + @$.first_column = 1; + @$.last_line = 1; + @$.last_column = 1; +} + +%% + +/* Tests the case of an empty RHS that has inherited the location of the + previous nonterminal, which is unresolved. That location is reported as the + last position of the ambiguity. */ +start: ambig1 empty1 | ambig2 empty2 ; + +/* Tests multiple levels of yyresolveLocations recursion. */ +ambig1: sub_ambig1 | sub_ambig2 ; +ambig2: sub_ambig1 | sub_ambig2 ; + +/* Tests the case of a non-empty RHS as well as the case of an empty RHS that + has inherited the initial location. The empty RHS's location is reported as + the first position in the ambiguity. */ +sub_ambig1: empty1 'a' 'b' ; +sub_ambig2: empty2 'a' 'b' ; +empty1: ; +empty2: ; + +%% + +static void +yyerror (YYLTYPE *locp, char const *msg) +{ + fprintf (stderr, "Error at %d.%d-%d.%d: %s.\n", locp->first_line, + locp->first_column, locp->last_line, locp->last_column, msg); +} + +static int +yylex (YYSTYPE *lvalp, YYLTYPE *llocp) +{ + static char const input[] = "ab"; + static char const *inputp = input; + lvalp->dummy = 0; + llocp->first_line = llocp->last_line = 2; + llocp->first_column = inputp - input + 1; + llocp->last_column = llocp->first_column + 1; + return *inputp++; +} + +int +main (void) +{ + return yyparse () != 1; +} +]]) + +AT_CHECK([[bison -o glr-regr17.c glr-regr17.y]], 0, [], +[glr-regr17.y: conflicts: 3 reduce/reduce +]) +AT_COMPILE([glr-regr17]) + +AT_CHECK([[./glr-regr17]], 0, [], +[Error at 1.1-2.3: syntax is ambiguous. +]) + +AT_CLEANUP