+2007-01-09 Joel E. Denny <jdenny@ces.clemson.edu>
+
+ Ignore YYSTACK_USE_ALLOCA for push parsers since the stacks can't be
+ locals. Reported by Juan Manuel Guerrero at
+ <http://lists.gnu.org/archive/html/bug-bison/2007-01/msg00000.html>.
+ * data/push.c: Enclose the #ifdef YYSTACK_USE_ALLOCA in b4_push_if.
+ Fix some indentation also.
+ * tests/torture.at (Exploding the Stack Size with Alloca): Add comment
+ explaining this issue.
+
2007-01-09 Paolo Bonzini <bonzini@gnu.org>
and Joel E. Denny <jdenny@ces.clemson.edu>
#if ! defined yyoverflow || YYERROR_VERBOSE
-/* The parser invokes alloca or malloc; define the necessary symbols. */
+]b4_push_if([],
+[[/* The parser invokes alloca or malloc; define the necessary symbols. */
# ifdef YYSTACK_USE_ALLOCA
# if YYSTACK_USE_ALLOCA
# endif
# endif
-# ifdef YYSTACK_ALLOC
+]])dnl
+[# ifdef YYSTACK_ALLOC
/* Pacify GCC's `empty if-body' warning. */
# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0))
# ifndef YYSTACK_ALLOC_MAXIMUM
]b4_locations_if([[ YYLTYPE yylloc;
]])])[
if (yyps == 0)
- yyps_local = yypstate_new ();
- else
- yyps_local = yyps;
- do {
- yychar = YYLEX;
- yystatus =
- yypush_parse (yyps_local]b4_pure_if([[, yychar, &yylval]b4_locations_if([[, &yylloc]])])m4_ifset([b4_parse_param], [, b4_c_args(b4_parse_param)])[);
+ yyps_local = yypstate_new ();
+ else
+ yyps_local = yyps;
+ do {
+ yychar = YYLEX;
+ yystatus =
+ yypush_parse (yyps_local]b4_pure_if([[, yychar, &yylval]b4_locations_if([[, &yylloc]])])m4_ifset([b4_parse_param], [, b4_c_args(b4_parse_param)])[);
} while (yystatus == YYPUSH_MORE);
if (yyps == 0)
yypstate_delete (yyps_local);
b4_c_function_def([yyparse], [int], b4_parse_param)
#endif])[
{
- ]b4_pure_if([b4_declare_scanner_communication_variables])
- b4_push_if([b4_pure_if([], [[ int yypushed_char = yychar;
+]b4_pure_if([b4_declare_scanner_communication_variables])
+b4_push_if([b4_pure_if([], [[ int yypushed_char = yychar;
YYSTYPE yypushed_val = yylval;
]b4_locations_if([[YYLTYPE yypushed_loc = yylloc;
]])])],
# multiply by two starting at 200 => 5120 is the last possible).
AT_PARSER_CHECK([./input 10000], 2, [], [ignore])
+# The push parser can't use alloca since the stacks can't be locals. This test
+# just helps guarantee we don't let the YYSTACK_USE_ALLOCA feature affect
+# push parsers.
AT_DATA_STACK_TORTURE([AT_USE_ALLOCA],
[[%push-pull-parser
]])