]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c-parse.in (yyoverflow): New.
authorRichard Henderson <rth@redhat.com>
Fri, 26 Apr 2002 05:35:13 +0000 (22:35 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Fri, 26 Apr 2002 05:35:13 +0000 (22:35 -0700)
* 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
gcc/c-parse.in
gcc/cp/ChangeLog
gcc/cp/parse.y
gcc/testsuite/g++.dg/parse/stack1.C [new file with mode: 0644]
gcc/testsuite/gcc.dg/20020425-1.c [new file with mode: 0644]

index 2813ca25792867929751143f98fd5e5468d69655..87eb96191bdb345b999408f390979df4bc898868 100644 (file)
@@ -1,3 +1,8 @@
+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
index 5835fe14e134fdd011fb7eee57ab82415276a959..f3a3da8f9995a66a531c9f06959ee748061d77ee 100644 (file)
@@ -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
index 22d45277ea31bc5d4bcfe970bf486fd2211c552c..38b2f2255f3b2578a38446febf44306abd2cc2e8 100644 (file)
@@ -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
index 627e7343e13e01374ea8e0aac87f2163323cfab3..5454353d8744092d69166ea7c9550132776581e1 100644 (file)
@@ -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 (file)
index 0000000..ac26e60
--- /dev/null
@@ -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 (file)
index 0000000..ac26e60
--- /dev/null
@@ -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
+}