From 6052bef039abf0676722cd1df243c1cf5ab99431 Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Thu, 25 Apr 2002 22:35:13 -0700 Subject: 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 --- gcc/ChangeLog | 5 +++++ gcc/c-parse.in | 35 +++++++++++++++++++++++++++++++++++ gcc/cp/ChangeLog | 5 +++++ gcc/cp/parse.y | 34 ++++++++++++++++++++++++++++++++++ gcc/testsuite/g++.dg/parse/stack1.C | 14 ++++++++++++++ gcc/testsuite/gcc.dg/20020425-1.c | 14 ++++++++++++++ 6 files changed, 107 insertions(+) create mode 100644 gcc/testsuite/g++.dg/parse/stack1.C create mode 100644 gcc/testsuite/gcc.dg/20020425-1.c (limited to 'gcc') diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2813ca2..87eb961 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,10 @@ 2002-04-25 Richard Henderson + PR c/2161 + * c-parse.in (yyoverflow): New. + +2002-04-25 Richard Henderson + PR c/2098 * c-common.c (shorten_compare): Simplfy conditions leading to the generation of a warning. diff --git a/gcc/c-parse.in b/gcc/c-parse.in index 5835fe1..f3a3da8 100644 --- a/gcc/c-parse.in +++ b/gcc/c-parse.in @@ -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 diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 22d4527..38b2f22 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2002-04-25 Richard Henderson + + PR c/2161 + * parse.y (yyoverflow): New. + 2002-04-25 Jason Merrill PR c++/5607 diff --git a/gcc/cp/parse.y b/gcc/cp/parse.y index 627e734..5454353 100644 --- a/gcc/cp/parse.y +++ b/gcc/cp/parse.y @@ -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)) diff --git a/gcc/testsuite/g++.dg/parse/stack1.C b/gcc/testsuite/g++.dg/parse/stack1.C new file mode 100644 index 0000000..ac26e60 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/stack1.C @@ -0,0 +1,14 @@ +/* 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 +} diff --git a/gcc/testsuite/gcc.dg/20020425-1.c b/gcc/testsuite/gcc.dg/20020425-1.c new file mode 100644 index 0000000..ac26e60 --- /dev/null +++ b/gcc/testsuite/gcc.dg/20020425-1.c @@ -0,0 +1,14 @@ +/* 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 +} -- cgit v1.1