Commit 6052bef0 by Richard Henderson Committed by Richard Henderson

c-parse.in (yyoverflow): New.

	* c-parse.in (yyoverflow): New.
	* cp/parse.y (yyoverflow): New.
	* g++.dg/parse/stack1.C: New.
	* gcc.dg/20020425-1.c: New.

From-SVN: r52779
parent 5c5b2283
2002-04-25 Richard Henderson <rth@redhat.com>
PR c/2161
* c-parse.in (yyoverflow): New.
2002-04-25 Richard Henderson <rth@redhat.com>
PR c/2098
* c-common.c (shorten_compare): Simplfy conditions leading to
the generation of a warning.
......
......@@ -61,6 +61,41 @@ end ifobjc
/* Like YYERROR but do call yyerror. */
#define YYERROR1 { yyerror ("syntax error"); YYERROR; }
/* Like the default stack expander, except (1) use realloc when possible,
and (2) impose no hard maxiumum on stack size. */
#define yyoverflow(MSG, SS, SSSIZE, VS, VSSIZE, YYSSZ) \
do { \
size_t newsize; \
short *newss; \
YYSTYPE *newvs; \
newsize = *(YYSSZ) *= 2; \
if (yyfree_stacks) \
{ \
newss = (short *) \
really_call_realloc (*(SS), newsize * sizeof (short)); \
newvs = (YYSTYPE *) \
really_call_realloc (*(VS), newsize * sizeof (YYSTYPE)); \
} \
else \
{ \
newss = (short *) really_call_malloc (newsize * sizeof (short)); \
if (newss) \
memcpy (newss, *(SS), (SSSIZE)); \
newvs = (YYSTYPE *) really_call_malloc (newsize * sizeof (YYSTYPE)); \
if (newvs) \
memcpy (newvs, *(VS), (VSSIZE)); \
} \
if (!newss || !newvs) \
{ \
yyerror (MSG); \
return 2; \
} \
yyfree_stacks = 1; \
*(SS) = newss; \
*(VS) = newvs; \
} while (0)
%}
%start program
......
2002-04-25 Richard Henderson <rth@redhat.com>
PR c/2161
* parse.y (yyoverflow): New.
2002-04-25 Jason Merrill <jason@redhat.com>
PR c++/5607
......
......@@ -48,6 +48,40 @@ extern struct obstack permanent_obstack;
/* Like YYERROR but do call yyerror. */
#define YYERROR1 { yyerror ("syntax error"); YYERROR; }
/* Like the default stack expander, except (1) use realloc when possible,
and (2) impose no hard maxiumum on stack size. */
#define yyoverflow(MSG, SS, SSSIZE, VS, VSSIZE, YYSSZ) \
do { \
size_t newsize; \
short *newss; \
YYSTYPE *newvs; \
newsize = *(YYSSZ) *= 2; \
if (yyfree_stacks) \
{ \
newss = (short *) \
really_call_realloc (*(SS), newsize * sizeof (short)); \
newvs = (YYSTYPE *) \
really_call_realloc (*(VS), newsize * sizeof (YYSTYPE)); \
} \
else \
{ \
newss = (short *) really_call_malloc (newsize * sizeof (short)); \
if (newss) \
memcpy (newss, *(SS), (SSSIZE)); \
newvs = (YYSTYPE *) really_call_malloc (newsize * sizeof (YYSTYPE)); \
if (newvs) \
memcpy (newvs, *(VS), (VSSIZE)); \
} \
if (!newss || !newvs) \
{ \
yyerror (MSG); \
return 2; \
} \
yyfree_stacks = 1; \
*(SS) = newss; \
*(VS) = newvs; \
} while (0)
#define OP0(NODE) (TREE_OPERAND (NODE, 0))
#define OP1(NODE) (TREE_OPERAND (NODE, 1))
......
/* PR c/2161: parser stack overflow. */
/* { dg-do compile } */
#define ONE else if (0) { }
#define TEN ONE ONE ONE ONE ONE ONE ONE ONE ONE ONE
#define HUN TEN TEN TEN TEN TEN TEN TEN TEN TEN TEN
#define THOU HUN HUN HUN HUN HUN HUN HUN HUN HUN HUN
void foo()
{
if (0) { }
/* 11,000 else if's. */
THOU THOU THOU THOU THOU THOU THOU THOU THOU THOU THOU
}
/* PR c/2161: parser stack overflow. */
/* { dg-do compile } */
#define ONE else if (0) { }
#define TEN ONE ONE ONE ONE ONE ONE ONE ONE ONE ONE
#define HUN TEN TEN TEN TEN TEN TEN TEN TEN TEN TEN
#define THOU HUN HUN HUN HUN HUN HUN HUN HUN HUN HUN
void foo()
{
if (0) { }
/* 11,000 else if's. */
THOU THOU THOU THOU THOU THOU THOU THOU THOU THOU THOU
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment