aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2002-04-25 22:35:13 -0700
committerRichard Henderson <rth@gcc.gnu.org>2002-04-25 22:35:13 -0700
commit6052bef039abf0676722cd1df243c1cf5ab99431 (patch)
tree8cb83d3dda7305192e25c976afb951b1ed9e5357 /gcc
parent5c5b22838958187f83bf60d0394cc06942796646 (diff)
downloadgcc-6052bef039abf0676722cd1df243c1cf5ab99431.zip
gcc-6052bef039abf0676722cd1df243c1cf5ab99431.tar.gz
gcc-6052bef039abf0676722cd1df243c1cf5ab99431.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/c-parse.in35
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/parse.y34
-rw-r--r--gcc/testsuite/g++.dg/parse/stack1.C14
-rw-r--r--gcc/testsuite/gcc.dg/20020425-1.c14
6 files changed, 107 insertions, 0 deletions
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 <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.
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 <rth@redhat.com>
+
+ PR c/2161
+ * parse.y (yyoverflow): New.
+
2002-04-25 Jason Merrill <jason@redhat.com>
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
+}