--- bison/data/yacc.c 2005-04-25 05:14:22.000000000 +0200 +++ bison-mhx/data/yacc.c 2005-04-30 12:26:31.000000000 +0200 @@ -1316,6 +1316,18 @@ `----------------------------------------------*/ yyoverflowlab: yyerror (]b4_yyerror_args[_("parser stack overflow")); + yydestruct (_("Error: discarding lookahead"), + yytoken, &yylval]b4_location_if([, &yylloc])[); + for (;;) + { +]b4_location_if([[ yyerror_range[0] = *yylsp;]])[ + YYPOPSTACK; + if (yyssp == yyss) + break; + yydestruct (_("Error: popping"), + yystos[*yyssp], yyvsp]b4_location_if([, yylsp])[); + } + yychar = YYEMPTY; yyresult = 2; /* Fall through. */ #endif --- bison/tests/actions.at 2004-12-20 14:56:38.000000000 +0100 +++ bison-mhx/tests/actions.at 2005-04-30 19:55:20.000000000 +0200 @@ -174,6 +174,9 @@ #include #include #include + +#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]) @@ -442,6 +445,58 @@ Parsing FAILED. ]]) +# Check destruction upon stack overflow +# ------------------------------------- +# 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)'], 1, +[[sending: '(' (address@hidden) +sending: 'x' (address@hidden) +thing (address@hidden): 'x' (address@hidden) +sending: ')' (address@hidden) +line (address@hidden): '(' (address@hidden) thing (address@hidden) ')' (address@hidden) +sending: '(' (address@hidden) +sending: 'x' (address@hidden) +thing (address@hidden): 'x' (address@hidden) +sending: ')' (address@hidden) +line (address@hidden): '(' (address@hidden) thing (address@hidden) ')' (address@hidden) +sending: '(' (address@hidden) +sending: 'x' (address@hidden) +thing (address@hidden): 'x' (address@hidden) +sending: ')' (address@hidden) +line (address@hidden): '(' (address@hidden) thing (address@hidden) ')' (address@hidden) +sending: '(' (address@hidden) +sending: 'x' (address@hidden) +thing (address@hidden): 'x' (address@hidden) +sending: ')' (address@hidden) +line (address@hidden): '(' (address@hidden) thing (address@hidden) ')' (address@hidden) +sending: '(' (address@hidden) +sending: 'x' (address@hidden) +thing (address@hidden): 'x' (address@hidden) +sending: ')' (address@hidden) +line (address@hidden): '(' (address@hidden) thing (address@hidden) ')' (address@hidden) +sending: '(' (address@hidden) +sending: 'x' (address@hidden) +thing (address@hidden): 'x' (address@hidden) +sending: ')' (address@hidden) +line (address@hidden): '(' (address@hidden) thing (address@hidden) ')' (address@hidden) +sending: '(' (address@hidden) +sending: 'x' (address@hidden) +thing (address@hidden): 'x' (address@hidden) +sending: ')' (address@hidden) +200-209: parser stack overflow +Freeing nterm thing (address@hidden) +Freeing nterm line (address@hidden) +Freeing nterm line (address@hidden) +Freeing nterm line (address@hidden) +Freeing nterm line (address@hidden) +Freeing nterm line (address@hidden) +Freeing nterm line (address@hidden) +Parsing FAILED. +]]) +]) + ])