X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/71cb558dfe0f9c80e697308a5084de3b9926ee9c..5407fc7d76bc0c1d15b0e281ba12ea20c77751e7:/tests/regression.at diff --git a/tests/regression.at b/tests/regression.at index c44b9f88..b9ca94c0 100644 --- a/tests/regression.at +++ b/tests/regression.at @@ -1,6 +1,6 @@ # Bison Regressions. -*- Autotest -*- -# Copyright (C) 2001-2012 Free Software Foundation, Inc. +# Copyright (C) 2001-2013 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 @@ -130,7 +130,6 @@ AT_SETUP([Early token definitions without --yacc]) AT_BISON_OPTION_PUSHDEFS AT_DATA_GRAMMAR([input.y], [[%{ -#include ]AT_YYERROR_DECLARE_EXTERN[ ]AT_YYLEX_DECLARE_EXTERN[ void print_my_token (void); @@ -141,6 +140,7 @@ void print_my_token (void); int val; }; %{ +#include void print_my_token (void) { @@ -209,7 +209,7 @@ exp: '(' exp ')' | NUM ; AT_BISON_OPTION_POPDEFS AT_BISON_CHECK([-v -o input.c input.y], 0, [], -[[input.y:6.8-14: warning: symbol "<=" used more than once as a literal string +[[input.y:6.8-14: warning: symbol "<=" used more than once as a literal string [-Wother] ]]) AT_CLEANUP @@ -263,11 +263,11 @@ AT_CHECK([cat input.output], [], 0 $accept: expr $end - 1 $@1: /* empty */ + 1 $@1: %empty 2 expr: 'a' $@1 'b' - 3 $@2: /* empty */ + 3 $@2: %empty 4 expr: $@2 'c' @@ -293,7 +293,7 @@ $@2 (9) on left: 3, on right: 4 -state 0 +State 0 0 $accept: . expr $end @@ -305,7 +305,7 @@ state 0 $@2 go to state 3 -state 1 +State 1 2 expr: 'a' . $@1 'b' @@ -314,42 +314,42 @@ state 1 $@1 go to state 4 -state 2 +State 2 0 $accept: expr . $end $end shift, and go to state 5 -state 3 +State 3 4 expr: $@2 . 'c' 'c' shift, and go to state 6 -state 4 +State 4 2 expr: 'a' $@1 . 'b' 'b' shift, and go to state 7 -state 5 +State 5 0 $accept: expr $end . $default accept -state 6 +State 6 4 expr: $@2 'c' . $default reduce using rule 4 (expr) -state 7 +State 7 2 expr: 'a' $@1 'b' . @@ -373,11 +373,14 @@ AT_DATA([input.y], %token LE 134 "<=" %left OR "<=" %% -exp: ; +exp: %empty; %% ]]) -AT_BISON_CHECK([-v -o input.c input.y]) +AT_BISON_CHECK([-v -Wall -o input.c input.y], 0, [], +[[input.y:3.1-5: warning: useless precedence and associativity for "||" [-Wprecedence] +input.y:3.1-5: warning: useless precedence and associativity for "<=" [-Wprecedence] +]]) AT_CLEANUP @@ -446,8 +449,6 @@ AT_BISON_OPTION_PUSHDEFS # Bison managed, when fed with '%token 'f' "f"' to #define 'f'! AT_DATA_GRAMMAR([input.y], [%{ -#include -#include ]AT_YYERROR_DECLARE[ ]AT_YYLEX_DECLARE[ %} @@ -464,12 +465,7 @@ exp: "a" "\\\'\?\"\a\b\f\n\r\t\v\001\201\x001\x000081??!"; %% ]AT_YYERROR_DEFINE[ ]AT_YYLEX_DEFINE([{ SPECIAL }])[ - -int -main (void) -{ - return yyparse (); -} +]AT_MAIN_DEFINE[ ]]) AT_BISON_OPTION_POPDEFS @@ -478,8 +474,16 @@ AT_BISON_OPTION_POPDEFS # C-string literal. Also notice that unnecessary escaping, such as "\?", from # the user specification is eliminated. AT_BISON_CHECK([-o input.c input.y], [[0]], [[]], -[[input.y:22.8-14: warning: symbol SPECIAL redeclared -input.y:22.8-63: warning: symbol "\\'?\"\a\b\f\n\r\t\v\001\201\001\201??!" used more than once as a literal string +[[input.y:22.8-14: warning: symbol SPECIAL redeclared [-Wother] +input.y:22.8-63: warning: symbol "\\'?\"\a\b\f\n\r\t\v\001\201\001\201??!" used more than once as a literal string [-Wother] +]]) +AT_BISON_CHECK([-fcaret -o input.c input.y], [[0]], [[]], +[[input.y:22.8-14: warning: symbol SPECIAL redeclared [-Wother] + %token SPECIAL "\\\'\?\"\a\b\f\n\r\t\v\001\201\x001\x000081??!" + ^^^^^^^ +input.y:22.8-63: warning: symbol "\\'?\"\a\b\f\n\r\t\v\001\201\001\201??!" used more than once as a literal string [-Wother] + %token SPECIAL "\\\'\?\"\a\b\f\n\r\t\v\001\201\x001\x000081??!" + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ]]) AT_COMPILE([input]) @@ -538,7 +542,7 @@ AT_SETUP([Web2c Report]) AT_KEYWORDS([report]) AT_DATA([input.y], -[[%token undef_id_tok const_id_tok +[[%token undef_id_tok const_id_tok %start CONST_DEC_PART @@ -548,12 +552,12 @@ CONST_DEC_PART: ; CONST_DEC_LIST: - CONST_DEC + CONST_DEC | CONST_DEC_LIST CONST_DEC ; CONST_DEC: - { } undef_id_tok '=' const_id_tok ';' + { } undef_id_tok '=' const_id_tok ';' ; %% ]]) @@ -569,7 +573,7 @@ AT_CHECK([cat input.output], 0, 2 CONST_DEC_LIST: CONST_DEC 3 | CONST_DEC_LIST CONST_DEC - 4 $@1: /* empty */ + 4 $@1: %empty 5 CONST_DEC: $@1 undef_id_tok '=' const_id_tok ';' @@ -598,7 +602,7 @@ $@1 (11) on left: 4, on right: 5 -state 0 +State 0 0 $accept: . CONST_DEC_PART $end @@ -610,14 +614,14 @@ state 0 $@1 go to state 4 -state 1 +State 1 0 $accept: CONST_DEC_PART . $end $end shift, and go to state 5 -state 2 +State 2 1 CONST_DEC_PART: CONST_DEC_LIST . 3 CONST_DEC_LIST: CONST_DEC_LIST . CONST_DEC @@ -629,56 +633,56 @@ state 2 $@1 go to state 4 -state 3 +State 3 2 CONST_DEC_LIST: CONST_DEC . $default reduce using rule 2 (CONST_DEC_LIST) -state 4 +State 4 5 CONST_DEC: $@1 . undef_id_tok '=' const_id_tok ';' undef_id_tok shift, and go to state 7 -state 5 +State 5 0 $accept: CONST_DEC_PART $end . $default accept -state 6 +State 6 3 CONST_DEC_LIST: CONST_DEC_LIST CONST_DEC . $default reduce using rule 3 (CONST_DEC_LIST) -state 7 +State 7 5 CONST_DEC: $@1 undef_id_tok . '=' const_id_tok ';' '=' shift, and go to state 8 -state 8 +State 8 5 CONST_DEC: $@1 undef_id_tok '=' . const_id_tok ';' const_id_tok shift, and go to state 9 -state 9 +State 9 5 CONST_DEC: $@1 undef_id_tok '=' const_id_tok . ';' ';' shift, and go to state 10 -state 10 +State 10 5 CONST_DEC: $@1 undef_id_tok '=' const_id_tok ';' . @@ -717,7 +721,7 @@ AT_KEYWORDS([report]) AT_DATA([input.y], [[%% statement: struct_stat; -struct_stat: /* empty. */ | if else; +struct_stat: %empty | if else; if: "if" "const" "then" statement; else: "else" statement; %% @@ -759,15 +763,6 @@ AT_CHECK([[cat tables.c]], 0, 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, 5, 6 }; -static const yytype_uint8 yyprhs[] = -{ - 0, 0, 3, 5, 6, 9, 14 -}; -static const yytype_int8 yyrhs[] = -{ - 8, 0, -1, 9, -1, -1, 10, 11, -1, 3, - 4, 5, 8, -1, 6, 8, -1 -}; static const yytype_uint8 yyrline[] = { 0, 2, 2, 3, 3, 4, 5 @@ -781,32 +776,24 @@ static const yytype_uint16 yytoknum[] = { 0, 256, 257, 258, 259, 260, 261 }; -static const yytype_uint8 yyr1[] = -{ - 0, 7, 8, 9, 9, 10, 11 -}; -static const yytype_uint8 yyr2[] = +static const yytype_int8 yypact[] = { - 0, 2, 1, 0, 2, 4, 2 + -2, -1, 4, -8, 0, 2, -8, -2, -8, -2, + -8, -8 }; static const yytype_uint8 yydefact[] = { 3, 0, 0, 2, 0, 0, 1, 3, 4, 3, 6, 5 }; -static const yytype_int8 yydefgoto[] = -{ - -1, 2, 3, 4, 8 -}; -static const yytype_int8 yypact[] = -{ - -2, -1, 4, -8, 0, 2, -8, -2, -8, -2, - -8, -8 -}; static const yytype_int8 yypgoto[] = { -8, -7, -8, -8, -8 }; +static const yytype_int8 yydefgoto[] = +{ + -1, 2, 3, 4, 8 +}; static const yytype_uint8 yytable[] = { 10, 1, 11, 5, 6, 0, 7, 9 @@ -820,6 +807,14 @@ static const yytype_uint8 yystos[] = 0, 3, 8, 9, 10, 4, 0, 6, 11, 5, 8, 8 }; +static const yytype_uint8 yyr1[] = +{ + 0, 7, 8, 9, 9, 10, 11 +}; +static const yytype_uint8 yyr2[] = +{ + 0, 2, 1, 0, 2, 4, 2 +}; ]]) AT_CLEANUP @@ -845,7 +840,6 @@ m4_define([_AT_DATA_DANCER_Y], } $1 %token ARROW INVALID NUMBER STRING DATA -%defines %verbose %error-verbose /* Grammar follows */ @@ -875,7 +869,7 @@ type: DATA | INVALID ; -body: /* empty */ +body: %empty | body member ; @@ -889,23 +883,7 @@ member: STRING %% ]AT_YYERROR_DEFINE[ ]AT_YYLEX_DEFINE([":"])[ -]AT_LALR1_CC_IF( -[int -yyparse () -{ - yy::parser parser; -#if YYDEBUG - parser.set_debug_level (YYDEBUG); -#endif - return parser.parse (); -} -])[ - -int -main (void) -{ - return yyparse (); -} +]AT_MAIN_DEFINE[ ]]) ])# _AT_DATA_DANCER_Y @@ -939,21 +917,19 @@ AT_CHECK_DANCER([%skeleton "lalr1.cc"]) # -------------------------------- m4_define([_AT_DATA_EXPECT2_Y], [AT_DATA_GRAMMAR([expect2.y], -[[%{ -static int yylex (]AT_LALR1_CC_IF([int *], [void])); -AT_LALR1_CC_IF([], -[[#include -#include +[%{ +static int yylex (AT_LALR1_CC_IF([int *], [void])); +AT_LALR1_CC_IF([[#include ]], +[[ ]AT_YYERROR_DECLARE])[ %} $1 -%defines %error-verbose %token A 1000 %token B %% -program: /* empty */ +program: %empty | program e ';' | program error ';'; @@ -984,12 +960,7 @@ yylex (]AT_LALR1_CC_IF([int *lval], [void])[) assert (toknum < sizeof tokens / sizeof *tokens); return tokens[toknum++]; } - -int -main (void) -{ - return yyparse (); -} +]AT_MAIN_DEFINE[ ]]) ])# _AT_DATA_EXPECT2_Y @@ -1023,22 +994,20 @@ AT_SETUP([Braced code in declaration in rules section]) # Bison once mistook braced code in a declaration in the rules section to be a # rule action. -AT_BISON_OPTION_PUSHDEFS +AT_BISON_OPTION_PUSHDEFS([%debug]) AT_DATA_GRAMMAR([input.y], [[%{ -#include ]AT_YYERROR_DECLARE[ ]AT_YYLEX_DECLARE[ %} - +%debug %error-verbose - %% start: { printf ("Bison would once convert this action to a midrule because of the" - " subsequent braced code.\n"); + " subsequent braced code.\n"); } ; @@ -1048,19 +1017,13 @@ start: %% ]AT_YYERROR_DEFINE[ ]AT_YYLEX_DEFINE(["a"])[ - -int -main (void) -{ - yydebug = 1; - return !yyparse (); -} +]AT_MAIN_DEFINE[ ]]) AT_BISON_OPTION_POPDEFS -AT_BISON_CHECK([-t -o input.c input.y]) +AT_BISON_CHECK([-o input.c input.y]) AT_COMPILE([input]) -AT_PARSER_CHECK([./input], 0, +AT_PARSER_CHECK([./input --debug], 1, [[Bison would once convert this action to a midrule because of the subsequent braced code. ]], [[Starting parse @@ -1099,7 +1062,7 @@ start: 'a' "A" 'b'; %token 'a' "A"; ]]) -AT_BISON_CHECK([-t -o input.c input.y]) +AT_BISON_CHECK([-o input.c input.y]) AT_CLEANUP @@ -1125,8 +1088,8 @@ a: 'a' ; ]]) AT_BISON_CHECK([[--report=all input.y]]) -AT_CHECK([[sed -n '/^state 1$/,/^state 2$/p' input.output]], [[0]], -[[state 1 +AT_CHECK([[sed -n '/^State 1$/,/^State 2$/p' input.output]], [[0]], +[[State 1 2 start: 'a' . a 'a' 3 a: . 'a' @@ -1139,7 +1102,7 @@ AT_CHECK([[sed -n '/^state 1$/,/^state 2$/p' input.output]], [[0]], a go to state 5 -state 2 +State 2 ]]) AT_CLEANUP @@ -1156,11 +1119,10 @@ AT_SETUP([[Token number in precedence declaration]]) # we lost this in Bison 1.50. AT_BISON_OPTION_PUSHDEFS AT_DATA_GRAMMAR([input.y], -[[%{ - #include +[[%code { ]AT_YYERROR_DECLARE[ ]AT_YYLEX_DECLARE[ -%} +} %error-verbose %right END 0 @@ -1181,21 +1143,17 @@ sr_conflict: ]AT_YYERROR_DEFINE[ ]AT_YYLEX_DEFINE([{ 1, 2, 3, 0 }])[ - -int -main (void) -{ - return yyparse (); -} +]AT_MAIN_DEFINE[ ]]) -AT_BISON_OPTION_POPDEFS -AT_BISON_CHECK([[-o input.c input.y]], [[0]],, -[[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_BISON_CHECK([[-Wall -o input.c input.y]], [[0]],, +[[input.y:24.5-19: warning: rule useless in parser due to conflicts [-Wother] +input.y:28.5-19: warning: rule useless in parser due to conflicts [-Wother] +input.y:18.1-5: warning: useless precedence and associativity for TK1 [-Wprecedence] ]]) AT_COMPILE([[input]]) AT_PARSER_CHECK([[./input]]) +AT_BISON_OPTION_POPDEFS AT_CLEANUP @@ -1210,8 +1168,9 @@ AT_CLEANUP AT_SETUP([[parse-gram.y: LALR = IELR]]) -# Avoid differences in synclines by telling bison that the output files -# have the same name. +# Avoid tests/bison's dark magic by processing a local copy of the +# grammar. Avoid differences in synclines by telling bison that the +# output files have the same name. [cp $abs_top_srcdir/src/parse-gram.y input.y] AT_BISON_CHECK([[-o input.c -Dlr.type=lalr input.y]]) [mv input.c lalr.c] @@ -1225,22 +1184,21 @@ AT_CLEANUP -## --------------------------------------- ## -## %error-verbose and YYSTACK_USE_ALLOCA. ## -## --------------------------------------- ## +## -------------------------------------------- ## +## parse.error=verbose and YYSTACK_USE_ALLOCA. ## +## -------------------------------------------- ## -AT_SETUP([[%error-verbose and YYSTACK_USE_ALLOCA]]) +AT_SETUP([[parse.error=verbose and YYSTACK_USE_ALLOCA]]) AT_BISON_OPTION_PUSHDEFS AT_DATA_GRAMMAR([input.y], [[%code { - #include ]AT_YYERROR_DECLARE[ ]AT_YYLEX_DECLARE[ #define YYSTACK_USE_ALLOCA 1 } -%error-verbose +%define parse.error verbose %% @@ -1273,15 +1231,11 @@ syntax_error: %% ]AT_YYERROR_DEFINE[ -/* Induce two syntax error messages (which requires full error - recovery by shifting 3 tokens) in order to detect any loss of the - reallocated buffer. */ + /* Induce two syntax error messages (which requires full error + recovery by shifting 3 tokens) in order to detect any loss of the + reallocated buffer. */ ]AT_YYLEX_DEFINE(["abc"])[ -int -main (void) -{ - return yyparse (); -} +]AT_MAIN_DEFINE[ ]]) AT_BISON_OPTION_POPDEFS @@ -1296,9 +1250,9 @@ AT_CLEANUP -## ------------------------- ## -## %error-verbose overflow. ## -## ------------------------- ## +## ------------------------------ ## +## parse.error=verbose overflow. ## +## ------------------------------ ## # Imagine the case where YYSTACK_ALLOC_MAXIMUM = YYSIZE_MAXIMUM and an # invocation of yysyntax_error has caused yymsg_alloc to grow to exactly @@ -1308,11 +1262,11 @@ AT_CLEANUP # 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_SETUP([[parse.error=verbose overflow]]) + AT_BISON_OPTION_PUSHDEFS AT_DATA_GRAMMAR([input.y], [[%code { - #include ]AT_YYERROR_DECLARE[ ]AT_YYLEX_DECLARE[ @@ -1333,7 +1287,7 @@ AT_DATA_GRAMMAR([input.y], #define YYMAXDEPTH 100 } -%error-verbose +%define parse.error verbose %% @@ -1381,8 +1335,8 @@ syntax_error2: %% ]AT_YYERROR_DEFINE[ -/* Induce two syntax error messages (which requires full error - recovery by shifting 3 tokens). */ + /* Induce two syntax error messages (which requires full error + recovery by shifting 3 tokens). */ ]AT_YYLEX_DEFINE(["abc"])[ int main (void) @@ -1422,17 +1376,16 @@ AT_SETUP([[LAC: Exploratory stack]]) m4_pushdef([AT_LAC_CHECK], [ -AT_BISON_OPTION_PUSHDEFS([$1]) +AT_BISON_OPTION_PUSHDEFS([%debug $1]) AT_DATA_GRAMMAR([input.y], [[%code { - #include ]AT_YYERROR_DECLARE[ int yylex (]AT_PURE_IF([[YYSTYPE *]], [[void]])[); } - +%debug ]$1[ -%error-verbose +%define parse.error verbose %token 'c' %% @@ -1457,21 +1410,16 @@ yylex (]AT_PURE_IF([[YYSTYPE *v]], [[void]])[) return *input++; } -int -main (void) -{ - yydebug = 1; - return yyparse (); -} +]AT_MAIN_DEFINE[ ]]) 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 + -o input.c input.y]], [[0]], [], +[[input.y: warning: 21 shift/reduce conflicts [-Wconflicts-sr] ]]) AT_COMPILE([[input]]) -AT_PARSER_CHECK([[./input > stdout.txt 2> stderr.txt]], [[1]]) +AT_PARSER_CHECK([[./input --debug > stdout.txt 2> stderr.txt]], [[1]]) # Make sure syntax error doesn't forget that 'a' is expected. It would # be forgotten without lookahead correction. @@ -1515,15 +1463,14 @@ AT_CLEANUP AT_SETUP([[LAC: Memory exhaustion]]) m4_pushdef([AT_LAC_CHECK], -[AT_BISON_OPTION_PUSHDEFS +[AT_BISON_OPTION_PUSHDEFS([%debug]) AT_DATA_GRAMMAR([input.y], [[%code { - #include ]AT_YYERROR_DECLARE[ ]AT_YYLEX_DECLARE[ #define YYMAXDEPTH 8 } - +%debug %error-verbose %% @@ -1534,17 +1481,12 @@ A: /*empty*/ | 'a' ; %% ]AT_YYERROR_DEFINE[ ]AT_YYLEX_DEFINE(["$1"])[ -int -main (void) -{ - yydebug = 1; - return yyparse (); -} +]AT_MAIN_DEFINE[ ]]) 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 + -o input.c input.y]], [[0]], [], +[[input.y: warning: 8 shift/reduce conflicts [-Wconflicts-sr] ]]) AT_COMPILE([[input]]) AT_BISON_OPTION_POPDEFS @@ -1552,7 +1494,7 @@ AT_BISON_OPTION_POPDEFS # Check for memory exhaustion during parsing. AT_LAC_CHECK([]) -AT_PARSER_CHECK([[./input]], [[2]], [], +AT_PARSER_CHECK([[./input --debug]], [[2]], [], [[Starting parse Entering state 0 Reading a token: Now at end of input. @@ -1566,7 +1508,7 @@ 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]], [], +AT_PARSER_CHECK([[./input --debug]], [[2]], [], [[Starting parse Entering state 0 Reading a token: Next token is token $undefined () @@ -1597,47 +1539,34 @@ AT_CLEANUP m4_pushdef([AT_TEST], [AT_SETUP([[Lex and parse params: $1]]) -AT_BISON_OPTION_PUSHDEFS([%locations %skeleton $1]) +## FIXME: Improve parsing of parse-param. +AT_BISON_OPTION_PUSHDEFS([%locations %skeleton "$1" %parse-param { int x } %parse-param { int y }]) -## FIXME: Improve parsing of parse-param and use the generated -## yyerror. AT_DATA_GRAMMAR([input.y], -[[%defines -%locations -%skeleton $1 +[[%locations +%skeleton "$1" %union { int ival; } %parse-param { int x } // Spaces, tabs, and new lines. %parse-param { @&t@ - int y @&t@ +@tb@ int y@tb@ @&t@ @&t@ @&t@ } %{ -#include -#include - -]AT_SKEL_CC_IF([], [[ -static -void -yyerror (int x, int y, const char *msg) -{ - fprintf (stderr, "x: %d, y: %d, %s\n", x, y, msg); -}]])[ - + ]AT_YYERROR_DECLARE[ ]AT_YYLEX_DECLARE[ %} %% exp: 'a' { fprintf (stdout, "x: %d, y: %d\n", x, y); }; %% +]AT_YYERROR_DEFINE[ ]AT_YYLEX_DEFINE(["a"])[ ]AT_SKEL_CC_IF( -[AT_YYERROR_DEFINE - -int +[int yyparse (int x, int y) { yy::parser parser(x, y); @@ -1648,12 +1577,12 @@ yyparse (int x, int y) int main (void) { - return !!yyparse(1, 2); + return yyparse(1, 2); } ]]) AT_FULL_COMPILE([input]) -AT_CHECK([./input], 0, [[x: 1, y: 2 +AT_PARSER_CHECK([./input], 0, [[x: 1, y: 2 ]]) AT_BISON_OPTION_POPDEFS @@ -1661,9 +1590,39 @@ AT_CLEANUP ]) ## FIXME: test Java, and iterate over skeletons. -AT_TEST("yacc.c") -AT_TEST("glr.c") -AT_TEST("lalr1.cc") -AT_TEST("glr.cc") +AT_TEST([yacc.c]) +AT_TEST([glr.c]) +AT_TEST([lalr1.cc]) +AT_TEST([glr.cc]) m4_popdef([AT_TEST]) + + +## ----------------------- ## +## stdio.h is not needed. ## +## ----------------------- ## + +# At some point, by accident, yy_location_print_ was using fprintf and +# FILE which are from stdio.h, which we do not require. +AT_SETUP([[stdio.h is not needed]]) + +AT_BISON_OPTION_PUSHDEFS + +AT_DATA_GRAMMAR([input.y], +[[%locations +%code +{ + static int yylex (void) { return 0; } + static void yyerror (const char* msg) { (void) msg; } +} +%% +exp: {} +%% +]AT_MAIN_DEFINE[ +]]) + +AT_FULL_COMPILE([input]) + +AT_BISON_OPTION_POPDEFS + +AT_CLEANUP