Makefile.in (C_AND_OBJC_OBJS): Remove ggc-callbacks.o.
authorBernd Schmidt <bernds@cygnus.co.uk>
Mon, 6 Sep 1999 21:28:22 +0000 (21:28 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Mon, 6 Sep 1999 21:28:22 +0000 (21:28 +0000)
* Makefile.in (C_AND_OBJC_OBJS): Remove ggc-callbacks.o.
(c-parse.o, c-decl.o, c-lang.o, c-lex.o, c-common.o,
$(out_object_file)): Depend on ggc.h.
* c-common.c: Include "ggc.h".
(combine_strings): If doing GC, use ggc_alloc_string.
* c-decl.c: Include "ggc.h".
(ggc_p): Define with value 0.
(mark_binding_level): New function.
(init_decl_processing): Add GC roots.
(mark_c_function_context): New function.
(lang_mark_false_label_stack): New function.
(lang_mark_tree): New function.
(lang_cleanup_tree): New function.
* c-lang.c: Include "ggc.h".
(lang_init): Call c_parse_init.
* c-lex.c: Include "ggc.h".
(check_linenum): If doing GC, don't copy filenames to permanent
obstack.
* c-parse.in: Include "ggc.h".
(c_parse_init): New function.
* c-tree.h (c_parse_init, mark_c_function_context): Declare.
* objc/Make-lang.in (objc-parse.o): Depend on ggc.h.

* except.c (mark_eh_state): Mark more state.
* function.c (mark_function_state): Likewise.
* ggc-simple.c (ggc_alloc_rtvec): Bring in sync with non-gc version.
(ggc_alloc_string) [GGC_DUMP]: Fix typo.
* toplev.c (mark_file_stack): New function.
(compile_file): If doing GC, use ggc_alloc_string on input filename.
(main): Add root for input_file_stack.

* i386.c: Include "ggc.h".
(ix86_mark_machine_status): New function.
(override_options): Set mark_machine_status.

From-SVN: r29143

gcc/Makefile.in
gcc/c-common.c
gcc/c-decl.c
gcc/c-lang.c
gcc/c-lex.c
gcc/c-parse.c
gcc/c-parse.in
gcc/c-parse.y
gcc/c-tree.h
gcc/config/i386/i386.c
gcc/objc/Make-lang.in

index 5cb7a7ca2d8c49c0cdc6df49cf87c70e1c478603..07a343703feea1c95bc438fb674e33996c19da4d 100644 (file)
@@ -659,7 +659,7 @@ SUBDIR_FLAGS_TO_PASS = $(ORDINARY_FLAGS_TO_PASS) \
 
 # Language-specific object files for C and Objective C.
 C_AND_OBJC_OBJS = c-lex.o c-pragma.o c-decl.o c-typeck.o c-convert.o \
-  c-aux-info.o c-common.o c-iterate.o ggc-callbacks.o @extra_c_objs@
+  c-aux-info.o c-common.o c-iterate.o @extra_c_objs@
 
 # Language-specific object files for C.
 C_OBJS = c-parse.o c-lang.o $(C_AND_OBJC_OBJS)
@@ -1312,7 +1312,7 @@ s-crt0:   $(CRT0_S) $(MCRT0_S) $(GCC_PASSES) $(CONFIG_H)
 
 # C language specific files.
 
-c-parse.o : $(srcdir)/c-parse.c $(CONFIG_H) $(TREE_H) c-lex.h \
+c-parse.o : $(srcdir)/c-parse.c $(CONFIG_H) $(TREE_H) c-lex.h ggc.h \
     $(srcdir)/c-parse.h c-tree.h c-common.h input.h flags.h system.h toplev.h
        $(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) -c $(srcdir)/c-parse.c
 $(srcdir)/c-parse.h: $(srcdir)/c-parse.c
@@ -1330,15 +1330,15 @@ $(srcdir)/c-gperf.h: c-parse.gperf
           -k1,3,$$ $(srcdir)/c-parse.gperf >tmp-gperf.h
         $(srcdir)/move-if-change tmp-gperf.h $(srcdir)/c-gperf.h
 
-c-decl.o : c-decl.c $(CONFIG_H) system.h $(TREE_H) c-tree.h c-common.h \
+c-decl.o : c-decl.c $(CONFIG_H) system.h $(TREE_H) c-tree.h c-common.h ggc.h \
     c-lex.h flags.h function.h output.h toplev.h defaults.h
 c-typeck.o : c-typeck.c $(CONFIG_H) system.h $(TREE_H) c-tree.h c-common.h \
     flags.h intl.h output.h $(EXPR_H) $(RTL_H) toplev.h
-c-lang.o : c-lang.c $(CONFIG_H) system.h $(TREE_H) c-tree.h c-common.h \
+c-lang.o : c-lang.c $(CONFIG_H) system.h $(TREE_H) c-tree.h c-common.h ggc.h \
     c-lex.h toplev.h output.h function.h
 c-lex.o : c-lex.c $(CONFIG_H) system.h $(TREE_H) $(RTL_H) c-lex.h c-tree.h \
     c-common.h $(srcdir)/c-parse.h $(srcdir)/c-gperf.h c-pragma.h input.h \
-    intl.h flags.h toplev.h output.h mbchar.h
+    intl.h flags.h toplev.h output.h mbchar.h ggc.h
 c-aux-info.o : c-aux-info.c  $(CONFIG_H) system.h $(TREE_H) c-tree.h \
     c-common.h flags.h toplev.h
 c-convert.o : c-convert.c $(CONFIG_H) system.h $(TREE_H) flags.h toplev.h
@@ -1395,7 +1395,7 @@ s-under: $(GCC_PASSES)
 # A file used by all variants of C.
 
 c-common.o : c-common.c $(CONFIG_H) system.h $(TREE_H) c-tree.h c-lex.h \
-       c-common.h flags.h toplev.h output.h c-pragma.h $(RTL_H)
+       c-common.h flags.h toplev.h output.h c-pragma.h $(RTL_H) ggc.h
 
 # Language-independent files.
 
@@ -1602,7 +1602,7 @@ reg-stack.o : reg-stack.c $(CONFIG_H) system.h $(RTL_H) $(TREE_H) recog.h \
 dyn-string.o: dyn-string.c dyn-string.h $(CONFIG_H) system.h
 lists.o: lists.c $(CONFIG_H) system.h toplev.h $(RTL_H)
 
-$(out_object_file): $(out_file) $(CONFIG_H) $(TREE_H) \
+$(out_object_file): $(out_file) $(CONFIG_H) $(TREE_H) ggc.h \
    $(RTL_H) $(REGS_H) hard-reg-set.h real.h insn-config.h conditions.h \
    insn-flags.h output.h insn-attr.h insn-codes.h system.h toplev.h function.h
        $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $(out_file)
index 217f32d120c82178eacbf3e0c385634412cd9483..4fea4ac70aed22f508807aa37a4be2567b73a526 100644 (file)
@@ -29,6 +29,7 @@ Boston, MA 02111-1307, USA.  */
 #include "output.h"
 #include "c-pragma.h"
 #include "rtl.h"
+#include "ggc.h"
 
 #if USE_CPPLIB
 #include "cpplib.h"
@@ -347,7 +348,7 @@ combine_strings (strings)
       if (wide_flag)
        length = length * wchar_bytes + wide_length;
 
-      p = savealloc (length);
+      p = ggc_p ? ggc_alloc_string (NULL, length) : savealloc (length);
 
       /* Copy the individual strings into the new combined string.
         If the combined string is wide, convert the chars to ints
index 68720ec821d6218a1588829cead2c124d04e1ed1..d4c4fe1178f7a6958279ab874b372ec0fd1787d4 100644 (file)
@@ -36,6 +36,7 @@ Boston, MA 02111-1307, USA.  */
 #include "c-lex.h"
 #include "toplev.h"
 #include "defaults.h"
+#include "ggc.h"
 
 #if USE_CPPLIB
 #include "cpplib.h"
@@ -105,6 +106,9 @@ enum decl_context
 #define WCHAR_TYPE "int"
 #endif
 \f
+/* Don't do GC.  */
+int ggc_p = 0;
+
 /* a node which has tree code ERROR_MARK, and whose type is itself.
    All erroneous expressions are replaced with this node.  All functions
    that accept nodes as arguments should avoid generating error messages
@@ -342,6 +346,7 @@ tree static_ctors, static_dtors;
 /* Forward declarations.  */
 
 static struct binding_level * make_binding_level       PROTO((void));
+static void mark_binding_level         PROTO((void *));
 static void clear_limbo_values         PROTO((tree));
 static int duplicate_decls             PROTO((tree, tree, int));
 static int redeclaration_error_message PROTO((tree, tree));
@@ -2928,6 +2933,25 @@ lookup_name_current_level (name)
   return t;
 }
 \f
+/* Mark ARG for GC.  */
+void 
+mark_binding_level (arg)
+     void *arg;
+{
+  struct binding_level *level = *(struct binding_level **) arg;
+
+  while (level)
+    {
+      ggc_mark_tree (level->names);
+      ggc_mark_tree (level->tags);
+      ggc_mark_tree (level->shadowed);
+      ggc_mark_tree (level->blocks);
+      ggc_mark_tree (level->this_block);
+      ggc_mark_tree (level->parm_order);
+      level = level->level_chain;
+    }
+}
+
 /* Create the predefined scalar types of C,
    and some nodes representing standard constants (0, 1, (void *) 0).
    Initialize the global binding level.
@@ -3222,6 +3246,31 @@ init_decl_processing ()
   incomplete_decl_finalize_hook = finish_incomplete_decl;
 
   lang_get_alias_set = c_get_alias_set;
+
+  /* Record our roots.  */
+
+  ggc_add_tree_root (c_global_trees, CTI_MAX);
+  ggc_add_tree_root (&current_function_decl, 1);
+  ggc_add_tree_root (&error_mark_node, 1);
+  ggc_add_tree_root (&ptr_type_node, 1);
+  ggc_add_tree_root (&va_list_type_node, 1);
+  ggc_add_tree_root (&void_type_node, 1);
+  ggc_add_tree_root (&char_type_node, 1);
+  ggc_add_tree_root (&integer_type_node, 1);
+  ggc_add_tree_root (&unsigned_type_node, 1);
+  ggc_add_tree_root (&integer_one_node, 1);
+  ggc_add_tree_root (&integer_zero_node, 1);
+  ggc_add_tree_root (&named_labels, 1);
+  ggc_add_tree_root (&null_pointer_node, 1);
+  ggc_add_tree_root (&size_one_node, 1);
+  ggc_add_tree_root (&size_zero_node, 1);
+  ggc_add_tree_root (&shadowed_labels, 1);
+  ggc_add_root (&current_binding_level, 1, sizeof current_binding_level,
+               mark_binding_level);
+  ggc_add_root (&label_level_chain, 1, sizeof label_level_chain,
+               mark_binding_level);
+  ggc_add_tree_root (&static_ctors, 1);
+  ggc_add_tree_root (&static_dtors, 1);
 }
 
 /* Return a definition for a builtin function named NAME and whose data type
@@ -7048,6 +7097,21 @@ pop_c_function_context (f)
   f->language = 0;
 }
 
+/* Mark the language specific parts of F for GC.  */
+void
+mark_c_function_context (f)
+     struct function *f;
+{
+  struct language_function *p = f->language;
+
+  if (p == 0)
+    return;
+
+  ggc_mark_tree (p->shadowed_labels);
+  ggc_mark_tree (p->named_labels);
+  mark_binding_level (&p->binding_level);
+}
+
 /* integrate_decl_tree calls this function, but since we don't use the
    DECL_LANG_SPECIFIC field, this is a no-op.  */
 
@@ -7056,3 +7120,45 @@ copy_lang_decl (node)
      tree node ATTRIBUTE_UNUSED;
 {
 }
+
+/* Mark ARG for GC.  */
+void
+lang_mark_false_label_stack (arg)
+     struct label_node *arg;
+{
+  /* C doesn't use false_label_stack.  It better be NULL.  */
+  if (arg != NULL)
+    abort();
+}
+
+/* Mark the language specific bits in T for GC.  */
+void
+lang_mark_tree (t)
+     tree t;
+{
+  if (TREE_CODE (t) == IDENTIFIER_NODE)
+    {
+      struct lang_identifier *i = (struct lang_identifier *) t;
+      ggc_mark_tree (i->global_value);
+      ggc_mark_tree (i->local_value);
+      ggc_mark_tree (i->label_value);
+      ggc_mark_tree (i->implicit_decl);
+      ggc_mark_tree (i->error_locus);
+      ggc_mark_tree (i->limbo_value);
+    }
+}
+
+/* Free the language specific bits in T for GC.  */
+void
+lang_cleanup_tree (t)
+     tree t;
+{
+  if (TREE_CODE_CLASS (TREE_CODE (t)) == 't'
+      && TYPE_LANG_SPECIFIC (t) != NULL)
+    {
+#if 0
+      /* This is currently allocated with an obstack.  This will change.  */
+      free (TYPE_LANG_SPECIFIC (t));
+#endif
+    }
+}
index dbf46c4f3b8b22a8988b59ee9af178abeac84a27..24fc72c71b4a4df3489d5aa60a44771fc423d442 100644 (file)
@@ -28,6 +28,7 @@ Boston, MA 02111-1307, USA.  */
 #include "c-lex.h"
 #include "toplev.h"
 #include "output.h"
+#include "ggc.h"
 
 #if USE_CPPLIB
 #include "cpplib.h"
@@ -72,6 +73,9 @@ lang_init ()
 
   save_lang_status = &push_c_function_context;
   restore_lang_status = &pop_c_function_context;
+  mark_lang_status = &mark_c_function_context;
+
+  c_parse_init ();
 }
 
 void
index 34dc5e6290178f51d2fc0f51ec54928cc5c5b613..79002f3e3fd64fdafcf709a37bc12558593841a3 100644 (file)
@@ -32,6 +32,7 @@ Boston, MA 02111-1307, USA.  */
 #include "c-pragma.h"
 #include "toplev.h"
 #include "intl.h"
+#include "ggc.h"
 
 /* MULTIBYTE_CHARS support only works for native compilers.
    ??? Ideally what we want is to model widechar support after
@@ -752,7 +753,7 @@ linenum:
       goto skipline;
     }
 
-  if (!TREE_PERMANENT (yylval.ttype))
+  if (! ggc_p && !TREE_PERMANENT (yylval.ttype))
     {
       input_filename
        = (char *) permalloc (TREE_STRING_LENGTH (yylval.ttype) + 1);
index 17a6b75b20ac8b4de62322f4c715b88c81b83f63..919e0fc3dbdc8175918885d4024b0b45ca20223c 100644 (file)
@@ -80,7 +80,8 @@
 #include "flags.h"
 #include "output.h"
 #include "toplev.h"
-
+#include "ggc.h"
+  
 #ifdef MULTIBYTE_CHARS
 #include <locale.h>
 #endif
@@ -96,10 +97,10 @@ const char * const language_string = "GNU C";
 /* Cause the `yydebug' variable to be defined.  */
 #define YYDEBUG 1
 
-#line 64 "c-parse.y"
+#line 65 "c-parse.y"
 typedef union {long itype; tree ttype; enum tree_code code;
        char *filename; int lineno; int ends_in_label; } YYSTYPE;
-#line 184 "c-parse.y"
+#line 185 "c-parse.y"
 
 /* Number of statements (loosely speaking) and compound statements 
    seen so far.  */
@@ -126,6 +127,16 @@ static int undeclared_variable_notice;
 
 #define YYPRINT(FILE,YYCHAR,YYLVAL) yyprint(FILE,YYCHAR,YYLVAL)
 extern void yyprint                    PROTO ((FILE *, int, YYSTYPE));
+
+/* Add GC roots for variables local to this file.  */
+void
+c_parse_init ()
+{
+  ggc_add_tree_root (&declspec_stack, 1);
+  ggc_add_tree_root (&current_declspecs, 1);
+  ggc_add_tree_root (&prefix_attributes, 1);
+}
+
 #include <stdio.h>
 
 #ifndef __cplusplus
@@ -360,47 +371,47 @@ static const short yyrhs[] = {    -1,
 
 #if YYDEBUG != 0
 static const short yyrline[] = { 0,
-   213,   218,   232,   234,   234,   235,   237,   239,   240,   248,
-   252,   263,   268,   273,   275,   277,   278,   279,   284,   291,
-   293,   298,   303,   309,   311,   316,   321,   327,   329,   334,
-   341,   343,   346,   348,   350,   352,   354,   356,   358,   362,
-   366,   369,   372,   375,   379,   381,   384,   387,   391,   419,
-   425,   428,   431,   434,   436,   438,   442,   446,   450,   452,
-   455,   459,   486,   488,   490,   492,   494,   496,   498,   500,
-   502,   504,   506,   508,   510,   512,   516,   518,   522,   524,
-   527,   531,   533,   540,   543,   551,   562,   661,   662,   664,
-   670,   672,   695,   704,   706,   708,   712,   718,   720,   725,
-   727,   732,   734,   735,   745,   750,   752,   753,   754,   761,
-   767,   772,   775,   783,   788,   790,   791,   792,   799,   810,
-   814,   820,   825,   830,   835,   837,   839,   848,   851,   855,
-   857,   859,   864,   868,   871,   875,   878,   880,   892,   895,
-   897,   899,   903,   907,   909,   912,   925,   928,   932,   934,
-   942,   943,   944,   948,   950,   956,   957,   958,   961,   963,
-   966,   968,   971,   974,   980,   987,   989,   996,  1003,  1006,
-  1013,  1016,  1020,  1023,  1027,  1032,  1035,  1039,  1042,  1044,
-  1046,  1048,  1055,  1057,  1058,  1059,  1064,  1066,  1071,  1079,
-  1084,  1088,  1091,  1093,  1098,  1100,  1101,  1104,  1104,  1107,
-  1110,  1112,  1114,  1117,  1119,  1122,  1128,  1130,  1134,  1148,
-  1156,  1160,  1174,  1182,  1189,  1191,  1196,  1199,  1204,  1206,
-  1208,  1215,  1217,  1225,  1231,  1236,  1238,  1240,  1247,  1249,
-  1255,  1261,  1263,  1265,  1270,  1272,  1279,  1281,  1284,  1287,
-  1291,  1294,  1298,  1301,  1305,  1310,  1312,  1316,  1318,  1320,
-  1322,  1326,  1328,  1331,  1334,  1337,  1340,  1344,  1346,  1349,
-  1351,  1356,  1359,  1364,  1366,  1368,  1382,  1389,  1394,  1400,
-  1405,  1407,  1412,  1414,  1418,  1422,  1426,  1436,  1438,  1443,
-  1448,  1451,  1455,  1458,  1462,  1465,  1468,  1471,  1475,  1478,
-  1482,  1486,  1488,  1490,  1492,  1494,  1496,  1498,  1500,  1504,
-  1512,  1520,  1522,  1524,  1528,  1530,  1533,  1536,  1547,  1549,
-  1554,  1556,  1559,  1573,  1576,  1579,  1581,  1583,  1591,  1599,
-  1609,  1627,  1632,  1637,  1640,  1654,  1663,  1667,  1671,  1675,
-  1681,  1685,  1690,  1693,  1698,  1701,  1702,  1719,  1724,  1727,
-  1739,  1741,  1751,  1761,  1762,  1770,  1773,  1785,  1789,  1806,
-  1816,  1825,  1830,  1835,  1840,  1844,  1848,  1859,  1866,  1873,
-  1880,  1891,  1897,  1900,  1905,  1928,  1962,  1993,  2024,  2039,
-  2053,  2057,  2061,  2064,  2069,  2071,  2074,  2076,  2080,  2085,
-  2088,  2094,  2099,  2104,  2106,  2115,  2116,  2122,  2124,  2134,
-  2136,  2140,  2143,  2149,  2159,  2168,  2177,  2187,  2201,  2206,
-  2211,  2213,  2222,  2225,  2230,  2233,  2237
+   224,   229,   243,   245,   245,   246,   248,   250,   251,   259,
+   263,   274,   279,   284,   286,   288,   289,   290,   295,   302,
+   304,   309,   314,   320,   322,   327,   332,   338,   340,   345,
+   352,   354,   357,   359,   361,   363,   365,   367,   369,   373,
+   377,   380,   383,   386,   390,   392,   395,   398,   402,   430,
+   436,   439,   442,   445,   447,   449,   453,   457,   461,   463,
+   466,   470,   497,   499,   501,   503,   505,   507,   509,   511,
+   513,   515,   517,   519,   521,   523,   527,   529,   533,   535,
+   538,   542,   544,   551,   554,   562,   573,   672,   673,   675,
+   681,   683,   706,   715,   717,   719,   723,   729,   731,   736,
+   738,   743,   745,   746,   756,   761,   763,   764,   765,   772,
+   778,   783,   786,   794,   799,   801,   802,   803,   810,   821,
+   825,   831,   836,   841,   846,   848,   850,   859,   862,   866,
+   868,   870,   875,   879,   882,   886,   889,   891,   903,   906,
+   908,   910,   914,   918,   920,   923,   936,   939,   943,   945,
+   953,   954,   955,   959,   961,   967,   968,   969,   972,   974,
+   977,   979,   982,   985,   991,   998,  1000,  1007,  1014,  1017,
+  1024,  1027,  1031,  1034,  1038,  1043,  1046,  1050,  1053,  1055,
+  1057,  1059,  1066,  1068,  1069,  1070,  1075,  1077,  1082,  1090,
+  1095,  1099,  1102,  1104,  1109,  1111,  1112,  1115,  1115,  1118,
+  1121,  1123,  1125,  1128,  1130,  1133,  1139,  1141,  1145,  1159,
+  1167,  1171,  1185,  1193,  1200,  1202,  1207,  1210,  1215,  1217,
+  1219,  1226,  1228,  1236,  1242,  1247,  1249,  1251,  1258,  1260,
+  1266,  1272,  1274,  1276,  1281,  1283,  1290,  1292,  1295,  1298,
+  1302,  1305,  1309,  1312,  1316,  1321,  1323,  1327,  1329,  1331,
+  1333,  1337,  1339,  1342,  1345,  1348,  1351,  1355,  1357,  1360,
+  1362,  1367,  1370,  1375,  1377,  1379,  1393,  1400,  1405,  1411,
+  1416,  1418,  1423,  1425,  1429,  1433,  1437,  1447,  1449,  1454,
+  1459,  1462,  1466,  1469,  1473,  1476,  1479,  1482,  1486,  1489,
+  1493,  1497,  1499,  1501,  1503,  1505,  1507,  1509,  1511,  1515,
+  1523,  1531,  1533,  1535,  1539,  1541,  1544,  1547,  1558,  1560,
+  1565,  1567,  1570,  1584,  1587,  1590,  1592,  1594,  1602,  1610,
+  1620,  1638,  1643,  1648,  1651,  1665,  1674,  1678,  1682,  1686,
+  1692,  1696,  1701,  1704,  1709,  1712,  1713,  1730,  1735,  1738,
+  1750,  1752,  1762,  1772,  1773,  1781,  1784,  1796,  1800,  1817,
+  1827,  1836,  1841,  1846,  1851,  1855,  1859,  1870,  1877,  1884,
+  1891,  1902,  1908,  1911,  1916,  1939,  1973,  2004,  2035,  2050,
+  2064,  2068,  2072,  2075,  2080,  2082,  2085,  2087,  2091,  2096,
+  2099,  2105,  2110,  2115,  2117,  2126,  2127,  2133,  2135,  2145,
+  2147,  2151,  2154,  2160,  2170,  2179,  2188,  2198,  2212,  2217,
+  2222,  2224,  2233,  2236,  2241,  2244,  2248
 };
 #endif
 
@@ -1788,14 +1799,14 @@ yyreduce:
   switch (yyn) {
 
 case 1:
-#line 214 "c-parse.y"
+#line 225 "c-parse.y"
 { if (pedantic)
                    pedwarn ("ANSI C forbids an empty source file");
                  finish_file ();
                ;
     break;}
 case 2:
-#line 219 "c-parse.y"
+#line 230 "c-parse.y"
 {
                  /* In case there were missing closebraces,
                     get us back to the global binding level.  */
@@ -1805,15 +1816,15 @@ case 2:
                ;
     break;}
 case 3:
-#line 233 "c-parse.y"
+#line 244 "c-parse.y"
 {yyval.ttype = NULL_TREE; ;
     break;}
 case 5:
-#line 234 "c-parse.y"
+#line 245 "c-parse.y"
 {yyval.ttype = NULL_TREE; ;
     break;}
 case 9:
-#line 241 "c-parse.y"
+#line 252 "c-parse.y"
 { STRIP_NOPS (yyvsp[-2].ttype);
                  if ((TREE_CODE (yyvsp[-2].ttype) == ADDR_EXPR
                       && TREE_CODE (TREE_OPERAND (yyvsp[-2].ttype, 0)) == STRING_CST)
@@ -1823,11 +1834,11 @@ case 9:
                    error ("argument of `asm' is not a constant string"); ;
     break;}
 case 10:
-#line 249 "c-parse.y"
+#line 260 "c-parse.y"
 { pedantic = yyvsp[-1].itype; ;
     break;}
 case 11:
-#line 254 "c-parse.y"
+#line 265 "c-parse.y"
 { if (pedantic)
                    error ("ANSI C forbids data definition with no type or storage class");
                  else if (!flag_traditional)
@@ -1839,45 +1850,45 @@ case 11:
                  resume_momentary (yyvsp[-2].itype); ;
     break;}
 case 12:
-#line 264 "c-parse.y"
+#line 275 "c-parse.y"
 { current_declspecs = TREE_VALUE (declspec_stack);
                  prefix_attributes = TREE_PURPOSE (declspec_stack);
                  declspec_stack = TREE_CHAIN (declspec_stack);
                  resume_momentary (yyvsp[-2].itype); ;
     break;}
 case 13:
-#line 269 "c-parse.y"
+#line 280 "c-parse.y"
 { current_declspecs = TREE_VALUE (declspec_stack);
                  prefix_attributes = TREE_PURPOSE (declspec_stack);
                  declspec_stack = TREE_CHAIN (declspec_stack);
                  resume_momentary (yyvsp[-2].itype);  ;
     break;}
 case 14:
-#line 274 "c-parse.y"
+#line 285 "c-parse.y"
 { pedwarn ("empty declaration"); ;
     break;}
 case 15:
-#line 276 "c-parse.y"
+#line 287 "c-parse.y"
 { shadow_tag (yyvsp[-1].ttype); ;
     break;}
 case 18:
-#line 280 "c-parse.y"
+#line 291 "c-parse.y"
 { if (pedantic)
                    pedwarn ("ANSI C does not allow extra `;' outside of a function"); ;
     break;}
 case 19:
-#line 286 "c-parse.y"
+#line 297 "c-parse.y"
 { if (! start_function (current_declspecs, yyvsp[0].ttype,
                                        prefix_attributes, NULL_TREE, 0))
                    YYERROR1;
                  reinit_parse_for_function (); ;
     break;}
 case 20:
-#line 291 "c-parse.y"
+#line 302 "c-parse.y"
 { store_parm_decls (); ;
     break;}
 case 21:
-#line 293 "c-parse.y"
+#line 304 "c-parse.y"
 { finish_function (0); 
                  current_declspecs = TREE_VALUE (declspec_stack);
                  prefix_attributes = TREE_PURPOSE (declspec_stack);
@@ -1885,25 +1896,25 @@ case 21:
                  resume_momentary (yyvsp[-5].itype); ;
     break;}
 case 22:
-#line 299 "c-parse.y"
+#line 310 "c-parse.y"
 { current_declspecs = TREE_VALUE (declspec_stack);
                  prefix_attributes = TREE_PURPOSE (declspec_stack);
                  declspec_stack = TREE_CHAIN (declspec_stack);
                  resume_momentary (yyvsp[-2].itype); ;
     break;}
 case 23:
-#line 304 "c-parse.y"
+#line 315 "c-parse.y"
 { if (! start_function (current_declspecs, yyvsp[0].ttype,
                                        prefix_attributes, NULL_TREE, 0))
                    YYERROR1;
                  reinit_parse_for_function (); ;
     break;}
 case 24:
-#line 309 "c-parse.y"
+#line 320 "c-parse.y"
 { store_parm_decls (); ;
     break;}
 case 25:
-#line 311 "c-parse.y"
+#line 322 "c-parse.y"
 { finish_function (0); 
                  current_declspecs = TREE_VALUE (declspec_stack);
                  prefix_attributes = TREE_PURPOSE (declspec_stack);
@@ -1911,25 +1922,25 @@ case 25:
                  resume_momentary (yyvsp[-5].itype); ;
     break;}
 case 26:
-#line 317 "c-parse.y"
+#line 328 "c-parse.y"
 { current_declspecs = TREE_VALUE (declspec_stack);
                  prefix_attributes = TREE_PURPOSE (declspec_stack);
                  declspec_stack = TREE_CHAIN (declspec_stack);
                  resume_momentary (yyvsp[-2].itype); ;
     break;}
 case 27:
-#line 322 "c-parse.y"
+#line 333 "c-parse.y"
 { if (! start_function (NULL_TREE, yyvsp[0].ttype,
                                        prefix_attributes, NULL_TREE, 0))
                    YYERROR1;
                  reinit_parse_for_function (); ;
     break;}
 case 28:
-#line 327 "c-parse.y"
+#line 338 "c-parse.y"
 { store_parm_decls (); ;
     break;}
 case 29:
-#line 329 "c-parse.y"
+#line 340 "c-parse.y"
 { finish_function (0); 
                  current_declspecs = TREE_VALUE (declspec_stack);
                  prefix_attributes = TREE_PURPOSE (declspec_stack);
@@ -1937,72 +1948,72 @@ case 29:
                  resume_momentary (yyvsp[-5].itype); ;
     break;}
 case 30:
-#line 335 "c-parse.y"
+#line 346 "c-parse.y"
 { current_declspecs = TREE_VALUE (declspec_stack);
                  prefix_attributes = TREE_PURPOSE (declspec_stack);
                  declspec_stack = TREE_CHAIN (declspec_stack);
                  resume_momentary (yyvsp[-2].itype); ;
     break;}
 case 33:
-#line 347 "c-parse.y"
+#line 358 "c-parse.y"
 { yyval.code = ADDR_EXPR; ;
     break;}
 case 34:
-#line 349 "c-parse.y"
+#line 360 "c-parse.y"
 { yyval.code = NEGATE_EXPR; ;
     break;}
 case 35:
-#line 351 "c-parse.y"
+#line 362 "c-parse.y"
 { yyval.code = CONVERT_EXPR; ;
     break;}
 case 36:
-#line 353 "c-parse.y"
+#line 364 "c-parse.y"
 { yyval.code = PREINCREMENT_EXPR; ;
     break;}
 case 37:
-#line 355 "c-parse.y"
+#line 366 "c-parse.y"
 { yyval.code = PREDECREMENT_EXPR; ;
     break;}
 case 38:
-#line 357 "c-parse.y"
+#line 368 "c-parse.y"
 { yyval.code = BIT_NOT_EXPR; ;
     break;}
 case 39:
-#line 359 "c-parse.y"
+#line 370 "c-parse.y"
 { yyval.code = TRUTH_NOT_EXPR; ;
     break;}
 case 40:
-#line 363 "c-parse.y"
+#line 374 "c-parse.y"
 { yyval.ttype = build_compound_expr (yyvsp[0].ttype); ;
     break;}
 case 41:
-#line 368 "c-parse.y"
+#line 379 "c-parse.y"
 { yyval.ttype = NULL_TREE; ;
     break;}
 case 43:
-#line 374 "c-parse.y"
+#line 385 "c-parse.y"
 { yyval.ttype = build_tree_list (NULL_TREE, yyvsp[0].ttype); ;
     break;}
 case 44:
-#line 376 "c-parse.y"
+#line 387 "c-parse.y"
 { chainon (yyvsp[-2].ttype, build_tree_list (NULL_TREE, yyvsp[0].ttype)); ;
     break;}
 case 46:
-#line 382 "c-parse.y"
+#line 393 "c-parse.y"
 { yyval.ttype = build_indirect_ref (yyvsp[0].ttype, "unary *"); ;
     break;}
 case 47:
-#line 385 "c-parse.y"
+#line 396 "c-parse.y"
 { yyval.ttype = yyvsp[0].ttype;
                  pedantic = yyvsp[-1].itype; ;
     break;}
 case 48:
-#line 388 "c-parse.y"
+#line 399 "c-parse.y"
 { yyval.ttype = build_unary_op (yyvsp[-1].code, yyvsp[0].ttype, 0);
                  overflow_warning (yyval.ttype); ;
     break;}
 case 49:
-#line 392 "c-parse.y"
+#line 403 "c-parse.y"
 { tree label = lookup_label (yyvsp[0].ttype);
                  if (pedantic)
                    pedwarn ("ANSI C forbids `&&'");
@@ -2017,7 +2028,7 @@ case 49:
                ;
     break;}
 case 50:
-#line 420 "c-parse.y"
+#line 431 "c-parse.y"
 { skip_evaluation--;
                  if (TREE_CODE (yyvsp[0].ttype) == COMPONENT_REF
                      && DECL_C_BIT_FIELD (TREE_OPERAND (yyvsp[0].ttype, 1)))
@@ -2025,53 +2036,53 @@ case 50:
                  yyval.ttype = c_sizeof (TREE_TYPE (yyvsp[0].ttype)); ;
     break;}
 case 51:
-#line 426 "c-parse.y"
+#line 437 "c-parse.y"
 { skip_evaluation--;
                  yyval.ttype = c_sizeof (groktypename (yyvsp[-1].ttype)); ;
     break;}
 case 52:
-#line 429 "c-parse.y"
+#line 440 "c-parse.y"
 { skip_evaluation--;
                  yyval.ttype = c_alignof_expr (yyvsp[0].ttype); ;
     break;}
 case 53:
-#line 432 "c-parse.y"
+#line 443 "c-parse.y"
 { skip_evaluation--;
                  yyval.ttype = c_alignof (groktypename (yyvsp[-1].ttype)); ;
     break;}
 case 54:
-#line 435 "c-parse.y"
+#line 446 "c-parse.y"
 { yyval.ttype = build_unary_op (REALPART_EXPR, yyvsp[0].ttype, 0); ;
     break;}
 case 55:
-#line 437 "c-parse.y"
+#line 448 "c-parse.y"
 { yyval.ttype = build_unary_op (IMAGPART_EXPR, yyvsp[0].ttype, 0); ;
     break;}
 case 56:
-#line 439 "c-parse.y"
+#line 450 "c-parse.y"
 { yyval.ttype = build_va_arg (yyvsp[-3].ttype, groktypename (yyvsp[-1].ttype)); ;
     break;}
 case 57:
-#line 443 "c-parse.y"
+#line 454 "c-parse.y"
 { skip_evaluation++; ;
     break;}
 case 58:
-#line 447 "c-parse.y"
+#line 458 "c-parse.y"
 { skip_evaluation++; ;
     break;}
 case 60:
-#line 453 "c-parse.y"
+#line 464 "c-parse.y"
 { tree type = groktypename (yyvsp[-2].ttype);
                  yyval.ttype = build_c_cast (type, yyvsp[0].ttype); ;
     break;}
 case 61:
-#line 456 "c-parse.y"
+#line 467 "c-parse.y"
 { start_init (NULL_TREE, NULL, 0);
                  yyvsp[-2].ttype = groktypename (yyvsp[-2].ttype);
                  really_start_incremental_init (yyvsp[-2].ttype); ;
     break;}
 case 62:
-#line 460 "c-parse.y"
+#line 471 "c-parse.y"
 { char *name;
                  tree result = pop_init_level (0);
                  tree type = yyvsp[-5].ttype;
@@ -2098,90 +2109,90 @@ case 62:
                ;
     break;}
 case 64:
-#line 489 "c-parse.y"
+#line 500 "c-parse.y"
 { yyval.ttype = parser_build_binary_op (yyvsp[-1].code, yyvsp[-2].ttype, yyvsp[0].ttype); ;
     break;}
 case 65:
-#line 491 "c-parse.y"
+#line 502 "c-parse.y"
 { yyval.ttype = parser_build_binary_op (yyvsp[-1].code, yyvsp[-2].ttype, yyvsp[0].ttype); ;
     break;}
 case 66:
-#line 493 "c-parse.y"
+#line 504 "c-parse.y"
 { yyval.ttype = parser_build_binary_op (yyvsp[-1].code, yyvsp[-2].ttype, yyvsp[0].ttype); ;
     break;}
 case 67:
-#line 495 "c-parse.y"
+#line 506 "c-parse.y"
 { yyval.ttype = parser_build_binary_op (yyvsp[-1].code, yyvsp[-2].ttype, yyvsp[0].ttype); ;
     break;}
 case 68:
-#line 497 "c-parse.y"
+#line 508 "c-parse.y"
 { yyval.ttype = parser_build_binary_op (yyvsp[-1].code, yyvsp[-2].ttype, yyvsp[0].ttype); ;
     break;}
 case 69:
-#line 499 "c-parse.y"
+#line 510 "c-parse.y"
 { yyval.ttype = parser_build_binary_op (yyvsp[-1].code, yyvsp[-2].ttype, yyvsp[0].ttype); ;
     break;}
 case 70:
-#line 501 "c-parse.y"
+#line 512 "c-parse.y"
 { yyval.ttype = parser_build_binary_op (yyvsp[-1].code, yyvsp[-2].ttype, yyvsp[0].ttype); ;
     break;}
 case 71:
-#line 503 "c-parse.y"
+#line 514 "c-parse.y"
 { yyval.ttype = parser_build_binary_op (yyvsp[-1].code, yyvsp[-2].ttype, yyvsp[0].ttype); ;
     break;}
 case 72:
-#line 505 "c-parse.y"
+#line 516 "c-parse.y"
 { yyval.ttype = parser_build_binary_op (yyvsp[-1].code, yyvsp[-2].ttype, yyvsp[0].ttype); ;
     break;}
 case 73:
-#line 507 "c-parse.y"
+#line 518 "c-parse.y"
 { yyval.ttype = parser_build_binary_op (yyvsp[-1].code, yyvsp[-2].ttype, yyvsp[0].ttype); ;
     break;}
 case 74:
-#line 509 "c-parse.y"
+#line 520 "c-parse.y"
 { yyval.ttype = parser_build_binary_op (yyvsp[-1].code, yyvsp[-2].ttype, yyvsp[0].ttype); ;
     break;}
 case 75:
-#line 511 "c-parse.y"
+#line 522 "c-parse.y"
 { yyval.ttype = parser_build_binary_op (yyvsp[-1].code, yyvsp[-2].ttype, yyvsp[0].ttype); ;
     break;}
 case 76:
-#line 513 "c-parse.y"
+#line 524 "c-parse.y"
 { yyvsp[-1].ttype = truthvalue_conversion (default_conversion (yyvsp[-1].ttype));
                  skip_evaluation += yyvsp[-1].ttype == boolean_false_node; ;
     break;}
 case 77:
-#line 516 "c-parse.y"
+#line 527 "c-parse.y"
 { skip_evaluation -= yyvsp[-3].ttype == boolean_false_node;
                  yyval.ttype = parser_build_binary_op (TRUTH_ANDIF_EXPR, yyvsp[-3].ttype, yyvsp[0].ttype); ;
     break;}
 case 78:
-#line 519 "c-parse.y"
+#line 530 "c-parse.y"
 { yyvsp[-1].ttype = truthvalue_conversion (default_conversion (yyvsp[-1].ttype));
                  skip_evaluation += yyvsp[-1].ttype == boolean_true_node; ;
     break;}
 case 79:
-#line 522 "c-parse.y"
+#line 533 "c-parse.y"
 { skip_evaluation -= yyvsp[-3].ttype == boolean_true_node;
                  yyval.ttype = parser_build_binary_op (TRUTH_ORIF_EXPR, yyvsp[-3].ttype, yyvsp[0].ttype); ;
     break;}
 case 80:
-#line 525 "c-parse.y"
+#line 536 "c-parse.y"
 { yyvsp[-1].ttype = truthvalue_conversion (default_conversion (yyvsp[-1].ttype));
                  skip_evaluation += yyvsp[-1].ttype == boolean_false_node; ;
     break;}
 case 81:
-#line 528 "c-parse.y"
+#line 539 "c-parse.y"
 { skip_evaluation += ((yyvsp[-4].ttype == boolean_true_node)
                                      - (yyvsp[-4].ttype == boolean_false_node)); ;
     break;}
 case 82:
-#line 531 "c-parse.y"
+#line 542 "c-parse.y"
 { skip_evaluation -= yyvsp[-6].ttype == boolean_true_node;
                  yyval.ttype = build_conditional_expr (yyvsp[-6].ttype, yyvsp[-3].ttype, yyvsp[0].ttype); ;
     break;}
 case 83:
-#line 534 "c-parse.y"
+#line 545 "c-parse.y"
 { if (pedantic)
                    pedwarn ("ANSI C forbids omitting the middle term of a ?: expression");
                  /* Make sure first operand is calculated only once.  */
@@ -2190,12 +2201,12 @@ case 83:
                  skip_evaluation += yyvsp[-1].ttype == boolean_true_node; ;
     break;}
 case 84:
-#line 541 "c-parse.y"
+#line 552 "c-parse.y"
 { skip_evaluation -= yyvsp[-4].ttype == boolean_true_node;
                  yyval.ttype = build_conditional_expr (yyvsp[-4].ttype, yyvsp[-3].ttype, yyvsp[0].ttype); ;
     break;}
 case 85:
-#line 544 "c-parse.y"
+#line 555 "c-parse.y"
 { char class;
                  yyval.ttype = build_modify_expr (yyvsp[-2].ttype, NOP_EXPR, yyvsp[0].ttype);
                  class = TREE_CODE_CLASS (TREE_CODE (yyval.ttype));
@@ -2205,7 +2216,7 @@ case 85:
                ;
     break;}
 case 86:
-#line 552 "c-parse.y"
+#line 563 "c-parse.y"
 { char class;
                  yyval.ttype = build_modify_expr (yyvsp[-2].ttype, yyvsp[-1].code, yyvsp[0].ttype);
                  /* This inhibits warnings in truthvalue_conversion.  */
@@ -2216,7 +2227,7 @@ case 86:
                ;
     break;}
 case 87:
-#line 564 "c-parse.y"
+#line 575 "c-parse.y"
 {
                  yyval.ttype = lastiddecl;
                  if (!yyval.ttype || yyval.ttype == error_mark_node)
@@ -2316,11 +2327,11 @@ case 87:
                ;
     break;}
 case 89:
-#line 663 "c-parse.y"
+#line 674 "c-parse.y"
 { yyval.ttype = combine_strings (yyvsp[0].ttype); ;
     break;}
 case 90:
-#line 665 "c-parse.y"
+#line 676 "c-parse.y"
 { char class = TREE_CODE_CLASS (TREE_CODE (yyvsp[-1].ttype));
                  if (class == 'e' || class == '1'
                      || class == '2' || class == '<')
@@ -2328,11 +2339,11 @@ case 90:
                  yyval.ttype = yyvsp[-1].ttype; ;
     break;}
 case 91:
-#line 671 "c-parse.y"
+#line 682 "c-parse.y"
 { yyval.ttype = error_mark_node; ;
     break;}
 case 92:
-#line 673 "c-parse.y"
+#line 684 "c-parse.y"
 { tree rtl_exp;
                  if (pedantic)
                    pedwarn ("ANSI C forbids braced-groups within expressions");
@@ -2357,7 +2368,7 @@ case 92:
                ;
     break;}
 case 93:
-#line 696 "c-parse.y"
+#line 707 "c-parse.y"
 {
                  /* Make sure we call expand_end_stmt_expr.  Otherwise
                     we are likely to lose sequences and crash later.  */
@@ -2368,21 +2379,21 @@ case 93:
                ;
     break;}
 case 94:
-#line 705 "c-parse.y"
+#line 716 "c-parse.y"
 { yyval.ttype = build_function_call (yyvsp[-3].ttype, yyvsp[-1].ttype); ;
     break;}
 case 95:
-#line 707 "c-parse.y"
+#line 718 "c-parse.y"
 { yyval.ttype = build_array_ref (yyvsp[-3].ttype, yyvsp[-1].ttype); ;
     break;}
 case 96:
-#line 709 "c-parse.y"
+#line 720 "c-parse.y"
 {
                    yyval.ttype = build_component_ref (yyvsp[-2].ttype, yyvsp[0].ttype);
                ;
     break;}
 case 97:
-#line 713 "c-parse.y"
+#line 724 "c-parse.y"
 {
                   tree expr = build_indirect_ref (yyvsp[-2].ttype, "->");
 
@@ -2390,56 +2401,56 @@ case 97:
                ;
     break;}
 case 98:
-#line 719 "c-parse.y"
+#line 730 "c-parse.y"
 { yyval.ttype = build_unary_op (POSTINCREMENT_EXPR, yyvsp[-1].ttype, 0); ;
     break;}
 case 99:
-#line 721 "c-parse.y"
+#line 732 "c-parse.y"
 { yyval.ttype = build_unary_op (POSTDECREMENT_EXPR, yyvsp[-1].ttype, 0); ;
     break;}
 case 101:
-#line 728 "c-parse.y"
+#line 739 "c-parse.y"
 { yyval.ttype = chainon (yyvsp[-1].ttype, yyvsp[0].ttype); ;
     break;}
 case 104:
-#line 737 "c-parse.y"
+#line 748 "c-parse.y"
 { c_mark_varargs ();
                  if (pedantic)
                    pedwarn ("ANSI C does not permit use of `varargs.h'"); ;
     break;}
 case 105:
-#line 747 "c-parse.y"
+#line 758 "c-parse.y"
 { ;
     break;}
 case 110:
-#line 763 "c-parse.y"
+#line 774 "c-parse.y"
 { current_declspecs = TREE_VALUE (declspec_stack);
                  prefix_attributes = TREE_PURPOSE (declspec_stack);
                  declspec_stack = TREE_CHAIN (declspec_stack);
                  resume_momentary (yyvsp[-2].itype); ;
     break;}
 case 111:
-#line 768 "c-parse.y"
+#line 779 "c-parse.y"
 { current_declspecs = TREE_VALUE (declspec_stack);     
                  prefix_attributes = TREE_PURPOSE (declspec_stack);
                  declspec_stack = TREE_CHAIN (declspec_stack);
                  resume_momentary (yyvsp[-2].itype); ;
     break;}
 case 112:
-#line 773 "c-parse.y"
+#line 784 "c-parse.y"
 { shadow_tag_warned (yyvsp[-1].ttype, 1);
                  pedwarn ("empty declaration"); ;
     break;}
 case 113:
-#line 776 "c-parse.y"
+#line 787 "c-parse.y"
 { pedwarn ("empty declaration"); ;
     break;}
 case 114:
-#line 785 "c-parse.y"
+#line 796 "c-parse.y"
 { ;
     break;}
 case 119:
-#line 800 "c-parse.y"
+#line 811 "c-parse.y"
 { yyval.itype = suspend_momentary ();
                  pending_xref_error ();
                  declspec_stack = tree_cons (prefix_attributes,
@@ -2449,131 +2460,131 @@ case 119:
                                     &current_declspecs, &prefix_attributes); ;
     break;}
 case 120:
-#line 811 "c-parse.y"
+#line 822 "c-parse.y"
 { prefix_attributes = chainon (prefix_attributes, yyvsp[0].ttype); ;
     break;}
 case 121:
-#line 816 "c-parse.y"
+#line 827 "c-parse.y"
 { current_declspecs = TREE_VALUE (declspec_stack);
                  prefix_attributes = TREE_PURPOSE (declspec_stack);
                  declspec_stack = TREE_CHAIN (declspec_stack);
                  resume_momentary (yyvsp[-2].itype); ;
     break;}
 case 122:
-#line 821 "c-parse.y"
+#line 832 "c-parse.y"
 { current_declspecs = TREE_VALUE (declspec_stack);
                  prefix_attributes = TREE_PURPOSE (declspec_stack);
                  declspec_stack = TREE_CHAIN (declspec_stack);
                  resume_momentary (yyvsp[-2].itype); ;
     break;}
 case 123:
-#line 826 "c-parse.y"
+#line 837 "c-parse.y"
 { current_declspecs = TREE_VALUE (declspec_stack);
                  prefix_attributes = TREE_PURPOSE (declspec_stack);
                  declspec_stack = TREE_CHAIN (declspec_stack);
                  resume_momentary (yyvsp[-1].itype); ;
     break;}
 case 124:
-#line 831 "c-parse.y"
+#line 842 "c-parse.y"
 { current_declspecs = TREE_VALUE (declspec_stack);
                  prefix_attributes = TREE_PURPOSE (declspec_stack);
                  declspec_stack = TREE_CHAIN (declspec_stack);
                  resume_momentary (yyvsp[-1].itype); ;
     break;}
 case 125:
-#line 836 "c-parse.y"
+#line 847 "c-parse.y"
 { shadow_tag (yyvsp[-1].ttype); ;
     break;}
 case 126:
-#line 838 "c-parse.y"
+#line 849 "c-parse.y"
 { pedwarn ("empty declaration"); ;
     break;}
 case 127:
-#line 840 "c-parse.y"
+#line 851 "c-parse.y"
 { pedantic = yyvsp[-1].itype; ;
     break;}
 case 128:
-#line 850 "c-parse.y"
+#line 861 "c-parse.y"
 { yyval.ttype = tree_cons (NULL_TREE, yyvsp[-1].ttype, yyvsp[0].ttype); ;
     break;}
 case 129:
-#line 852 "c-parse.y"
+#line 863 "c-parse.y"
 { yyval.ttype = chainon (yyvsp[0].ttype, tree_cons (NULL_TREE, yyvsp[-1].ttype, yyvsp[-2].ttype)); ;
     break;}
 case 130:
-#line 856 "c-parse.y"
+#line 867 "c-parse.y"
 { yyval.ttype = NULL_TREE; ;
     break;}
 case 131:
-#line 858 "c-parse.y"
+#line 869 "c-parse.y"
 { yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ttype, yyvsp[-1].ttype); ;
     break;}
 case 132:
-#line 860 "c-parse.y"
+#line 871 "c-parse.y"
 { if (extra_warnings)
                    warning ("`%s' is not at beginning of declaration",
                             IDENTIFIER_POINTER (yyvsp[0].ttype));
                  yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ttype, yyvsp[-1].ttype); ;
     break;}
 case 133:
-#line 865 "c-parse.y"
+#line 876 "c-parse.y"
 { yyval.ttype = tree_cons (yyvsp[0].ttype, NULL_TREE, yyvsp[-1].ttype); ;
     break;}
 case 134:
-#line 870 "c-parse.y"
+#line 881 "c-parse.y"
 { yyval.ttype = tree_cons (NULL_TREE, yyvsp[-1].ttype, yyvsp[0].ttype); ;
     break;}
 case 135:
-#line 872 "c-parse.y"
+#line 883 "c-parse.y"
 { yyval.ttype = chainon (yyvsp[0].ttype, tree_cons (NULL_TREE, yyvsp[-1].ttype, yyvsp[-2].ttype)); ;
     break;}
 case 136:
-#line 877 "c-parse.y"
+#line 888 "c-parse.y"
 { yyval.ttype = NULL_TREE; ;
     break;}
 case 137:
-#line 879 "c-parse.y"
+#line 890 "c-parse.y"
 { yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ttype, yyvsp[-1].ttype); ;
     break;}
 case 138:
-#line 881 "c-parse.y"
+#line 892 "c-parse.y"
 { if (extra_warnings)
                    warning ("`%s' is not at beginning of declaration",
                             IDENTIFIER_POINTER (yyvsp[0].ttype));
                  yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ttype, yyvsp[-1].ttype); ;
     break;}
 case 139:
-#line 894 "c-parse.y"
+#line 905 "c-parse.y"
 { yyval.ttype = yyvsp[0].ttype; ;
     break;}
 case 140:
-#line 896 "c-parse.y"
+#line 907 "c-parse.y"
 { yyval.ttype = tree_cons (yyvsp[0].ttype, NULL_TREE, NULL_TREE); ;
     break;}
 case 141:
-#line 898 "c-parse.y"
+#line 909 "c-parse.y"
 { yyval.ttype = chainon (yyvsp[0].ttype, yyvsp[-1].ttype); ;
     break;}
 case 142:
-#line 900 "c-parse.y"
+#line 911 "c-parse.y"
 { yyval.ttype = tree_cons (yyvsp[0].ttype, NULL_TREE, yyvsp[-1].ttype); ;
     break;}
 case 143:
-#line 905 "c-parse.y"
+#line 916 "c-parse.y"
 { yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ttype, NULL_TREE);
                  TREE_STATIC (yyval.ttype) = 1; ;
     break;}
 case 144:
-#line 908 "c-parse.y"
+#line 919 "c-parse.y"
 { yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ttype, NULL_TREE); ;
     break;}
 case 145:
-#line 910 "c-parse.y"
+#line 921 "c-parse.y"
 { yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ttype, yyvsp[-1].ttype);
                  TREE_STATIC (yyval.ttype) = 1; ;
     break;}
 case 146:
-#line 913 "c-parse.y"
+#line 924 "c-parse.y"
 { if (extra_warnings && TREE_STATIC (yyvsp[-1].ttype))
                    warning ("`%s' is not at beginning of declaration",
                             IDENTIFIER_POINTER (yyvsp[0].ttype));
@@ -2581,138 +2592,138 @@ case 146:
                  TREE_STATIC (yyval.ttype) = TREE_STATIC (yyvsp[-1].ttype); ;
     break;}
 case 147:
-#line 927 "c-parse.y"
+#line 938 "c-parse.y"
 { yyval.ttype = tree_cons (NULL_TREE, yyvsp[-1].ttype, yyvsp[0].ttype); ;
     break;}
 case 148:
-#line 929 "c-parse.y"
+#line 940 "c-parse.y"
 { yyval.ttype = chainon (yyvsp[0].ttype, tree_cons (NULL_TREE, yyvsp[-1].ttype, yyvsp[-2].ttype)); ;
     break;}
 case 149:
-#line 933 "c-parse.y"
+#line 944 "c-parse.y"
 { yyval.ttype = NULL_TREE; ;
     break;}
 case 150:
-#line 935 "c-parse.y"
+#line 946 "c-parse.y"
 { yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ttype, yyvsp[-1].ttype); ;
     break;}
 case 153:
-#line 945 "c-parse.y"
+#line 956 "c-parse.y"
 { /* For a typedef name, record the meaning, not the name.
                     In case of `foo foo, bar;'.  */
                  yyval.ttype = lookup_name (yyvsp[0].ttype); ;
     break;}
 case 154:
-#line 949 "c-parse.y"
+#line 960 "c-parse.y"
 { yyval.ttype = TREE_TYPE (yyvsp[-1].ttype); ;
     break;}
 case 155:
-#line 951 "c-parse.y"
+#line 962 "c-parse.y"
 { yyval.ttype = groktypename (yyvsp[-1].ttype); ;
     break;}
 case 163:
-#line 973 "c-parse.y"
+#line 984 "c-parse.y"
 { yyval.ttype = NULL_TREE; ;
     break;}
 case 164:
-#line 975 "c-parse.y"
+#line 986 "c-parse.y"
 { if (TREE_CHAIN (yyvsp[-1].ttype)) yyvsp[-1].ttype = combine_strings (yyvsp[-1].ttype);
                  yyval.ttype = yyvsp[-1].ttype;
                ;
     break;}
 case 165:
-#line 982 "c-parse.y"
+#line 993 "c-parse.y"
 { yyval.ttype = start_decl (yyvsp[-3].ttype, current_declspecs, 1,
                                          yyvsp[-1].ttype, prefix_attributes);
                  start_init (yyval.ttype, yyvsp[-2].ttype, global_bindings_p ()); ;
     break;}
 case 166:
-#line 987 "c-parse.y"
+#line 998 "c-parse.y"
 { finish_init ();
                  finish_decl (yyvsp[-1].ttype, yyvsp[0].ttype, yyvsp[-4].ttype); ;
     break;}
 case 167:
-#line 990 "c-parse.y"
+#line 1001 "c-parse.y"
 { tree d = start_decl (yyvsp[-2].ttype, current_declspecs, 0,
                                       yyvsp[0].ttype, prefix_attributes);
                  finish_decl (d, NULL_TREE, yyvsp[-1].ttype); 
                 ;
     break;}
 case 168:
-#line 998 "c-parse.y"
+#line 1009 "c-parse.y"
 { yyval.ttype = start_decl (yyvsp[-3].ttype, current_declspecs, 1,
                                          yyvsp[-1].ttype, prefix_attributes);
                  start_init (yyval.ttype, yyvsp[-2].ttype, global_bindings_p ()); ;
     break;}
 case 169:
-#line 1003 "c-parse.y"
+#line 1014 "c-parse.y"
 { finish_init ();
                  decl_attributes (yyvsp[-1].ttype, yyvsp[-3].ttype, prefix_attributes);
                  finish_decl (yyvsp[-1].ttype, yyvsp[0].ttype, yyvsp[-4].ttype); ;
     break;}
 case 170:
-#line 1007 "c-parse.y"
+#line 1018 "c-parse.y"
 { tree d = start_decl (yyvsp[-2].ttype, current_declspecs, 0,
                                       yyvsp[0].ttype, prefix_attributes);
                  finish_decl (d, NULL_TREE, yyvsp[-1].ttype); ;
     break;}
 case 171:
-#line 1015 "c-parse.y"
+#line 1026 "c-parse.y"
 { yyval.ttype = NULL_TREE; ;
     break;}
 case 172:
-#line 1017 "c-parse.y"
+#line 1028 "c-parse.y"
 { yyval.ttype = yyvsp[0].ttype; ;
     break;}
 case 173:
-#line 1022 "c-parse.y"
+#line 1033 "c-parse.y"
 { yyval.ttype = yyvsp[0].ttype; ;
     break;}
 case 174:
-#line 1024 "c-parse.y"
+#line 1035 "c-parse.y"
 { yyval.ttype = chainon (yyvsp[-1].ttype, yyvsp[0].ttype); ;
     break;}
 case 175:
-#line 1029 "c-parse.y"
+#line 1040 "c-parse.y"
 { yyval.ttype = yyvsp[-2].ttype; ;
     break;}
 case 176:
-#line 1034 "c-parse.y"
+#line 1045 "c-parse.y"
 { yyval.ttype = yyvsp[0].ttype; ;
     break;}
 case 177:
-#line 1036 "c-parse.y"
+#line 1047 "c-parse.y"
 { yyval.ttype = chainon (yyvsp[-2].ttype, yyvsp[0].ttype); ;
     break;}
 case 178:
-#line 1041 "c-parse.y"
+#line 1052 "c-parse.y"
 { yyval.ttype = NULL_TREE; ;
     break;}
 case 179:
-#line 1043 "c-parse.y"
+#line 1054 "c-parse.y"
 { yyval.ttype = build_tree_list (yyvsp[0].ttype, NULL_TREE); ;
     break;}
 case 180:
-#line 1045 "c-parse.y"
+#line 1056 "c-parse.y"
 { yyval.ttype = build_tree_list (yyvsp[-3].ttype, build_tree_list (NULL_TREE, yyvsp[-1].ttype)); ;
     break;}
 case 181:
-#line 1047 "c-parse.y"
+#line 1058 "c-parse.y"
 { yyval.ttype = build_tree_list (yyvsp[-5].ttype, tree_cons (NULL_TREE, yyvsp[-3].ttype, yyvsp[-1].ttype)); ;
     break;}
 case 182:
-#line 1049 "c-parse.y"
+#line 1060 "c-parse.y"
 { yyval.ttype = build_tree_list (yyvsp[-3].ttype, yyvsp[-1].ttype); ;
     break;}
 case 188:
-#line 1067 "c-parse.y"
+#line 1078 "c-parse.y"
 { really_start_incremental_init (NULL_TREE);
                  /* Note that the call to clear_momentary
                     is in process_init_element.  */
                  push_momentary (); ;
     break;}
 case 189:
-#line 1072 "c-parse.y"
+#line 1083 "c-parse.y"
 { yyval.ttype = pop_init_level (0);
                  if (yyval.ttype == error_mark_node
                      && ! (yychar == STRING || yychar == CONSTANT))
@@ -2721,44 +2732,44 @@ case 189:
                    pop_momentary_nofree (); ;
     break;}
 case 190:
-#line 1080 "c-parse.y"
+#line 1091 "c-parse.y"
 { yyval.ttype = error_mark_node; ;
     break;}
 case 191:
-#line 1086 "c-parse.y"
+#line 1097 "c-parse.y"
 { if (pedantic)
                    pedwarn ("ANSI C forbids empty initializer braces"); ;
     break;}
 case 197:
-#line 1102 "c-parse.y"
+#line 1113 "c-parse.y"
 { set_init_label (yyvsp[-1].ttype); ;
     break;}
 case 200:
-#line 1109 "c-parse.y"
+#line 1120 "c-parse.y"
 { push_init_level (0); ;
     break;}
 case 201:
-#line 1111 "c-parse.y"
+#line 1122 "c-parse.y"
 { process_init_element (pop_init_level (0)); ;
     break;}
 case 202:
-#line 1113 "c-parse.y"
+#line 1124 "c-parse.y"
 { process_init_element (yyvsp[0].ttype); ;
     break;}
 case 206:
-#line 1124 "c-parse.y"
+#line 1135 "c-parse.y"
 { set_init_label (yyvsp[0].ttype); ;
     break;}
 case 207:
-#line 1129 "c-parse.y"
+#line 1140 "c-parse.y"
 { set_init_index (yyvsp[-3].ttype, yyvsp[-1].ttype); ;
     break;}
 case 208:
-#line 1131 "c-parse.y"
+#line 1142 "c-parse.y"
 { set_init_index (yyvsp[-1].ttype, NULL_TREE); ;
     break;}
 case 209:
-#line 1136 "c-parse.y"
+#line 1147 "c-parse.y"
 { if (pedantic)
                    pedwarn ("ANSI C forbids nested functions");
 
@@ -2772,16 +2783,16 @@ case 209:
                  reinit_parse_for_function (); ;
     break;}
 case 210:
-#line 1148 "c-parse.y"
+#line 1159 "c-parse.y"
 { store_parm_decls (); ;
     break;}
 case 211:
-#line 1156 "c-parse.y"
+#line 1167 "c-parse.y"
 { finish_function (1);
                  pop_function_context (); ;
     break;}
 case 212:
-#line 1162 "c-parse.y"
+#line 1173 "c-parse.y"
 { if (pedantic)
                    pedwarn ("ANSI C forbids nested functions");
 
@@ -2795,211 +2806,211 @@ case 212:
                  reinit_parse_for_function (); ;
     break;}
 case 213:
-#line 1174 "c-parse.y"
+#line 1185 "c-parse.y"
 { store_parm_decls (); ;
     break;}
 case 214:
-#line 1182 "c-parse.y"
+#line 1193 "c-parse.y"
 { finish_function (1);
                  pop_function_context (); ;
     break;}
 case 217:
-#line 1198 "c-parse.y"
+#line 1209 "c-parse.y"
 { yyval.ttype = yyvsp[-1].ttype; ;
     break;}
 case 218:
-#line 1200 "c-parse.y"
+#line 1211 "c-parse.y"
 { yyval.ttype = build_nt (CALL_EXPR, yyvsp[-2].ttype, yyvsp[0].ttype, NULL_TREE); ;
     break;}
 case 219:
-#line 1205 "c-parse.y"
+#line 1216 "c-parse.y"
 { yyval.ttype = build_nt (ARRAY_REF, yyvsp[-3].ttype, yyvsp[-1].ttype); ;
     break;}
 case 220:
-#line 1207 "c-parse.y"
+#line 1218 "c-parse.y"
 { yyval.ttype = build_nt (ARRAY_REF, yyvsp[-2].ttype, NULL_TREE); ;
     break;}
 case 221:
-#line 1209 "c-parse.y"
+#line 1220 "c-parse.y"
 { yyval.ttype = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); ;
     break;}
 case 222:
-#line 1216 "c-parse.y"
+#line 1227 "c-parse.y"
 { yyval.ttype = yyvsp[0].ttype; ;
     break;}
 case 224:
-#line 1227 "c-parse.y"
+#line 1238 "c-parse.y"
 { yyval.ttype = build_nt (CALL_EXPR, yyvsp[-2].ttype, yyvsp[0].ttype, NULL_TREE); ;
     break;}
 case 225:
-#line 1232 "c-parse.y"
+#line 1243 "c-parse.y"
 { yyval.ttype = build_nt (ARRAY_REF, yyvsp[-3].ttype, NULL_TREE);
                  if (! flag_isoc9x)
                    error ("`[*]' in parameter declaration only allowed in ISO C 9x");
                ;
     break;}
 case 226:
-#line 1237 "c-parse.y"
+#line 1248 "c-parse.y"
 { yyval.ttype = build_nt (ARRAY_REF, yyvsp[-3].ttype, yyvsp[-1].ttype); ;
     break;}
 case 227:
-#line 1239 "c-parse.y"
+#line 1250 "c-parse.y"
 { yyval.ttype = build_nt (ARRAY_REF, yyvsp[-2].ttype, NULL_TREE); ;
     break;}
 case 228:
-#line 1241 "c-parse.y"
+#line 1252 "c-parse.y"
 { yyval.ttype = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); ;
     break;}
 case 229:
-#line 1248 "c-parse.y"
+#line 1259 "c-parse.y"
 { yyval.ttype = yyvsp[0].ttype; ;
     break;}
 case 231:
-#line 1257 "c-parse.y"
+#line 1268 "c-parse.y"
 { yyval.ttype = build_nt (CALL_EXPR, yyvsp[-2].ttype, yyvsp[0].ttype, NULL_TREE); ;
     break;}
 case 232:
-#line 1262 "c-parse.y"
+#line 1273 "c-parse.y"
 { yyval.ttype = yyvsp[-1].ttype; ;
     break;}
 case 233:
-#line 1264 "c-parse.y"
+#line 1275 "c-parse.y"
 { yyval.ttype = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); ;
     break;}
 case 234:
-#line 1266 "c-parse.y"
+#line 1277 "c-parse.y"
 { yyval.ttype = build_nt (ARRAY_REF, yyvsp[-3].ttype, NULL_TREE);
                  if (! flag_isoc9x)
                    error ("`[*]' in parameter declaration only allowed in ISO C 9x");
                ;
     break;}
 case 235:
-#line 1271 "c-parse.y"
+#line 1282 "c-parse.y"
 { yyval.ttype = build_nt (ARRAY_REF, yyvsp[-3].ttype, yyvsp[-1].ttype); ;
     break;}
 case 236:
-#line 1273 "c-parse.y"
+#line 1284 "c-parse.y"
 { yyval.ttype = build_nt (ARRAY_REF, yyvsp[-2].ttype, NULL_TREE); ;
     break;}
 case 237:
-#line 1280 "c-parse.y"
+#line 1291 "c-parse.y"
 { yyval.ttype = yyvsp[0].ttype; ;
     break;}
 case 239:
-#line 1286 "c-parse.y"
+#line 1297 "c-parse.y"
 { yyval.ttype = NULL_TREE; ;
     break;}
 case 240:
-#line 1288 "c-parse.y"
+#line 1299 "c-parse.y"
 { yyval.ttype = yyvsp[0].ttype; ;
     break;}
 case 241:
-#line 1293 "c-parse.y"
+#line 1304 "c-parse.y"
 { yyval.ttype = NULL_TREE; ;
     break;}
 case 242:
-#line 1295 "c-parse.y"
+#line 1306 "c-parse.y"
 { yyval.ttype = yyvsp[0].ttype; ;
     break;}
 case 243:
-#line 1300 "c-parse.y"
+#line 1311 "c-parse.y"
 { yyval.ttype = NULL_TREE; ;
     break;}
 case 244:
-#line 1302 "c-parse.y"
+#line 1313 "c-parse.y"
 { yyval.ttype = yyvsp[0].ttype; ;
     break;}
 case 245:
-#line 1307 "c-parse.y"
+#line 1318 "c-parse.y"
 { yyval.ttype = start_struct (RECORD_TYPE, yyvsp[-1].ttype);
                  /* Start scope of tag before parsing components.  */
                ;
     break;}
 case 246:
-#line 1311 "c-parse.y"
+#line 1322 "c-parse.y"
 { yyval.ttype = finish_struct (yyvsp[-3].ttype, yyvsp[-2].ttype, chainon (yyvsp[-6].ttype, yyvsp[0].ttype)); ;
     break;}
 case 247:
-#line 1313 "c-parse.y"
+#line 1324 "c-parse.y"
 { yyval.ttype = finish_struct (start_struct (RECORD_TYPE, NULL_TREE),
                                      yyvsp[-2].ttype, chainon (yyvsp[-4].ttype, yyvsp[0].ttype));
                ;
     break;}
 case 248:
-#line 1317 "c-parse.y"
+#line 1328 "c-parse.y"
 { yyval.ttype = xref_tag (RECORD_TYPE, yyvsp[0].ttype); ;
     break;}
 case 249:
-#line 1319 "c-parse.y"
+#line 1330 "c-parse.y"
 { yyval.ttype = start_struct (UNION_TYPE, yyvsp[-1].ttype); ;
     break;}
 case 250:
-#line 1321 "c-parse.y"
+#line 1332 "c-parse.y"
 { yyval.ttype = finish_struct (yyvsp[-3].ttype, yyvsp[-2].ttype, chainon (yyvsp[-6].ttype, yyvsp[0].ttype)); ;
     break;}
 case 251:
-#line 1323 "c-parse.y"
+#line 1334 "c-parse.y"
 { yyval.ttype = finish_struct (start_struct (UNION_TYPE, NULL_TREE),
                                      yyvsp[-2].ttype, chainon (yyvsp[-4].ttype, yyvsp[0].ttype));
                ;
     break;}
 case 252:
-#line 1327 "c-parse.y"
+#line 1338 "c-parse.y"
 { yyval.ttype = xref_tag (UNION_TYPE, yyvsp[0].ttype); ;
     break;}
 case 253:
-#line 1329 "c-parse.y"
+#line 1340 "c-parse.y"
 { yyvsp[0].itype = suspend_momentary ();
                  yyval.ttype = start_enum (yyvsp[-1].ttype); ;
     break;}
 case 254:
-#line 1332 "c-parse.y"
+#line 1343 "c-parse.y"
 { yyval.ttype= finish_enum (yyvsp[-4].ttype, nreverse (yyvsp[-3].ttype), chainon (yyvsp[-7].ttype, yyvsp[0].ttype));
                  resume_momentary (yyvsp[-5].itype); ;
     break;}
 case 255:
-#line 1335 "c-parse.y"
+#line 1346 "c-parse.y"
 { yyvsp[0].itype = suspend_momentary ();
                  yyval.ttype = start_enum (NULL_TREE); ;
     break;}
 case 256:
-#line 1338 "c-parse.y"
+#line 1349 "c-parse.y"
 { yyval.ttype= finish_enum (yyvsp[-4].ttype, nreverse (yyvsp[-3].ttype), chainon (yyvsp[-6].ttype, yyvsp[0].ttype));
                  resume_momentary (yyvsp[-5].itype); ;
     break;}
 case 257:
-#line 1341 "c-parse.y"
+#line 1352 "c-parse.y"
 { yyval.ttype = xref_tag (ENUMERAL_TYPE, yyvsp[0].ttype); ;
     break;}
 case 261:
-#line 1352 "c-parse.y"
+#line 1363 "c-parse.y"
 { if (pedantic && ! flag_isoc9x)
                    pedwarn ("comma at end of enumerator list"); ;
     break;}
 case 262:
-#line 1358 "c-parse.y"
+#line 1369 "c-parse.y"
 { yyval.ttype = yyvsp[0].ttype; ;
     break;}
 case 263:
-#line 1360 "c-parse.y"
+#line 1371 "c-parse.y"
 { yyval.ttype = chainon (yyvsp[-1].ttype, yyvsp[0].ttype);
                  pedwarn ("no semicolon at end of struct or union"); ;
     break;}
 case 264:
-#line 1365 "c-parse.y"
+#line 1376 "c-parse.y"
 { yyval.ttype = NULL_TREE; ;
     break;}
 case 265:
-#line 1367 "c-parse.y"
+#line 1378 "c-parse.y"
 { yyval.ttype = chainon (yyvsp[-2].ttype, yyvsp[-1].ttype); ;
     break;}
 case 266:
-#line 1369 "c-parse.y"
+#line 1380 "c-parse.y"
 { if (pedantic)
                    pedwarn ("extra semicolon in struct or union specified"); ;
     break;}
 case 267:
-#line 1384 "c-parse.y"
+#line 1395 "c-parse.y"
 { yyval.ttype = yyvsp[0].ttype;
                  current_declspecs = TREE_VALUE (declspec_stack);
                  prefix_attributes = TREE_PURPOSE (declspec_stack);
@@ -3007,14 +3018,14 @@ case 267:
                  resume_momentary (yyvsp[-1].itype); ;
     break;}
 case 268:
-#line 1390 "c-parse.y"
+#line 1401 "c-parse.y"
 { if (pedantic)
                    pedwarn ("ANSI C forbids member declarations with no members");
                  shadow_tag(yyvsp[0].ttype);
                  yyval.ttype = NULL_TREE; ;
     break;}
 case 269:
-#line 1395 "c-parse.y"
+#line 1406 "c-parse.y"
 { yyval.ttype = yyvsp[0].ttype;
                  current_declspecs = TREE_VALUE (declspec_stack);
                  prefix_attributes = TREE_PURPOSE (declspec_stack);
@@ -3022,144 +3033,144 @@ case 269:
                  resume_momentary (yyvsp[-1].itype); ;
     break;}
 case 270:
-#line 1401 "c-parse.y"
+#line 1412 "c-parse.y"
 { if (pedantic)
                    pedwarn ("ANSI C forbids member declarations with no members");
                  shadow_tag(yyvsp[0].ttype);
                  yyval.ttype = NULL_TREE; ;
     break;}
 case 271:
-#line 1406 "c-parse.y"
+#line 1417 "c-parse.y"
 { yyval.ttype = NULL_TREE; ;
     break;}
 case 272:
-#line 1408 "c-parse.y"
+#line 1419 "c-parse.y"
 { yyval.ttype = yyvsp[0].ttype;
                  pedantic = yyvsp[-1].itype; ;
     break;}
 case 274:
-#line 1415 "c-parse.y"
+#line 1426 "c-parse.y"
 { yyval.ttype = chainon (yyvsp[-2].ttype, yyvsp[0].ttype); ;
     break;}
 case 275:
-#line 1420 "c-parse.y"
+#line 1431 "c-parse.y"
 { yyval.ttype = grokfield (yyvsp[-3].filename, yyvsp[-2].lineno, yyvsp[-1].ttype, current_declspecs, NULL_TREE);
                  decl_attributes (yyval.ttype, yyvsp[0].ttype, prefix_attributes); ;
     break;}
 case 276:
-#line 1424 "c-parse.y"
+#line 1435 "c-parse.y"
 { yyval.ttype = grokfield (yyvsp[-5].filename, yyvsp[-4].lineno, yyvsp[-3].ttype, current_declspecs, yyvsp[-1].ttype);
                  decl_attributes (yyval.ttype, yyvsp[0].ttype, prefix_attributes); ;
     break;}
 case 277:
-#line 1427 "c-parse.y"
+#line 1438 "c-parse.y"
 { yyval.ttype = grokfield (yyvsp[-4].filename, yyvsp[-3].lineno, NULL_TREE, current_declspecs, yyvsp[-1].ttype);
                  decl_attributes (yyval.ttype, yyvsp[0].ttype, prefix_attributes); ;
     break;}
 case 279:
-#line 1439 "c-parse.y"
+#line 1450 "c-parse.y"
 { if (yyvsp[-2].ttype == error_mark_node)
                    yyval.ttype = yyvsp[-2].ttype;
                  else
                    yyval.ttype = chainon (yyvsp[0].ttype, yyvsp[-2].ttype); ;
     break;}
 case 280:
-#line 1444 "c-parse.y"
+#line 1455 "c-parse.y"
 { yyval.ttype = error_mark_node; ;
     break;}
 case 281:
-#line 1450 "c-parse.y"
+#line 1461 "c-parse.y"
 { yyval.ttype = build_enumerator (yyvsp[0].ttype, NULL_TREE); ;
     break;}
 case 282:
-#line 1452 "c-parse.y"
+#line 1463 "c-parse.y"
 { yyval.ttype = build_enumerator (yyvsp[-2].ttype, yyvsp[0].ttype); ;
     break;}
 case 283:
-#line 1457 "c-parse.y"
+#line 1468 "c-parse.y"
 { yyval.ttype = build_tree_list (yyvsp[-1].ttype, yyvsp[0].ttype); ;
     break;}
 case 284:
-#line 1459 "c-parse.y"
+#line 1470 "c-parse.y"
 { yyval.ttype = build_tree_list (yyvsp[-1].ttype, yyvsp[0].ttype); ;
     break;}
 case 285:
-#line 1464 "c-parse.y"
+#line 1475 "c-parse.y"
 { yyval.ttype = NULL_TREE; ;
     break;}
 case 287:
-#line 1470 "c-parse.y"
+#line 1481 "c-parse.y"
 { yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ttype, NULL_TREE); ;
     break;}
 case 288:
-#line 1472 "c-parse.y"
+#line 1483 "c-parse.y"
 { yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ttype, yyvsp[-1].ttype); ;
     break;}
 case 289:
-#line 1477 "c-parse.y"
+#line 1488 "c-parse.y"
 { yyval.ttype = NULL_TREE; ;
     break;}
 case 290:
-#line 1479 "c-parse.y"
+#line 1490 "c-parse.y"
 { yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ttype, yyvsp[-1].ttype); ;
     break;}
 case 291:
-#line 1484 "c-parse.y"
+#line 1495 "c-parse.y"
 { yyval.ttype = yyvsp[-1].ttype; ;
     break;}
 case 292:
-#line 1487 "c-parse.y"
+#line 1498 "c-parse.y"
 { yyval.ttype = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); ;
     break;}
 case 293:
-#line 1489 "c-parse.y"
+#line 1500 "c-parse.y"
 { yyval.ttype = make_pointer_declarator (yyvsp[0].ttype, NULL_TREE); ;
     break;}
 case 294:
-#line 1491 "c-parse.y"
+#line 1502 "c-parse.y"
 { yyval.ttype = build_nt (CALL_EXPR, yyvsp[-2].ttype, yyvsp[0].ttype, NULL_TREE); ;
     break;}
 case 295:
-#line 1493 "c-parse.y"
+#line 1504 "c-parse.y"
 { yyval.ttype = build_nt (ARRAY_REF, yyvsp[-3].ttype, yyvsp[-1].ttype); ;
     break;}
 case 296:
-#line 1495 "c-parse.y"
+#line 1506 "c-parse.y"
 { yyval.ttype = build_nt (ARRAY_REF, yyvsp[-2].ttype, NULL_TREE); ;
     break;}
 case 297:
-#line 1497 "c-parse.y"
+#line 1508 "c-parse.y"
 { yyval.ttype = build_nt (CALL_EXPR, NULL_TREE, yyvsp[0].ttype, NULL_TREE); ;
     break;}
 case 298:
-#line 1499 "c-parse.y"
+#line 1510 "c-parse.y"
 { yyval.ttype = build_nt (ARRAY_REF, NULL_TREE, yyvsp[-1].ttype); ;
     break;}
 case 299:
-#line 1501 "c-parse.y"
+#line 1512 "c-parse.y"
 { yyval.ttype = build_nt (ARRAY_REF, NULL_TREE, NULL_TREE); ;
     break;}
 case 300:
-#line 1505 "c-parse.y"
+#line 1516 "c-parse.y"
 { yyval.ttype = yyvsp[0].ttype; ;
     break;}
 case 301:
-#line 1514 "c-parse.y"
+#line 1525 "c-parse.y"
 {
                  if (pedantic && yyvsp[0].ends_in_label)
                    pedwarn ("ANSI C forbids label at end of compound statement");
                ;
     break;}
 case 303:
-#line 1523 "c-parse.y"
+#line 1534 "c-parse.y"
 { yyval.ends_in_label = yyvsp[0].ends_in_label; ;
     break;}
 case 304:
-#line 1525 "c-parse.y"
+#line 1536 "c-parse.y"
 { yyval.ends_in_label = 0; ;
     break;}
 case 308:
-#line 1537 "c-parse.y"
+#line 1548 "c-parse.y"
 { emit_line_note (input_filename, lineno);
                  pushlevel (0);
                  clear_last_expr ();
@@ -3168,12 +3179,12 @@ case 308:
                ;
     break;}
 case 310:
-#line 1550 "c-parse.y"
+#line 1561 "c-parse.y"
 { if (pedantic)
                    pedwarn ("ANSI C forbids label declarations"); ;
     break;}
 case 313:
-#line 1561 "c-parse.y"
+#line 1572 "c-parse.y"
 { tree link;
                  for (link = yyvsp[-1].ttype; link; link = TREE_CHAIN (link))
                    {
@@ -3184,19 +3195,19 @@ case 313:
                ;
     break;}
 case 314:
-#line 1575 "c-parse.y"
+#line 1586 "c-parse.y"
 {;
     break;}
 case 316:
-#line 1579 "c-parse.y"
+#line 1590 "c-parse.y"
 { compstmt_count++; ;
     break;}
 case 317:
-#line 1582 "c-parse.y"
+#line 1593 "c-parse.y"
 { yyval.ttype = convert (void_type_node, integer_zero_node); ;
     break;}
 case 318:
-#line 1584 "c-parse.y"
+#line 1595 "c-parse.y"
 { emit_line_note (input_filename, lineno);
                  expand_end_bindings (getdecls (), 1, 0);
                  yyval.ttype = poplevel (1, 1, 0);
@@ -3206,7 +3217,7 @@ case 318:
                    pop_momentary (); ;
     break;}
 case 319:
-#line 1592 "c-parse.y"
+#line 1603 "c-parse.y"
 { emit_line_note (input_filename, lineno);
                  expand_end_bindings (getdecls (), kept_level_p (), 0);
                  yyval.ttype = poplevel (kept_level_p (), 0, 0);
@@ -3216,7 +3227,7 @@ case 319:
                    pop_momentary (); ;
     break;}
 case 320:
-#line 1600 "c-parse.y"
+#line 1611 "c-parse.y"
 { emit_line_note (input_filename, lineno);
                  expand_end_bindings (getdecls (), kept_level_p (), 0);
                  yyval.ttype = poplevel (kept_level_p (), 0, 0);
@@ -3226,7 +3237,7 @@ case 320:
                    pop_momentary (); ;
     break;}
 case 321:
-#line 1611 "c-parse.y"
+#line 1622 "c-parse.y"
 { if (current_function_decl == 0)
                    {
                      error ("braced-group within expression allowed only inside a function");
@@ -3244,11 +3255,11 @@ case 321:
                ;
     break;}
 case 322:
-#line 1628 "c-parse.y"
+#line 1639 "c-parse.y"
 { yyval.ttype = yyvsp[0].ttype; ;
     break;}
 case 325:
-#line 1642 "c-parse.y"
+#line 1653 "c-parse.y"
 { emit_line_note (yyvsp[-5].filename, yyvsp[-4].lineno);
                  c_expand_start_cond (truthvalue_conversion (yyvsp[-1].ttype), 0, 
                                       compstmt_count);
@@ -3258,7 +3269,7 @@ case 325:
                  position_after_white_space (); ;
     break;}
 case 326:
-#line 1656 "c-parse.y"
+#line 1667 "c-parse.y"
 { stmt_count++;
                  compstmt_count++;
                  emit_line_note (yyvsp[-2].filename, yyvsp[-1].lineno);
@@ -3268,43 +3279,43 @@ case 326:
                  position_after_white_space (); ;
     break;}
 case 327:
-#line 1664 "c-parse.y"
+#line 1675 "c-parse.y"
 { expand_loop_continue_here (); ;
     break;}
 case 328:
-#line 1668 "c-parse.y"
+#line 1679 "c-parse.y"
 { yyval.filename = input_filename; ;
     break;}
 case 329:
-#line 1672 "c-parse.y"
+#line 1683 "c-parse.y"
 { yyval.lineno = lineno; ;
     break;}
 case 330:
-#line 1677 "c-parse.y"
+#line 1688 "c-parse.y"
 { ;
     break;}
 case 331:
-#line 1682 "c-parse.y"
+#line 1693 "c-parse.y"
 { ;
     break;}
 case 332:
-#line 1687 "c-parse.y"
+#line 1698 "c-parse.y"
 { yyval.ends_in_label = yyvsp[0].ends_in_label; ;
     break;}
 case 333:
-#line 1692 "c-parse.y"
+#line 1703 "c-parse.y"
 { yyval.ends_in_label = 0; ;
     break;}
 case 334:
-#line 1694 "c-parse.y"
+#line 1705 "c-parse.y"
 { yyval.ends_in_label = 1; ;
     break;}
 case 335:
-#line 1700 "c-parse.y"
+#line 1711 "c-parse.y"
 { stmt_count++; ;
     break;}
 case 337:
-#line 1703 "c-parse.y"
+#line 1714 "c-parse.y"
 { stmt_count++;
                  emit_line_note (yyvsp[-3].filename, yyvsp[-2].lineno);
 /* It appears that this should not be done--that a non-lvalue array
@@ -3323,19 +3334,19 @@ case 337:
                  clear_momentary (); ;
     break;}
 case 338:
-#line 1720 "c-parse.y"
+#line 1731 "c-parse.y"
 { c_expand_start_else ();
                  yyvsp[-1].itype = stmt_count;
                  position_after_white_space (); ;
     break;}
 case 339:
-#line 1724 "c-parse.y"
+#line 1735 "c-parse.y"
 { c_expand_end_cond ();
                  if (extra_warnings && stmt_count == yyvsp[-3].itype)
                    warning ("empty body in an else-statement"); ;
     break;}
 case 340:
-#line 1728 "c-parse.y"
+#line 1739 "c-parse.y"
 { c_expand_end_cond ();
                  /* This warning is here instead of in simple_if, because we
                     do not want a warning if an empty if is followed by an
@@ -3346,11 +3357,11 @@ case 340:
                                                "empty body in an if-statement"); ;
     break;}
 case 341:
-#line 1740 "c-parse.y"
+#line 1751 "c-parse.y"
 { c_expand_end_cond (); ;
     break;}
 case 342:
-#line 1742 "c-parse.y"
+#line 1753 "c-parse.y"
 { stmt_count++;
                  emit_line_note (yyvsp[-2].filename, yyvsp[-1].lineno);
                  /* The emit_nop used to come before emit_line_note,
@@ -3362,7 +3373,7 @@ case 342:
                  emit_nop (); ;
     break;}
 case 343:
-#line 1752 "c-parse.y"
+#line 1763 "c-parse.y"
 { /* Don't start the loop till we have succeeded
                     in parsing the end test.  This is to make sure
                     that we end every loop we start.  */
@@ -3373,11 +3384,11 @@ case 343:
                  position_after_white_space (); ;
     break;}
 case 344:
-#line 1761 "c-parse.y"
+#line 1772 "c-parse.y"
 { expand_end_loop (); ;
     break;}
 case 345:
-#line 1764 "c-parse.y"
+#line 1775 "c-parse.y"
 { emit_line_note (input_filename, lineno);
                  expand_exit_loop_if_false (NULL_PTR,
                                             truthvalue_conversion (yyvsp[-2].ttype));
@@ -3385,12 +3396,12 @@ case 345:
                  clear_momentary (); ;
     break;}
 case 346:
-#line 1771 "c-parse.y"
+#line 1782 "c-parse.y"
 { expand_end_loop ();
                  clear_momentary (); ;
     break;}
 case 347:
-#line 1775 "c-parse.y"
+#line 1786 "c-parse.y"
 { stmt_count++;
                  emit_line_note (yyvsp[-5].filename, yyvsp[-4].lineno);
                  /* See comment in `while' alternative, above.  */
@@ -3403,12 +3414,12 @@ case 347:
                ;
     break;}
 case 348:
-#line 1787 "c-parse.y"
+#line 1798 "c-parse.y"
 { yyvsp[0].lineno = lineno;
                  yyval.filename = input_filename; ;
     break;}
 case 349:
-#line 1790 "c-parse.y"
+#line 1801 "c-parse.y"
 { 
                  /* Start the loop.  Doing this after parsing
                     all the expressions ensures we will end the loop.  */
@@ -3426,7 +3437,7 @@ case 349:
                  position_after_white_space (); ;
     break;}
 case 350:
-#line 1806 "c-parse.y"
+#line 1817 "c-parse.y"
 { /* Emit the increment expression, with a line number.  */
                  emit_line_note (yyvsp[-4].filename, yyvsp[-5].lineno);
                  expand_loop_continue_here ();
@@ -3439,7 +3450,7 @@ case 350:
                  expand_end_loop (); ;
     break;}
 case 351:
-#line 1817 "c-parse.y"
+#line 1828 "c-parse.y"
 { stmt_count++;
                  emit_line_note (yyvsp[-5].filename, yyvsp[-4].lineno);
                  c_expand_start_case (yyvsp[-1].ttype);
@@ -3449,7 +3460,7 @@ case 351:
                  position_after_white_space (); ;
     break;}
 case 352:
-#line 1825 "c-parse.y"
+#line 1836 "c-parse.y"
 { expand_end_case (yyvsp[-3].ttype);
                  if (yychar == CONSTANT || yychar == STRING)
                    pop_momentary_nofree ();
@@ -3457,33 +3468,33 @@ case 352:
                    pop_momentary (); ;
     break;}
 case 353:
-#line 1831 "c-parse.y"
+#line 1842 "c-parse.y"
 { stmt_count++;
                  emit_line_note (yyvsp[-3].filename, yyvsp[-2].lineno);
                  if ( ! expand_exit_something ())
                    error ("break statement not within loop or switch"); ;
     break;}
 case 354:
-#line 1836 "c-parse.y"
+#line 1847 "c-parse.y"
 { stmt_count++;
                  emit_line_note (yyvsp[-3].filename, yyvsp[-2].lineno);
                  if (! expand_continue_loop (NULL_PTR))
                    error ("continue statement not within a loop"); ;
     break;}
 case 355:
-#line 1841 "c-parse.y"
+#line 1852 "c-parse.y"
 { stmt_count++;
                  emit_line_note (yyvsp[-3].filename, yyvsp[-2].lineno);
                  c_expand_return (NULL_TREE); ;
     break;}
 case 356:
-#line 1845 "c-parse.y"
+#line 1856 "c-parse.y"
 { stmt_count++;
                  emit_line_note (yyvsp[-4].filename, yyvsp[-3].lineno);
                  c_expand_return (yyvsp[-1].ttype); ;
     break;}
 case 357:
-#line 1849 "c-parse.y"
+#line 1860 "c-parse.y"
 { stmt_count++;
                  emit_line_note (yyvsp[-7].filename, yyvsp[-6].lineno);
                  STRIP_NOPS (yyvsp[-2].ttype);
@@ -3495,7 +3506,7 @@ case 357:
                    error ("argument of `asm' is not a constant string"); ;
     break;}
 case 358:
-#line 1860 "c-parse.y"
+#line 1871 "c-parse.y"
 { stmt_count++;
                  emit_line_note (yyvsp[-9].filename, yyvsp[-8].lineno);
                  c_expand_asm_operands (yyvsp[-4].ttype, yyvsp[-2].ttype, NULL_TREE, NULL_TREE,
@@ -3503,7 +3514,7 @@ case 358:
                                         input_filename, lineno); ;
     break;}
 case 359:
-#line 1867 "c-parse.y"
+#line 1878 "c-parse.y"
 { stmt_count++;
                  emit_line_note (yyvsp[-11].filename, yyvsp[-10].lineno);
                  c_expand_asm_operands (yyvsp[-6].ttype, yyvsp[-4].ttype, yyvsp[-2].ttype, NULL_TREE,
@@ -3511,7 +3522,7 @@ case 359:
                                         input_filename, lineno); ;
     break;}
 case 360:
-#line 1875 "c-parse.y"
+#line 1886 "c-parse.y"
 { stmt_count++;
                  emit_line_note (yyvsp[-13].filename, yyvsp[-12].lineno);
                  c_expand_asm_operands (yyvsp[-8].ttype, yyvsp[-6].ttype, yyvsp[-4].ttype, yyvsp[-2].ttype,
@@ -3519,7 +3530,7 @@ case 360:
                                         input_filename, lineno); ;
     break;}
 case 361:
-#line 1881 "c-parse.y"
+#line 1892 "c-parse.y"
 { tree decl;
                  stmt_count++;
                  emit_line_note (yyvsp[-4].filename, yyvsp[-3].lineno);
@@ -3532,7 +3543,7 @@ case 361:
                ;
     break;}
 case 362:
-#line 1892 "c-parse.y"
+#line 1903 "c-parse.y"
 { if (pedantic)
                    pedwarn ("ANSI C forbids `goto *expr;'");
                  stmt_count++;
@@ -3540,7 +3551,7 @@ case 362:
                  expand_computed_goto (convert (ptr_type_node, yyvsp[-1].ttype)); ;
     break;}
 case 365:
-#line 1907 "c-parse.y"
+#line 1918 "c-parse.y"
 {
            /* The value returned by this action is  */
            /*      1 if everything is OK */ 
@@ -3563,14 +3574,14 @@ case 365:
          ;
     break;}
 case 366:
-#line 1928 "c-parse.y"
+#line 1939 "c-parse.y"
 {
            if (yyvsp[-1].itype)
              iterator_for_loop_end (yyvsp[-3].ttype);
          ;
     break;}
 case 367:
-#line 1963 "c-parse.y"
+#line 1974 "c-parse.y"
 { register tree value = check_case_value (yyvsp[-1].ttype);
                  register tree label
                    = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE);
@@ -3603,7 +3614,7 @@ case 367:
                  position_after_white_space (); ;
     break;}
 case 368:
-#line 1994 "c-parse.y"
+#line 2005 "c-parse.y"
 { register tree value1 = check_case_value (yyvsp[-3].ttype);
                  register tree value2 = check_case_value (yyvsp[-1].ttype);
                  register tree label
@@ -3636,7 +3647,7 @@ case 368:
                  position_after_white_space (); ;
     break;}
 case 369:
-#line 2025 "c-parse.y"
+#line 2036 "c-parse.y"
 {
                  tree duplicate;
                  register tree label
@@ -3653,7 +3664,7 @@ case 369:
                  position_after_white_space (); ;
     break;}
 case 370:
-#line 2040 "c-parse.y"
+#line 2051 "c-parse.y"
 { tree label = define_label (input_filename, lineno, yyvsp[-2].ttype);
                  stmt_count++;
                  emit_nop ();
@@ -3665,52 +3676,52 @@ case 370:
                  position_after_white_space (); ;
     break;}
 case 371:
-#line 2055 "c-parse.y"
+#line 2066 "c-parse.y"
 { emit_line_note (input_filename, lineno);
                  yyval.ttype = NULL_TREE; ;
     break;}
 case 372:
-#line 2058 "c-parse.y"
+#line 2069 "c-parse.y"
 { emit_line_note (input_filename, lineno); ;
     break;}
 case 373:
-#line 2063 "c-parse.y"
+#line 2074 "c-parse.y"
 { yyval.ttype = NULL_TREE; ;
     break;}
 case 375:
-#line 2070 "c-parse.y"
+#line 2081 "c-parse.y"
 { yyval.ttype = NULL_TREE; ;
     break;}
 case 378:
-#line 2077 "c-parse.y"
+#line 2088 "c-parse.y"
 { yyval.ttype = chainon (yyvsp[-2].ttype, yyvsp[0].ttype); ;
     break;}
 case 379:
-#line 2082 "c-parse.y"
+#line 2093 "c-parse.y"
 { yyval.ttype = build_tree_list (yyvsp[-3].ttype, yyvsp[-1].ttype); ;
     break;}
 case 380:
-#line 2087 "c-parse.y"
+#line 2098 "c-parse.y"
 { yyval.ttype = tree_cons (NULL_TREE, combine_strings (yyvsp[0].ttype), NULL_TREE); ;
     break;}
 case 381:
-#line 2089 "c-parse.y"
+#line 2100 "c-parse.y"
 { yyval.ttype = tree_cons (NULL_TREE, combine_strings (yyvsp[0].ttype), yyvsp[-2].ttype); ;
     break;}
 case 382:
-#line 2095 "c-parse.y"
+#line 2106 "c-parse.y"
 { pushlevel (0);
                  clear_parm_order ();
                  declare_parm_level (0); ;
     break;}
 case 383:
-#line 2099 "c-parse.y"
+#line 2110 "c-parse.y"
 { yyval.ttype = yyvsp[0].ttype;
                  parmlist_tags_warning ();
                  poplevel (0, 0, 0); ;
     break;}
 case 385:
-#line 2107 "c-parse.y"
+#line 2118 "c-parse.y"
 { tree parm;
                  if (pedantic)
                    pedwarn ("ANSI C forbids forward parameter declarations");
@@ -3720,19 +3731,19 @@ case 385:
                  clear_parm_order (); ;
     break;}
 case 386:
-#line 2115 "c-parse.y"
+#line 2126 "c-parse.y"
 { yyval.ttype = yyvsp[0].ttype; ;
     break;}
 case 387:
-#line 2117 "c-parse.y"
+#line 2128 "c-parse.y"
 { yyval.ttype = tree_cons (NULL_TREE, NULL_TREE, NULL_TREE); ;
     break;}
 case 388:
-#line 2123 "c-parse.y"
+#line 2134 "c-parse.y"
 { yyval.ttype = get_parm_info (0); ;
     break;}
 case 389:
-#line 2125 "c-parse.y"
+#line 2136 "c-parse.y"
 { yyval.ttype = get_parm_info (0);
                  /* Gcc used to allow this as an extension.  However, it does
                     not work for all targets, and thus has been disabled.
@@ -3744,23 +3755,23 @@ case 389:
                ;
     break;}
 case 390:
-#line 2135 "c-parse.y"
+#line 2146 "c-parse.y"
 { yyval.ttype = get_parm_info (1); ;
     break;}
 case 391:
-#line 2137 "c-parse.y"
+#line 2148 "c-parse.y"
 { yyval.ttype = get_parm_info (0); ;
     break;}
 case 392:
-#line 2142 "c-parse.y"
+#line 2153 "c-parse.y"
 { push_parm_decl (yyvsp[0].ttype); ;
     break;}
 case 393:
-#line 2144 "c-parse.y"
+#line 2155 "c-parse.y"
 { push_parm_decl (yyvsp[0].ttype); ;
     break;}
 case 394:
-#line 2151 "c-parse.y"
+#line 2162 "c-parse.y"
 { yyval.ttype = build_tree_list (build_tree_list (current_declspecs,
                                                         yyvsp[-1].ttype),
                                        build_tree_list (prefix_attributes,
@@ -3771,7 +3782,7 @@ case 394:
                  resume_momentary (yyvsp[-2].itype); ;
     break;}
 case 395:
-#line 2160 "c-parse.y"
+#line 2171 "c-parse.y"
 { yyval.ttype = build_tree_list (build_tree_list (current_declspecs,
                                                         yyvsp[-1].ttype),
                                        build_tree_list (prefix_attributes,
@@ -3782,7 +3793,7 @@ case 395:
                  resume_momentary (yyvsp[-2].itype); ;
     break;}
 case 396:
-#line 2169 "c-parse.y"
+#line 2180 "c-parse.y"
 { yyval.ttype = build_tree_list (build_tree_list (current_declspecs,
                                                         yyvsp[-1].ttype),
                                        build_tree_list (prefix_attributes,
@@ -3793,7 +3804,7 @@ case 396:
                  resume_momentary (yyvsp[-2].itype); ;
     break;}
 case 397:
-#line 2178 "c-parse.y"
+#line 2189 "c-parse.y"
 { yyval.ttype = build_tree_list (build_tree_list (current_declspecs,
                                                         yyvsp[-1].ttype),
                                        build_tree_list (prefix_attributes,
@@ -3804,7 +3815,7 @@ case 397:
                  resume_momentary (yyvsp[-2].itype);  ;
     break;}
 case 398:
-#line 2188 "c-parse.y"
+#line 2199 "c-parse.y"
 { yyval.ttype = build_tree_list (build_tree_list (current_declspecs,
                                                         yyvsp[-1].ttype),
                                        build_tree_list (prefix_attributes,
@@ -3815,19 +3826,19 @@ case 398:
                  resume_momentary (yyvsp[-2].itype);  ;
     break;}
 case 399:
-#line 2202 "c-parse.y"
+#line 2213 "c-parse.y"
 { pushlevel (0);
                  clear_parm_order ();
                  declare_parm_level (1); ;
     break;}
 case 400:
-#line 2206 "c-parse.y"
+#line 2217 "c-parse.y"
 { yyval.ttype = yyvsp[0].ttype;
                  parmlist_tags_warning ();
                  poplevel (0, 0, 0); ;
     break;}
 case 402:
-#line 2214 "c-parse.y"
+#line 2225 "c-parse.y"
 { tree t;
                  for (t = yyvsp[-1].ttype; t; t = TREE_CHAIN (t))
                    if (TREE_VALUE (t) == NULL_TREE)
@@ -3835,23 +3846,23 @@ case 402:
                  yyval.ttype = tree_cons (NULL_TREE, NULL_TREE, yyvsp[-1].ttype); ;
     break;}
 case 403:
-#line 2224 "c-parse.y"
+#line 2235 "c-parse.y"
 { yyval.ttype = build_tree_list (NULL_TREE, yyvsp[0].ttype); ;
     break;}
 case 404:
-#line 2226 "c-parse.y"
+#line 2237 "c-parse.y"
 { yyval.ttype = chainon (yyvsp[-2].ttype, build_tree_list (NULL_TREE, yyvsp[0].ttype)); ;
     break;}
 case 405:
-#line 2232 "c-parse.y"
+#line 2243 "c-parse.y"
 { yyval.ttype = build_tree_list (NULL_TREE, yyvsp[0].ttype); ;
     break;}
 case 406:
-#line 2234 "c-parse.y"
+#line 2245 "c-parse.y"
 { yyval.ttype = chainon (yyvsp[-2].ttype, build_tree_list (NULL_TREE, yyvsp[0].ttype)); ;
     break;}
 case 407:
-#line 2239 "c-parse.y"
+#line 2250 "c-parse.y"
 { yyval.itype = pedantic;
                  pedantic = 0; ;
     break;}
@@ -4077,5 +4088,5 @@ yyerrhandle:
     }
   return 1;
 }
-#line 2243 "c-parse.y"
+#line 2254 "c-parse.y"
 
index 7dd65203997eb75de8fb68dcde512cbfb825488b..a0c7f94712c9d192f4d8869ecfde16fa6c2b3944 100644 (file)
@@ -46,7 +46,8 @@ end ifc
 #include "flags.h"
 #include "output.h"
 #include "toplev.h"
-
+#include "ggc.h"
+  
 #ifdef MULTIBYTE_CHARS
 #include <locale.h>
 #endif
@@ -245,6 +246,16 @@ end ifobjc
 
 #define YYPRINT(FILE,YYCHAR,YYLVAL) yyprint(FILE,YYCHAR,YYLVAL)
 extern void yyprint                    PROTO ((FILE *, int, YYSTYPE));
+
+/* Add GC roots for variables local to this file.  */
+void
+c_parse_init ()
+{
+  ggc_add_tree_root (&declspec_stack, 1);
+  ggc_add_tree_root (&current_declspecs, 1);
+  ggc_add_tree_root (&prefix_attributes, 1);
+}
+
 %}
 \f
 %%
index 14b381a5eaed1996fb4b40aae9de66fc9456d35d..8e3730b595ad884a9bdc5cc2ccbb6ec0a2d625ce 100644 (file)
@@ -42,7 +42,8 @@ Boston, MA 02111-1307, USA.  */
 #include "flags.h"
 #include "output.h"
 #include "toplev.h"
-
+#include "ggc.h"
+  
 #ifdef MULTIBYTE_CHARS
 #include <locale.h>
 #endif
@@ -207,6 +208,16 @@ static int undeclared_variable_notice;
 
 #define YYPRINT(FILE,YYCHAR,YYLVAL) yyprint(FILE,YYCHAR,YYLVAL)
 extern void yyprint                    PROTO ((FILE *, int, YYSTYPE));
+
+/* Add GC roots for variables local to this file.  */
+void
+c_parse_init ()
+{
+  ggc_add_tree_root (&declspec_stack, 1);
+  ggc_add_tree_root (&current_declspecs, 1);
+  ggc_add_tree_root (&prefix_attributes, 1);
+}
+
 %}
 \f
 %%
index e11ed7bc4fbb8b461ff39f9a1b2f44cb31db09dd..a55785538c6e6dc13fa2b4f394f0f661772f7bf8 100644 (file)
@@ -174,6 +174,9 @@ extern tree maybe_objc_method_name          PROTO((tree));
 extern int recognize_objc_keyword              PROTO((void));
 extern tree build_objc_string                  PROTO((int, const char *));
 \f
+/* in c-parse.in */
+extern void c_parse_init                       PROTO((void));
+
 /* in c-aux-info.c */
 extern void gen_aux_info_record                 PROTO((tree, int, int, int));
 
@@ -222,6 +225,7 @@ extern tree lookup_name_current_level_global        PROTO((tree));
 extern tree maybe_build_cleanup                 PROTO((tree));
 extern void parmlist_tags_warning               PROTO((void));
 extern void pending_xref_error                  PROTO((void));
+extern void mark_c_function_context             PROTO((struct function *));
 extern void push_c_function_context             PROTO((struct function *));
 extern void pop_c_function_context              PROTO((struct function *));
 extern void pop_label_level                     PROTO((void));
index 04b79b8d7e8dccc1c21d613bbe2acc7f41aae8cd..4c1460cc9bf1e7049162a7b44e99314185d4ca1e 100644 (file)
@@ -38,6 +38,7 @@ Boston, MA 02111-1307, USA. */
 #include "expr.h"
 #include "toplev.h"
 #include "basic-block.h"
+#include "ggc.h"
 
 #ifdef EXTRA_CONSTRAINT
 /* If EXTRA_CONSTRAINT is defined, then the 'S'
@@ -248,6 +249,7 @@ static void ix86_reorder_insn PROTO ((rtx *, rtx *));
 static rtx * ix86_pent_find_pair PROTO ((rtx *, rtx *, enum attr_pent_pair,
                                         rtx));
 static void ix86_init_machine_status PROTO ((struct function *));
+static void ix86_mark_machine_status PROTO ((struct function *));
 
 struct ix86_address
 {
@@ -353,6 +355,7 @@ override_options ()
 
   /* Arrange to set up i386_stack_locals for all functions.  */
   init_machine_status = ix86_init_machine_status;
+  mark_machine_status = ix86_mark_machine_status;
 
   /* Validate registers in register allocation order.  */
   if (ix86_reg_alloc_order)
@@ -4962,7 +4965,7 @@ ix86_expand_strlensi_unroll_1 (out, align_rtx, scratch)
 
 static void
 ix86_init_machine_status (p)
-    struct function *p;
+     struct function *p;
 {
   enum machine_mode mode;
   int n;
@@ -4975,6 +4978,20 @@ ix86_init_machine_status (p)
       ix86_stack_locals[(int) mode][n] = NULL_RTX;
 }
 
+/* Mark machine specific bits of P for GC.  */
+static void
+ix86_mark_machine_status (p)
+     struct function *p;
+{
+  enum machine_mode mode;
+  int n;
+
+  for (mode = VOIDmode; (int) mode < (int) MAX_MACHINE_MODE;
+       mode = (enum machine_mode) ((int) mode + 1))
+    for (n = 0; n < MAX_386_STACK_LOCALS; n++)
+      ggc_mark_rtx (p->machine->stack_locals[(int) mode][n]);
+}
+
 /* Return a MEM corresponding to a stack slot with mode MODE.
    Allocate a new slot if necessary.
 
index 805c7cd1c2014e1a0e9d3bccaace1dbdc2850804..50961883df2f956daf4b31266744d8b600c045f4 100644 (file)
@@ -65,7 +65,7 @@ cc1obj$(exeext): $(P) $(OBJS) $(OBJC_OBJS) $(LIBDEPS)
 # Objective C language specific files.
 
 objc-parse.o : $(srcdir)/objc/objc-parse.c \
-   $(CONFIG_H) $(TREE_H) $(srcdir)/toplev.h \
+   $(CONFIG_H) $(TREE_H) $(srcdir)/toplev.h $(srcdir)/ggc.h \
    $(srcdir)/c-lex.h $(srcdir)/c-tree.h $(srcdir)/c-common.h \
    $(srcdir)/input.h $(srcdir)/flags.h $(srcdir)/output.h \
    $(srcdir)/objc/objc-act.h system.h