diff options
-rw-r--r-- | NEWS | 112 | ||||
-rw-r--r-- | build-aux/snippet/.gitignore | 4 | ||||
-rw-r--r-- | data/yacc.c | 15 | ||||
-rw-r--r-- | lib/glthread/.gitignore | 3 | ||||
-rw-r--r-- | src/symtab.c | 1 | ||||
-rw-r--r-- | tests/actions.at | 139 | ||||
-rw-r--r-- | tests/calc.at | 8 | ||||
-rw-r--r-- | tests/conflicts.at | 4 | ||||
-rw-r--r-- | tests/cxx-type.at | 10 | ||||
-rw-r--r-- | tests/glr-regression.at | 52 | ||||
-rw-r--r-- | tests/headers.at | 4 | ||||
-rw-r--r-- | tests/input.at | 10 | ||||
-rw-r--r-- | tests/local.at | 85 | ||||
-rw-r--r-- | tests/named-refs.at | 6 | ||||
-rw-r--r-- | tests/regression.at | 18 | ||||
-rw-r--r-- | tests/torture.at | 30 |
16 files changed, 269 insertions, 232 deletions
@@ -113,19 +113,33 @@ GNU Bison NEWS * Noteworthy changes in release ?.? (????-??-??) [?] -** Future changes: +** Future changes + + The next major release of Bison will drop support for the following + deprecated features. Please report disagreements to bug-bison@gnu.org. + +*** K&C parsers + + Support for generating parsers in K&R C will be removed. Parsers + generated for C supprt ISO C90, and are tested with ISO C99 and ISO C11 + compilers. + +*** Deprecated features - The next major release will drop support for generating parsers in K&R C, - and remove the definitions of yystype and yyltype (removal announced since - Bison 1.875). YYPARSE_PARAM and YYLEX_PARAM, which were deprecated in - favor of %parse-param and %lex-param (introduced in Bison 1.875 too), will - no longer be supported. + The definitions of yystype and yyltype will be removed, as announced since + Bison 1.875. Use YYSTYPE and YYLTYPE only. -** The generated header is included (yacc.c) + YYPARSE_PARAM and YYLEX_PARAM, which were deprecated in favor of + %parse-param and %lex-param (introduced in Bison 1.875), will no longer be + supported. + +*** The generated header will be included (yacc.c) Instead of duplicating the content of the generated header (definition of - YYSTYPE, yyltype etc.), the generated parser now includes it, as was - already the case for GLR or C++ parsers. + YYSTYPE, yyparse declaration etc.), the generated parser will include it, + as is already the case for GLR or C++ parsers. This change is deferred + because existing versions of ylwrap (e.g., Automake 1.12.1) do not support + it. ** Headers (yacc.c, glr.c, glr.cc) @@ -191,10 +205,10 @@ GNU Bison NEWS The header files such as "parser.hh", "location.hh", etc. used a constant name for preprocessor guards, for instance: - #ifndef BISON_LOCATION_HH - # define BISON_LOCATION_HH - ... - #endif // !BISON_LOCATION_HH + #ifndef BISON_LOCATION_HH + # define BISON_LOCATION_HH + ... + #endif // !BISON_LOCATION_HH The inclusion guard is now computed from "PREFIX/FILE-NAME", where lower case characters are converted to upper case, and series of @@ -202,10 +216,10 @@ GNU Bison NEWS With "bison -o lang++/parser.cc", "location.hh" would now include: - #ifndef YY_LANG_LOCATION_HH - # define YY_LANG_LOCATION_HH - ... - #endif // !YY_LANG_LOCATION_HH + #ifndef YY_LANG_LOCATION_HH + # define YY_LANG_LOCATION_HH + ... + #endif // !YY_LANG_LOCATION_HH *** C++ locations: @@ -436,33 +450,33 @@ GNU Bison NEWS to use it. If, for instance, your location structure has "first" and "last" members, instead of - # define YYLLOC_DEFAULT(Current, Rhs, N) \ - do \ - if (N) \ - { \ - (Current).first = (Rhs)[1].location.first; \ - (Current).last = (Rhs)[N].location.last; \ - } \ - else \ - { \ - (Current).first = (Current).last = (Rhs)[0].location.last; \ - } \ - while (false) + # define YYLLOC_DEFAULT(Current, Rhs, N) \ + do \ + if (N) \ + { \ + (Current).first = (Rhs)[1].location.first; \ + (Current).last = (Rhs)[N].location.last; \ + } \ + else \ + { \ + (Current).first = (Current).last = (Rhs)[0].location.last; \ + } \ + while (false) use: - # define YYLLOC_DEFAULT(Current, Rhs, N) \ - do \ - if (N) \ - { \ - (Current).first = YYRHSLOC (Rhs, 1).first; \ - (Current).last = YYRHSLOC (Rhs, N).last; \ - } \ - else \ - { \ - (Current).first = (Current).last = YYRHSLOC (Rhs, 0).last; \ - } \ - while (false) + # define YYLLOC_DEFAULT(Current, Rhs, N) \ + do \ + if (N) \ + { \ + (Current).first = YYRHSLOC (Rhs, 1).first; \ + (Current).last = YYRHSLOC (Rhs, N).last; \ + } \ + else \ + { \ + (Current).first = (Current).last = YYRHSLOC (Rhs, 0).last; \ + } \ + while (false) ** YYLLOC_DEFAULT in C++: @@ -1462,9 +1476,9 @@ GNU Bison NEWS ** Incorrect "Token not used" On a grammar such as - %token useless useful - %% - exp: '0' %prec useful; + %token useless useful + %% + exp: '0' %prec useful; where a token was used to set the precedence of the last rule, bison reported both "useful" and "useless" as useless tokens. @@ -1483,9 +1497,9 @@ GNU Bison NEWS the user symbol is used in the reports, the graphs, and the verbose error messages instead of "$end", which remains being the default. For instance - %token MYEOF 0 + %token MYEOF 0 or - %token MYEOF 0 "end of file" + %token MYEOF 0 "end of file" ** Semantic parser This old option, which has been broken for ages, is removed. @@ -1521,9 +1535,9 @@ GNU Bison NEWS Previous versions don't complain when there is a type clash on the default action if the rule has a mid-rule action, such as in: - %type <foo> bar - %% - bar: '0' {} '0'; + %type <foo> bar + %% + bar: '0' {} '0'; This is fixed. diff --git a/build-aux/snippet/.gitignore b/build-aux/snippet/.gitignore new file mode 100644 index 00000000..2a3a2f91 --- /dev/null +++ b/build-aux/snippet/.gitignore @@ -0,0 +1,4 @@ +/_Noreturn.h +/arg-nonnull.h +/c++defs.h +/warn-on-use.h diff --git a/data/yacc.c b/data/yacc.c index 0c442ae0..b57794f0 100644 --- a/data/yacc.c +++ b/data/yacc.c @@ -229,6 +229,8 @@ m4_define([b4_declare_parser_state_variables], [b4_pure_if([[ # b4_declare_yyparse_push_ # ------------------------ +# Declaration of yyparse (and dependencies) when using the push parser +# (including in pull mode). m4_define([b4_declare_yyparse_push_], [[typedef struct ]b4_prefix[pstate ]b4_prefix[pstate; enum { YYPUSH_MORE = 4 }; @@ -274,12 +276,14 @@ m4_define([b4_declare_yyparse], # Declaration that might either go into the header (if --defines) # or open coded in the parser body. m4_define([b4_shared_declarations], -[b4_declare_yydebug[ +[b4_cpp_guard_open([b4_spec_defines_file])[ +]b4_declare_yydebug[ ]b4_percent_code_get([[requires]])[ ]b4_token_enums_defines(b4_tokens)[ ]b4_declare_yylstype[ ]b4_declare_yyparse[ -]b4_percent_code_get([[provides]])[]dnl +]b4_percent_code_get([[provides]])[ +]b4_cpp_guard_close([b4_spec_defines_file])[]dnl ]) ## -------------- ## @@ -338,8 +342,9 @@ m4_if(b4_prefix, [yy], [], # define YYTOKEN_TABLE ]b4_token_table[ #endif -]b4_defines_if([[#include "@basename(]b4_spec_defines_file[@)"]], - [b4_shared_declarations])[ +/* In a future release of Bison, this section will be replaced + by #include "@basename(]b4_spec_defines_file[@)". */ +]b4_shared_declarations[ /* Copy the second part of user declarations. */ ]b4_user_post_prologue @@ -1997,9 +2002,7 @@ b4_defines_if( [@output(b4_spec_defines_file@)@ b4_copyright([Bison interface for Yacc-like parsers in C])[ -]b4_cpp_guard_open([b4_spec_defines_file])[ ]b4_shared_declarations[ -]b4_cpp_guard_close([b4_spec_defines_file])[ ]])dnl b4_defines_if m4_divert_pop(0) m4_popdef([b4_copyright_years]) diff --git a/lib/glthread/.gitignore b/lib/glthread/.gitignore new file mode 100644 index 00000000..e0605e15 --- /dev/null +++ b/lib/glthread/.gitignore @@ -0,0 +1,3 @@ +/lock.c +/lock.h +/threadlib.c diff --git a/src/symtab.c b/src/symtab.c index c65bd201..124da372 100644 --- a/src/symtab.c +++ b/src/symtab.c @@ -1009,4 +1009,3 @@ default_tagless_code_props_set (code_props_type kind, code_props const *code) } default_tagless_code_props[kind] = *code; } - diff --git a/tests/actions.at b/tests/actions.at index 4af56153..1f05eb8e 100644 --- a/tests/actions.at +++ b/tests/actions.at @@ -174,11 +174,12 @@ AT_CLEANUP ## Printers and Destructors. ## ## -------------------------- ## -# _AT_CHECK_PRINTER_AND_DESTRUCTOR($1, $2, $3, $4, BISON-DIRECTIVE, UNION-FLAG) -# ----------------------------------------------------------------------------- +# _AT_CHECK_PRINTER_AND_DESTRUCTOR($1, $2, $3, $4, +# BISON-DIRECTIVE, UNION-FLAG) +# ------------------------------------------------------------- m4_define([_AT_CHECK_PRINTER_AND_DESTRUCTOR], [# Make sure complex $n work. -m4_if([$1$2$3], $[1]$[2]$[3], [], +m4_if([$1$2$3$4], $[1]$[2]$[3]$[4], [], [m4_fatal([$0: Invalid arguments: $@])])dnl # Be sure to pass all the %directives to this macro to have correct @@ -193,13 +194,16 @@ AT_DATA_GRAMMAR([[input.y]], #define YYINITDEPTH 10 #define YYMAXDEPTH 10 -]AT_LALR1_CC_IF( - [#define RANGE(Location) (Location).begin.line, (Location).end.line], - [#define RANGE(Location) (Location).first_line, (Location).last_line]) -[} +#define RANGE(Location) ]AT_LALR1_CC_IF([(Location).begin.line, (Location).end.line], + [(Location).first_line, (Location).last_line])[ + +/* Display the symbol type Symbol. */ +#define V(Symbol, Value, Location, Sep) \ + fprintf (stderr, #Symbol " (%d@%d-%d)" Sep, Value, RANGE(Location)) +} -$5] -m4_ifval([$6], [%union +$5 +]m4_ifval([$6], [%union { int ival; }]) @@ -221,28 +225,28 @@ AT_LALR1_CC_IF([typedef yy::location YYLTYPE;])[ input line thing 'x' 'y' %destructor - { printf ("Freeing nterm input (%d@%d-%d)\n", $$, RANGE (@$)); } + { fprintf (stderr, "Freeing nterm input (%d@%d-%d)\n", $$, RANGE (@$)); } input %destructor - { printf ("Freeing nterm line (%d@%d-%d)\n", $$, RANGE (@$)); } + { fprintf (stderr, "Freeing nterm line (%d@%d-%d)\n", $$, RANGE (@$)); } line %destructor - { printf ("Freeing nterm thing (%d@%d-%d)\n", $$, RANGE (@$)); } + { fprintf (stderr, "Freeing nterm thing (%d@%d-%d)\n", $$, RANGE (@$)); } thing %destructor - { printf ("Freeing token 'x' (%d@%d-%d)\n", $$, RANGE (@$)); } + { fprintf (stderr, "Freeing token 'x' (%d@%d-%d)\n", $$, RANGE (@$)); } 'x' %destructor - { printf ("Freeing token 'y' (%d@%d-%d)\n", $$, RANGE (@$)); } + { fprintf (stderr, "Freeing token 'y' (%d@%d-%d)\n", $$, RANGE (@$)); } 'y' %token END 0 %destructor - { printf ("Freeing token END (%d@%d-%d)\n", $$, RANGE (@$)); } + { fprintf (stderr, "Freeing token END (%d@%d-%d)\n", $$, RANGE (@$)); } END %% @@ -257,14 +261,15 @@ input: /* Nothing. */ { $$ = 0; - printf ("input (%d@%d-%d): /* Nothing */\n", $$, RANGE (@$)); + V(input, $$, @$, ": /* Nothing */\n"); } | line input /* Right recursive to load the stack so that popping at END can be exercised. */ { $$ = 2; - printf ("input (%d@%d-%d): line (%d@%d-%d) input (%d@%d-%d)\n", - $$, RANGE (@$), $1, RANGE (@1), $2, RANGE (@2)); + V(input, $$, @$, ": "); + V(line, $1, @1, " "); + V(input, $2, @2, "\n"); } ; @@ -272,28 +277,36 @@ line: thing thing thing ';' { $$ = $1; - printf ("line (%d@%d-%d): thing (%d@%d-%d) thing (%d@%d-%d) thing (%d@%d-%d) ';' (%d@%d-%d)\n", - $$, RANGE (@$), $1, RANGE (@1), $2, RANGE (@2), - $3, RANGE (@3), $4, RANGE (@4)); + V(line, $$, @$, ": "); + V(thing, $1, @1, " "); + V(thing, $2, @2, " "); + V(thing, $3, @3, " "); + V(;, $4, @4, "\n"); } | '(' thing thing ')' { $$ = $1; - printf ("line (%d@%d-%d): '(' (%d@%d-%d) thing (%d@%d-%d) thing (%d@%d-%d) ')' (%d@%d-%d)\n", - $$, RANGE (@$), $1, RANGE (@1), $2, RANGE (@2), - $3, RANGE (@3), $4, RANGE (@4)); + V(line, $$, @$, ": "); + V('(', $1, @1, " "); + V(thing, $2, @2, " "); + V(thing, $3, @3, " "); + V(')', $4, @4, "\n"); } | '(' thing ')' { $$ = $1; - printf ("line (%d@%d-%d): '(' (%d@%d-%d) thing (%d@%d-%d) ')' (%d@%d-%d)\n", - $$, RANGE (@$), $1, RANGE (@1), $2, RANGE (@2), $3, RANGE (@3)); + V(line, $$, @$, ": "); + V('(', $1, @1, " "); + V(thing, $2, @2, " "); + V(')', $3, @3, "\n"); } | '(' error ')' { $$ = -1; - printf ("line (%d@%d-%d): '(' (%d@%d-%d) error (@%d-%d) ')' (%d@%d-%d)\n", - $$, RANGE (@$), $1, RANGE (@1), RANGE (@2), $3, RANGE (@3)); + V(line, $$, @$, ": "); + V('(', $1, @1, " "); + fprintf (stderr, "error (@%d-%d) ", RANGE(@2)); + V(')', $3, @3, "\n"); } ; @@ -301,14 +314,16 @@ thing: 'x' { $$ = $1; - printf ("thing (%d@%d-%d): 'x' (%d@%d-%d)\n", - $$, RANGE (@$), $1, RANGE (@1)); + V(thing, $$, @$, ": "); + V('x', $1, @1, "\n"); } ; %% /* Alias to ARGV[1]. */ const char *source = YY_NULL; +]AT_YYERROR_DEFINE[ + static ]AT_YYLEX_PROTOTYPE[ { @@ -316,33 +331,18 @@ static int c = ]AT_VAL[]m4_ifval([$6], [.ival])[ = counter++; /* As in BASIC, line numbers go from 10 to 10. */ -]AT_LALR1_CC_IF( -[ AT_LOC.begin.line = AT_LOC.begin.column = 10 * c; - AT_LOC.end.line = AT_LOC.end.column = AT_LOC.begin.line + 9; -], -[ AT_LOC.first_line = AT_LOC.first_column = 10 * c; - AT_LOC.last_line = AT_LOC.last_column = AT_LOC.first_line + 9; -])[ - - if (! (0 <= c && c <= strlen (source))) - abort (); + ]AT_LOC_FIRST_LINE[ = ]AT_LOC_FIRST_COLUMN[ = 10 * c; + ]AT_LOC_LAST_LINE[ = ]AT_LOC_LAST_COLUMN[ = ]AT_LOC_FIRST_LINE[ + 9; + assert (0 <= c && c <= strlen (source)); if (source[c]) - printf ("sending: '%c'", source[c]); + fprintf (stderr, "sending: '%c'", source[c]); else - printf ("sending: END"); - printf (" (%d@%d-%d)\n", c, RANGE (]AT_LOC[)); + fprintf (stderr, "sending: END"); + fprintf (stderr, " (%d@%d-%d)\n", c, RANGE (]AT_LOC[)); return source[c]; } - ]AT_LALR1_CC_IF( -[/* A C++ error reporting function. */ -void -yy::parser::error (const location& l, const std::string& m) -{ - printf ("%d-%d: %s\n", RANGE (l), m.c_str()); -} - -static bool yydebug; +[static bool yydebug; int yyparse () { @@ -350,12 +350,7 @@ yyparse () parser.set_debug_level (yydebug); return parser.parse (); } -], -[static void -yyerror (const char *msg) -{ - printf ("%d-%d: %s\n", RANGE (yylloc), msg); -}])[ +])[ int main (int argc, const char *argv[]) @@ -367,9 +362,9 @@ main (int argc, const char *argv[]) status = yyparse (); switch (status) { - case 0: printf ("Successful parse.\n"); break; - case 1: printf ("Parsing FAILED.\n"); break; - default: printf ("Parsing FAILED (status %d).\n", status); break; + case 0: fprintf (stderr, "Successful parse.\n"); break; + case 1: fprintf (stderr, "Parsing FAILED.\n"); break; + default: fprintf (stderr, "Parsing FAILED (status %d).\n", status); break; } return status; } @@ -383,7 +378,7 @@ AT_FULL_COMPILE([input]) # I.e., epsilon-reductions, as in "(x)" which ends by reducing # an empty "line" nterm. # FIXME: This location is not satisfying. Depend on the lookahead? -AT_PARSER_CHECK([./input '(x)'], 0, +AT_PARSER_CHECK([./input '(x)'], 0, [], [[sending: '(' (0@0-9) sending: 'x' (1@10-19) thing (1@10-19): 'x' (1@10-19) @@ -402,10 +397,10 @@ Successful parse. # --------------------------------- # '(y)' is an error, but can be recovered from. But what's the location # of the error itself ('y'), and of the resulting reduction ('(error)'). -AT_PARSER_CHECK([./input '(y)'], 0, +AT_PARSER_CHECK([./input '(y)'], 0, [], [[sending: '(' (0@0-9) sending: 'y' (1@10-19) -10-19: syntax error, unexpected 'y', expecting 'x' +10.10-19.18: syntax error, unexpected 'y', expecting 'x' Freeing token 'y' (1@10-19) sending: ')' (2@20-29) line (-1@0-29): '(' (0@0-9) error (@10-19) ')' (2@20-29) @@ -432,14 +427,14 @@ Successful parse. # '(', 'x', ')', # '(', 'x', ')', # 'y' -AT_PARSER_CHECK([./input '(xxxxx)(x)(x)y'], 1, +AT_PARSER_CHECK([./input '(xxxxx)(x)(x)y'], 1, [], [[sending: '(' (0@0-9) sending: 'x' (1@10-19) thing (1@10-19): 'x' (1@10-19) sending: 'x' (2@20-29) thing (2@20-29): 'x' (2@20-29) sending: 'x' (3@30-39) -30-39: syntax error, unexpected 'x', expecting ')' +30.30-39.38: syntax error, unexpected 'x', expecting ')' Freeing nterm thing (2@20-29) Freeing nterm thing (1@10-19) Freeing token 'x' (3@30-39) @@ -464,7 +459,7 @@ input (0@129-129): /* Nothing */ input (2@100-129): line (10@100-129) input (0@129-129) input (2@70-129): line (7@70-99) input (2@100-129) input (2@0-129): line (-1@0-69) input (2@70-129) -130-139: syntax error, unexpected 'y', expecting END +130.130-139.138: syntax error, unexpected 'y', expecting END Freeing nterm input (2@0-129) Freeing token 'y' (13@130-139) Parsing FAILED. @@ -480,7 +475,7 @@ Parsing FAILED. # '(', 'x', ')', # '(', 'x', ')', # 'x' -AT_PARSER_CHECK([./input '(x)(x)x'], 1, +AT_PARSER_CHECK([./input '(x)(x)x'], 1, [], [[sending: '(' (0@0-9) sending: 'x' (1@10-19) thing (1@10-19): 'x' (1@10-19) @@ -494,7 +489,7 @@ line (3@30-59): '(' (3@30-39) thing (4@40-49) ')' (5@50-59) sending: 'x' (6@60-69) thing (6@60-69): 'x' (6@60-69) sending: END (7@70-79) -70-79: syntax error, unexpected END, expecting 'x' +70.70-79.78: syntax error, unexpected END, expecting 'x' Freeing nterm thing (6@60-69) Freeing nterm line (3@30-59) Freeing nterm line (0@0-29) @@ -508,7 +503,7 @@ Parsing FAILED. # Upon stack overflow, all symbols on the stack should be destroyed. # Only check for yacc.c. AT_YACC_IF([ -AT_PARSER_CHECK([./input '(x)(x)(x)(x)(x)(x)(x)'], 2, +AT_PARSER_CHECK([./input '(x)(x)(x)(x)(x)(x)(x)'], 2, [], [[sending: '(' (0@0-9) sending: 'x' (1@10-19) thing (1@10-19): 'x' (1@10-19) @@ -543,7 +538,7 @@ sending: '(' (18@180-189) sending: 'x' (19@190-199) thing (19@190-199): 'x' (19@190-199) sending: ')' (20@200-209) -200-209: memory exhausted +200.200-209.208: memory exhausted Freeing nterm thing (19@190-199) Freeing nterm line (15@150-179) Freeing nterm line (12@120-149) @@ -1202,7 +1197,7 @@ AT_DATA_GRAMMAR([[input.y]], %debug ]$1[ { - printf ("%d\n", @$.first_line); + fprintf (stderr, "%d\n", @$.first_line); } ]m4_if($1, [%initial-action], [], [[start]])[ %% diff --git a/tests/calc.at b/tests/calc.at index 0a9f9e11..55b91544 100644 --- a/tests/calc.at +++ b/tests/calc.at @@ -45,7 +45,7 @@ m4_define([_AT_DATA_CALC_Y], [m4_fatal([$0: Invalid arguments: $@])])dnl m4_pushdef([AT_CALC_MAIN], -[#include <stdlib.h> /* abort */ +[#include <assert.h> #if HAVE_UNISTD_H # include <unistd.h> #else @@ -98,10 +98,8 @@ main (int argc, const char **argv) status = ]AT_NAME_PREFIX[parse (]AT_PARAM_IF([[&result, &count]])[); if (fclose (input)) perror ("fclose"); - if (global_result != result) - abort (); - if (global_count != count) - abort (); + assert (global_result == result); + assert (global_count == count); return status; } ]]) diff --git a/tests/conflicts.at b/tests/conflicts.at index 6c71a368..3cced5d7 100644 --- a/tests/conflicts.at +++ b/tests/conflicts.at @@ -56,6 +56,7 @@ AT_DATA_GRAMMAR([input.y], #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <assert.h> #define YYERROR_VERBOSE 1 ]AT_YYERROR_DEFINE[ @@ -66,8 +67,7 @@ static int yylex (void) { static size_t toknum; - if (! (toknum <= strlen (input))) - abort (); + assert (toknum <= strlen (input)); return input[toknum++]; } diff --git a/tests/cxx-type.at b/tests/cxx-type.at index e172033a..f5e7c559 100644 --- a/tests/cxx-type.at +++ b/tests/cxx-type.at @@ -122,12 +122,12 @@ declarator : ID #include <stdlib.h> #include <string.h> #include <stdarg.h> +#include <assert.h> int main (int argc, char **argv) { - if (argc != 2) - abort (); + assert (argc == 2); if (!freopen (argv[1], "r", stdin)) return 3; return yyparse (); @@ -152,8 +152,7 @@ main (int argc, char **argv) while (1) { - if (feof (stdin)) - abort (); + assert (!feof (stdin)); c = getchar (); switch (c) { @@ -182,8 +181,7 @@ main (int argc, char **argv) { buffer[i++] = c; colNum += 1; - if (i == sizeof buffer - 1) - abort (); + assert (i != sizeof buffer - 1); c = getchar (); } while (isalnum (c) || c == '_'); diff --git a/tests/glr-regression.at b/tests/glr-regression.at index 479303df..91dedb89 100644 --- a/tests/glr-regression.at +++ b/tests/glr-regression.at @@ -32,6 +32,7 @@ AT_DATA_GRAMMAR([glr-regr1.y], %{ #include <stdio.h> #include <stdlib.h> +#include <assert.h> #define YYSTYPE int static YYSTYPE exprMerge (YYSTYPE x0, YYSTYPE x1); @@ -80,8 +81,7 @@ yylex (void) for (;;) { int ch; - if (feof (stdin)) - abort (); + assert (!feof (stdin)); ch = getchar (); if (ch == EOF) return 0; @@ -128,6 +128,7 @@ AT_DATA_GRAMMAR([glr-regr2a.y], #include <stdio.h> #include <stdlib.h> #include <string.h> + #include <assert.h> ]AT_YYERROR_DECLARE[ ]AT_YYLEX_DECLARE[ %} @@ -177,8 +178,7 @@ yylex (void) { char buf[50]; char *s; - if (feof (stdin)) - abort (); + assert (!feof (stdin)); switch (fscanf (input, " %1[a-z,]", buf)) { case 1: @@ -190,8 +190,7 @@ yylex (void) } if (fscanf (input, "%49s", buf) != 1) return 0; - if (sizeof buf - 1 <= strlen (buf)) - abort (); + assert (strlen (buf) < sizeof buf - 1); s = (char *) malloc (strlen (buf) + 1); strcpy (s, buf); yylval = s; @@ -242,6 +241,7 @@ AT_DATA_GRAMMAR([glr-regr3.y], #include <stdio.h> #include <stdlib.h> #include <stdarg.h> +#include <assert.h> static int MergeRule (int x0, int x1); ]AT_YYERROR_DECLARE[ @@ -302,8 +302,7 @@ int T[] = { T1, T2, T3, T4 }; int yylex (void) { char inp[3]; - if (feof (stdin)) - abort (); + assert (!feof (stdin)); if (fscanf (input, "%2s", inp) == EOF) return 0; switch (inp[0]) @@ -935,6 +934,7 @@ AT_DATA_GRAMMAR([glr-regr12.y], %{ # include <stdlib.h> +# include <assert.h> static int merge (YYSTYPE, YYSTYPE); ]AT_YYERROR_DECLARE[ ]AT_YYLEX_DECLARE[ @@ -1003,8 +1003,7 @@ yylex (void) { static int const input[] = { PARENT_RHS_AFTER, 0 }; static size_t toknum; - if (! (toknum < sizeof input / sizeof *input)) - abort (); + assert (toknum < sizeof input / sizeof *input); if (input[toknum] == PARENT_RHS_AFTER) parent_rhs_after_value = 1; return input[toknum++]; @@ -1064,6 +1063,7 @@ AT_DATA_GRAMMAR([glr-regr13.y], %{ #include <stdio.h> + #include <assert.h> ]AT_YYERROR_DECLARE[ ]AT_YYLEX_DECLARE[ static void print_lookahead (char const *); @@ -1122,8 +1122,7 @@ yylex (void) { static char const input[] = "ab"; static size_t toknum; - if (! (toknum < sizeof input)) - abort (); + assert (toknum < sizeof input); yylloc.first_line = yylloc.last_line = 1; yylloc.first_column = yylloc.last_column = toknum + 1; yylval.value = input[toknum] + 'A' - 'a'; @@ -1212,6 +1211,7 @@ AT_DATA_GRAMMAR([glr-regr14.y], %{ #include <stdlib.h> #include <stdio.h> + #include <assert.h> ]AT_YYERROR_DECLARE[ ]AT_YYLEX_DECLARE[ static void print_lookahead (char const *); @@ -1328,8 +1328,7 @@ yylex (void) { static char const input[] = "abcdddd"; static size_t toknum; - if (! (toknum < sizeof input)) - abort (); + assert (toknum < sizeof input); yylloc.first_line = yylloc.last_line = 1; yylloc.first_column = yylloc.last_column = toknum + 1; yylval.value = input[toknum] + 'A' - 'a'; @@ -1492,6 +1491,7 @@ AT_DATA_GRAMMAR([glr-regr16.y], %{ # include <stdlib.h> +# include <assert.h> ]AT_YYERROR_DECLARE[ ]AT_YYLEX_DECLARE[ static int lookahead_value = 0; @@ -1512,8 +1512,7 @@ yylex (void) { static char const input[] = "ab"; static size_t toknum; - if (! (toknum < sizeof input)) - abort (); + assert (toknum < sizeof input); if (input[toknum] == 'b') lookahead_value = 1; return input[toknum++]; @@ -1551,7 +1550,8 @@ AT_CLEANUP AT_SETUP([Uninitialized location when reporting ambiguity]) -AT_BISON_OPTION_PUSHDEFS +AT_BISON_OPTION_PUSHDEFS([%glr-parser %locations %define api.pure]) + AT_DATA_GRAMMAR([glr-regr17.y], [[ %glr-parser @@ -1562,8 +1562,8 @@ AT_DATA_GRAMMAR([glr-regr17.y], %union { int dummy; } %{ - static void yyerror (YYLTYPE *, char const *); - static int yylex (YYSTYPE *, YYLTYPE *); + ]AT_YYERROR_DECLARE[ + ]AT_YYLEX_DECLARE[ %} %initial-action { @@ -1593,21 +1593,15 @@ empty1: ; empty2: ; %% +# include <assert.h> -static void -yyerror (YYLTYPE *locp, char const *msg) -{ - fprintf (stderr, "%d.%d-%d.%d: %s.\n", locp->first_line, - locp->first_column, locp->last_line, locp->last_column, msg); -} - +]AT_YYERROR_DEFINE[ static int yylex (YYSTYPE *lvalp, YYLTYPE *llocp) { static char const input[] = "ab"; static size_t toknum; - if (! (toknum < sizeof input)) - abort (); + assert (toknum < sizeof input); lvalp->dummy = 0; llocp->first_line = llocp->last_line = 2; llocp->first_column = toknum + 1; @@ -1629,7 +1623,7 @@ AT_BISON_CHECK([[-o glr-regr17.c glr-regr17.y]], 0, [], AT_COMPILE([glr-regr17]) AT_PARSER_CHECK([[./glr-regr17]], 0, [], -[1.1-2.3: syntax is ambiguous. +[1.1-2.2: syntax is ambiguous ]) AT_CLEANUP diff --git a/tests/headers.at b/tests/headers.at index a28f2e1b..549d62dc 100644 --- a/tests/headers.at +++ b/tests/headers.at @@ -111,8 +111,8 @@ main (void) # Link and execute, just to make sure everything is fine (and in # particular, that MY_LLOC is indeed defined somewhere). -AT_COMPILE([caller.o], [-c caller.c]) -AT_COMPILE([input.o], [-c input.c]) +AT_COMPILE([caller.o]) +AT_COMPILE([input.o]) AT_COMPILE([caller], [caller.o input.o]) AT_PARSER_CHECK([./caller]) diff --git a/tests/input.at b/tests/input.at index 053e3583..356fe92b 100644 --- a/tests/input.at +++ b/tests/input.at @@ -533,6 +533,7 @@ char apostrophe = '\''; #include <stdio.h> #include <stdlib.h> +#include <assert.h> %} /* %{ and %} can be here too. */ @@ -600,8 +601,7 @@ yylex (void) #output "; /* " */ static size_t toknum; - if (! (toknum < sizeof input)) - abort (); + assert (toknum < sizeof input); yylval = value_as_yystype (input[toknum]); return input[toknum++]; } @@ -624,8 +624,8 @@ main (void) AT_BISON_OPTION_POPDEFS AT_BISON_CHECK([-d -v -o input.c input.y]) -AT_COMPILE([input.o], [-c input.c]) -AT_COMPILE([main.o], [-c main.c]) +AT_COMPILE([input.o]) +AT_COMPILE([main.o]) AT_COMPILE([input], [input.o main.o]) AT_PARSER_CHECK([./input], 0, [[[@<:@], @@ -745,7 +745,7 @@ input.y:18.8-16: warning: POSIX Yacc forbids dashes in symbol names: with-dash AT_BISON_CHECK([-o input.c input.y]) # Make sure we don't export silly token identifiers with periods or dashes. -AT_COMPILE([input.o], [-c input.c]) +AT_COMPILE([input.o]) # Periods are genuine letters, they can start identifiers. diff --git a/tests/local.at b/tests/local.at index 649e9943..d5c73657 100644 --- a/tests/local.at +++ b/tests/local.at @@ -90,7 +90,8 @@ m4_popdef([AT_LOC_LAST_COLUMN])]) # AT_BISON_OPTION_PUSHDEFS([BISON-OPTIONS]) # ----------------------------------------- m4_define([AT_BISON_OPTION_PUSHDEFS], -[_AT_BISON_OPTION_PUSHDEFS($[1], $[2], [$1])]) +[m4_divert_text([KILL], + [_AT_BISON_OPTION_PUSHDEFS($[1], $[2], [$1])])]) # _AT_BISON_OPTION_PUSHDEFS($1, $2, [BISON-OPTIONS]) @@ -137,16 +138,16 @@ m4_pushdef([AT_PURE_AND_LOC_IF], m4_pushdef([AT_GLR_OR_PARAM_IF], [m4_bmatch([$3], [%glr-parser\|%parse-param], [$1], [$2])]) m4_pushdef([AT_NAME_PREFIX], -[m4_bmatch([$3], [%name-prefix ".*"], - [m4_bregexp([$3], [%name-prefix "\([^""]*\)"], [\1])], - [yy])]) -m4_pushdef([AT_API_PREFIX], [m4_bmatch([$3], [\(%define api\.prefix\|%name-prefix\) ".*"], [m4_bregexp([$3], [\(%define api\.prefix\|%name-prefix\) "\([^""]*\)"], [\2])], [yy])]) m4_pushdef([AT_TOKEN_PREFIX], [m4_bmatch([$3], [%define api.tokens.prefix ".*"], [m4_bregexp([$3], [%define api.tokens.prefix "\(.*\)"], [\1])])]) +m4_pushdef([AT_API_prefix], +[m4_bmatch([$3], [%define api\.prefix ".*"], + [m4_bregexp([$3], [%define api\.prefix "\([^""]*\)"], [\1])], + [yy])]) # yyerror receives the location if %location & %pure & (%glr or %parse-param). m4_pushdef([AT_YYERROR_ARG_LOC_IF], [AT_GLR_OR_PARAM_IF([AT_PURE_AND_LOC_IF([$1], [$2])], @@ -165,19 +166,27 @@ m4_pushdef([AT_PURE_LEX_IF], [AT_PURE_IF([$1], [AT_SKEL_CC_IF([$1], [$2])])]) +m4_pushdef([AT_YYSTYPE], +[AT_SKEL_CC_IF([AT_NAME_PREFIX[::parser::semantic_type]], + [[YYSTYPE]])]) +m4_pushdef([AT_YYLTYPE], +[AT_SKEL_CC_IF([AT_NAME_PREFIX[::parser::location_type]], + [[YYLTYPE]])]) + + AT_PURE_LEX_IF( [m4_pushdef([AT_LOC], [(*llocp)]) m4_pushdef([AT_VAL], [(*lvalp)]) m4_pushdef([AT_YYLEX_FORMALS], - [YYSTYPE *lvalp[]AT_LOCATION_IF([, YYLTYPE *llocp])]) + [AT_YYSTYPE *lvalp[]AT_LOCATION_IF([, AT_YYLTYPE *llocp])]) m4_pushdef([AT_YYLEX_ARGS], [lvalp[]AT_LOCATION_IF([, llocp])]) m4_pushdef([AT_USE_LEX_ARGS], [(void) lvalp;AT_LOCATION_IF([(void) llocp])]) m4_pushdef([AT_YYLEX_PRE_FORMALS], - [AT_YYLEX_FORMALS, ]) + [AT_YYLEX_FORMALS, ]) m4_pushdef([AT_YYLEX_PRE_ARGS], - [AT_YYLEX_ARGS, ]) + [AT_YYLEX_ARGS, ]) ], [m4_pushdef([AT_LOC], [[(]AT_NAME_PREFIX[lloc)]]) m4_pushdef([AT_VAL], [[(]AT_NAME_PREFIX[lval)]]) @@ -204,17 +213,20 @@ AT_GLR_IF([AT_KEYWORDS([glr])]) # AT_BISON_OPTION_POPDEFS # ----------------------- m4_define([AT_BISON_OPTION_POPDEFS], +[m4_divert_text([KILL], [m4_popdef([AT_YYLEX_PRE_ARGS]) m4_popdef([AT_YYLEX_PRE_FORMALS]) m4_popdef([AT_USE_LEX_ARGS]) m4_popdef([AT_YYLEX_ARGS]) m4_popdef([AT_YYLEX_FORMALS]) +m4_popdef([AT_YYLTYPE]) +m4_popdef([AT_YYSTYPE]) m4_popdef([AT_VAL]) m4_popdef([AT_LOC]) m4_popdef([AT_PURE_LEX_IF]) m4_popdef([AT_YYERROR_SEES_LOC_IF]) m4_popdef([AT_YYERROR_ARG_LOC_IF]) -m4_popdef([AT_API_PREFIX]) +m4_popdef([AT_API_prefix]) m4_popdef([AT_NAME_PREFIX]) m4_popdef([AT_GLR_OR_PARAM_IF]) m4_popdef([AT_PURE_AND_LOC_IF]) @@ -230,7 +242,7 @@ m4_popdef([AT_SKEL_JAVA_IF]) m4_popdef([AT_GLR_CC_IF]) m4_popdef([AT_LALR1_CC_IF]) m4_popdef([AT_DEFINES_IF]) -AT_LOC_POPDEF +AT_LOC_POPDEF])dnl ])# AT_BISON_OPTION_POPDEFS @@ -287,7 +299,7 @@ $2]) # AT_YYLEX_DEFINE(INPUT-STRING, [ACTION]) # --------------------------------------- m4_define([AT_YYLEX_PROTOTYPE], -[int AT_API_PREFIX[]lex (]AT_YYLEX_FORMALS[)[]dnl +[int AT_NAME_PREFIX[]lex (]AT_YYLEX_FORMALS[)[]dnl ]) m4_define([AT_YYLEX_DECLARE_EXTERN], @@ -299,19 +311,19 @@ m4_define([AT_YYLEX_DECLARE], ]) m4_define([AT_YYLEX_DEFINE], -[[#include <stdlib.h> /* abort */ +[[#include <assert.h> static ]AT_YYLEX_PROTOTYPE[ { static char const input[] = "$1"; static size_t toknum = 0; int res; - if (! (toknum < sizeof input)) - abort (); + ]AT_USE_LEX_ARGS[; + assert (toknum < sizeof input); res = input[toknum++]; - ]$2;[]AT_LOCATION_IF([[ - ]AT_API_PREFIX[lloc.first_line = ]AT_API_PREFIX[lloc.last_line = 1; - ]AT_API_PREFIX[lloc.first_column = ]AT_API_PREFIX[lloc.last_column = toknum;]])[ + ]$2[;]AT_LOCATION_IF([[ + ]AT_LOC_FIRST_LINE[ = ]AT_LOC_LAST_LINE[ = 1; + ]AT_LOC_FIRST_COLUMN[ = ]AT_LOC_LAST_COLUMN[ = toknum;]])[ return res; }]dnl ]) @@ -329,7 +341,7 @@ m4_define([AT_YYERROR_FORMALS], m4_define([AT_YYERROR_PROTOTYPE], [m4_case(AT_LANG, -[c], [[void ]AT_API_PREFIX[error (]AT_YYERROR_FORMALS[)]])[]dnl +[c], [[void ]AT_NAME_PREFIX[error (]AT_YYERROR_FORMALS[)]])[]dnl ]) m4_define([AT_YYERROR_DECLARE_EXTERN], @@ -540,21 +552,37 @@ m4_define([AT_QUELL_VALGRIND], # AT_COMPILE(OUTPUT, [SOURCES = OUTPUT.c]) # ---------------------------------------- -# Compile SOURCES into OUTPUT. If OUTPUT does not contain '.', -# assume that we are linking too; this is a hack. +# Compile SOURCES into OUTPUT. +# +# If OUTPUT does not contain '.', assume that we are linking too, +# otherwise pass "-c"; this is a hack. The default SOURCES is OUTPUT +# with trailing .o removed, and ".c" appended. m4_define([AT_COMPILE], -[AT_CHECK([$CC $CFLAGS $CPPFLAGS m4_bmatch([$1], [[.]], [], [$LDFLAGS ])-o $1 m4_default([$2], [$1.c])[]m4_bmatch([$1], [[.]], [], [ $LIBS])], +[AT_CHECK(m4_join([ ], + [$CC $CFLAGS $CPPFLAGS], + [m4_bmatch([$1], [[.]], [-c], [$LDFLAGS])], + [-o $1], + [m4_default([$2], [m4_bpatsubst([$1], [\.o$]).c])], + [m4_bmatch([$1], [[.]], [], [$LIBS])]), 0, [ignore], [ignore])]) # AT_COMPILE_CXX(OUTPUT, [SOURCES = OUTPUT.cc]) -# -------------------------------------------- -# Compile SOURCES into OUTPUT. If OUTPUT does not contain '.', -# assume that we are linking too; this is a hack. -# If the C++ compiler does not work, ignore the test. +# --------------------------------------------- +# Compile SOURCES into OUTPUT. If the C++ compiler does not work, +# ignore the test. +# +# If OUTPUT does not contain '.', assume that we are linking too, +# otherwise pass "-c"; this is a hack. The default SOURCES is OUTPUT +# with trailing .o removed, and ".cc" appended. m4_define([AT_COMPILE_CXX], [AT_KEYWORDS(c++) AT_CHECK([$BISON_CXX_WORKS], 0, ignore, ignore) -AT_CHECK([$CXX $CXXFLAGS $CPPFLAGS m4_bmatch([$1], [[.]], [], [$LDFLAGS ])-o $1 m4_default([$2], [$1.cc])[]m4_bmatch([$1], [[.]], [], [ $LIBS])], +AT_CHECK(m4_join([ ], + [$CXX $CXXFLAGS $CPPFLAGS], + [m4_bmatch([$1], [[.]], [-c], [$LDFLAGS])], + [-o $1], + [m4_default([$2], [m4_bpatsubst([$1], [\.o$]).cc])], + [m4_bmatch([$1], [[.]], [], [$LIBS])]), 0, [ignore], [ignore])]) # AT_JAVA_COMPILE(SOURCES) @@ -569,6 +597,11 @@ AT_CHECK([[$SHELL ../../../javacomp.sh ]$1], # AT_LANG_COMPILE(OUTPUT, [SOURCES = OUTPUT.c] # -------------------------------------------- +# Compile SOURCES into OUTPUT. Skip if compiler does not work. +# +# If OUTPUT does not contain '.', assume that we are linking too, +# otherwise pass "-c"; this is a hack. The default SOURCES is OUTPUT +# with trailing .o removed, and ".c"/".cc" appended. m4_define([AT_LANG_COMPILE], [m4_case(AT_LANG, [c], [AT_COMPILE([$1], [$2])], diff --git a/tests/named-refs.at b/tests/named-refs.at index 0e6f60c8..2484c438 100644 --- a/tests/named-refs.at +++ b/tests/named-refs.at @@ -162,10 +162,8 @@ int main (int argc, const char **argv) } status = yyparse (); fclose (input); - if (global_result != result) - abort (); - if (global_count != count) - abort (); + assert (global_result == result); + assert (global_count == count); return status; } ]]) diff --git a/tests/regression.at b/tests/regression.at index bc129b7c..b23cbcfd 100644 --- a/tests/regression.at +++ b/tests/regression.at @@ -41,7 +41,7 @@ program: 'x'; AT_BISON_OPTION_POPDEFS AT_BISON_CHECK([-o input.c input.y]) -AT_COMPILE([input.o], [-c input.c]) +AT_COMPILE([input.o]) AT_COMPILE([input.o], [-DYYDEBUG -c input.c]) AT_CLEANUP @@ -71,7 +71,7 @@ program: { $$ = ""; }; AT_BISON_OPTION_POPDEFS AT_BISON_CHECK([-o input.c input.y]) -AT_COMPILE([input.o], [-c input.c]) +AT_COMPILE([input.o]) AT_CLEANUP @@ -111,7 +111,7 @@ exp: MY_TOKEN; AT_BISON_OPTION_POPDEFS AT_BISON_CHECK([-y -o input.c input.y]) -AT_COMPILE([input.o], [-c input.c]) +AT_COMPILE([input.o]) AT_CLEANUP @@ -156,7 +156,7 @@ exp: MY_TOKEN; AT_BISON_OPTION_POPDEFS AT_BISON_CHECK([-o input.c input.y]) -AT_COMPILE([input.o], [-c input.c]) +AT_COMPILE([input.o]) AT_CLEANUP @@ -527,7 +527,7 @@ exp: AT_BISON_OPTION_POPDEFS AT_BISON_CHECK([-o input.c input.y]) -AT_COMPILE([input.o], [-c input.c]) +AT_COMPILE([input.o]) AT_CLEANUP @@ -901,6 +901,7 @@ yyparse () } ]) +#include <assert.h> static int yylex (AT_LALR1_CC_IF([int *lval], [void])) [{ @@ -910,8 +911,7 @@ yylex (AT_LALR1_CC_IF([int *lval], [void])) }; static size_t toknum; ]AT_LALR1_CC_IF([*lval = 0; /* Pacify GCC. */])[ - if (! (toknum < sizeof tokens / sizeof *tokens)) - abort (); + assert (toknum < sizeof tokens / sizeof *tokens); return tokens[toknum++]; }] @@ -986,6 +986,7 @@ yyparse () } ])[ +#include <assert.h> static int yylex (]AT_LALR1_CC_IF([int *lval], [void])[) { @@ -995,8 +996,7 @@ yylex (]AT_LALR1_CC_IF([int *lval], [void])[) }; static size_t toknum; ]AT_LALR1_CC_IF([*lval = 0; /* Pacify GCC. */])[ - if (! (toknum < sizeof tokens / sizeof *tokens)) - abort (); + assert (toknum < sizeof tokens / sizeof *tokens); return tokens[toknum++]; } diff --git a/tests/torture.at b/tests/torture.at index a8837b22..338c1648 100644 --- a/tests/torture.at +++ b/tests/torture.at @@ -56,6 +56,7 @@ print <<EOF; %{ #include <stdio.h> #include <stdlib.h> +#include <assert.h> #define MAX $max ]AT_YYLEX_DECLARE[ ]AT_YYERROR_DECLARE[ @@ -77,8 +78,8 @@ for my $size (1 .. $max) print <<EOF; %% input: - exp { if (\@S|@1 != 0) abort (); \$\$ = \@S|@1; } -| input exp { if (\@S|@2 != \@S|@1 + 1) abort (); \$\$ = \@S|@2; } + exp { assert (\@S|@1 == 0); \$\$ = \@S|@1; } +| input exp { assert (\@S|@2 == \@S|@1 + 1); \$\$ = \@S|@2; } ; exp: @@ -192,6 +193,7 @@ print print <<\EOF; %% +#include <assert.h> ]AT_YYERROR_DEFINE[ static int yylex (void) @@ -199,8 +201,7 @@ yylex (void) static int counter = 1; if (counter <= MAX) return counter++; - if (counter++ != MAX + 1) - abort (); + assert (counter++ == MAX + 1); return 0; } @@ -328,8 +329,7 @@ yylex (void) static int counter = 1; if (counter > MAX) { - if (counter++ != MAX + 1) - abort (); + assert (counter++ == MAX + 1); return 0; } if (return_token) @@ -401,11 +401,11 @@ AT_DATA([input.y], exp: WAIT_FOR_EOF exp | ; %% ]AT_YYERROR_DEFINE[ +#include <assert.h> static int yylex (void) { - if (yylval < 0) - abort (); + assert (0 <= yylval); if (yylval--) return WAIT_FOR_EOF; else @@ -417,13 +417,12 @@ main (int argc, const char **argv) { char *endp; YYSTYPE yylval_init; - if (argc != 2) - abort (); + assert (argc == 2); yylval_init = strtol (argv[1], &endp, 10); - if (! (argv[1] != endp - && 0 <= yylval_init && yylval_init <= INT_MAX - && errno != ERANGE)) - abort (); + assert (argv[1] != endp); + assert (0 <= yylval_init); + assert (yylval_init <= INT_MAX); + assert (errno != ERANGE); yydebug = 1; { int count; @@ -438,8 +437,7 @@ main (int argc, const char **argv) [[ new_status = yypull_parse (ps); ]], [[ new_status = yyparse (); -]])[ if (count > 0 && new_status != status) - abort (); +]])[ assert (0 <= count || new_status == status); status = new_status; } ]m4_bmatch([$2], [%push-], |