+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
/* 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
/* 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))
--- /dev/null
+/* 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
+}
--- /dev/null
+/* 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
+}