OSDN Git Service

* toplev.c (debug_args, f_options, W_options): Mark
[pf3gnuchains/gcc-fork.git] / gcc / c-decl.c
index e7c5988..75c8f8a 100644 (file)
@@ -1,6 +1,6 @@
 /* Process declarations and variables for C compiler.
-   Copyright (C) 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000
-   Free Software Foundation, Inc.
+   Copyright (C) 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
+   2001 Free Software Foundation, Inc.
 
 This file is part of GNU CC.
 
@@ -38,7 +38,6 @@ Boston, MA 02111-1307, USA.  */
 #include "c-tree.h"
 #include "c-lex.h"
 #include "toplev.h"
-#include "defaults.h"
 #include "ggc.h"
 #include "tm_p.h"
 #include "cpplib.h"
@@ -52,24 +51,6 @@ enum decl_context
   BITFIELD,                    /* Likewise but with specified width */
   TYPENAME};                   /* Typename (inside cast or sizeof)  */
 
-/* We let tm.h override the types used here, to handle trivial differences
-   such as the choice of unsigned int or long unsigned int for size_t.
-   When machines start needing nontrivial differences in the size type,
-   it would be best to do something here to figure out automatically
-   from other information what type to use.  */
-
-#ifndef SIZE_TYPE
-#define SIZE_TYPE "long unsigned int"
-#endif
-
-#ifndef PTRDIFF_TYPE
-#define PTRDIFF_TYPE "long int"
-#endif
-
-#ifndef WCHAR_TYPE
-#define WCHAR_TYPE "int"
-#endif
-
 \f
 /* Nonzero if we have seen an invalid cross reference
    to a struct, union, or enum, but not yet printed the message.  */
@@ -123,11 +104,6 @@ static struct stmt_tree_s c_stmt_tree;
 
 static tree c_scope_stmt_stack;
 
-/* Nonzero if __FUNCTION__ and its ilk have been declared in this
-   function.  */
-
-static int c_function_name_declared_p;
-
 /* A list (chain of TREE_LIST nodes) of all LABEL_DECLs in the function
    that have names.  Here so we can clear out their names' definitions
    at the end of the function.  */
@@ -298,7 +274,7 @@ static tree grokdeclarator          PARAMS ((tree, tree, enum decl_context,
                                                 int));
 static tree grokparms                  PARAMS ((tree, int));
 static void layout_array_type          PARAMS ((tree));
-static tree c_make_fname_decl           PARAMS ((tree, const char *, int));
+static tree c_make_fname_decl           PARAMS ((tree, int));
 static void c_expand_body               PARAMS ((tree, int));
 \f
 /* C-specific option variables.  */
@@ -308,14 +284,6 @@ static void c_expand_body               PARAMS ((tree, int));
 
 int flag_cond_mismatch;
 
-/* Nonzero means give `double' the same size as `float'.  */
-
-int flag_short_double;
-
-/* Nonzero means give `wchar_t' the same size as `short'.  */
-
-int flag_short_wchar;
-
 /* Nonzero means don't recognize the keyword `asm'.  */
 
 int flag_no_asm;
@@ -421,10 +389,6 @@ int warn_redundant_decls = 0;
 
 int warn_nested_externs = 0;
 
-/* Warn about *printf or *scanf format/argument anomalies.  */
-
-int warn_format;
-
 /* Warn about a subscript that has type char.  */
 
 int warn_char_subscripts = 0;
@@ -673,8 +637,6 @@ c_decode_option (argc, argv)
     warn_bad_function_cast = 1;
   else if (!strcmp (p, "-Wno-bad-function-cast"))
     warn_bad_function_cast = 0;
-  else if (!strcmp (p, "-Wmissing-noreturn"))
-    warn_missing_noreturn = 1;
   else if (!strcmp (p, "-Wno-missing-noreturn"))
     warn_missing_noreturn = 0;
   else if (!strcmp (p, "-Wmissing-format-attribute"))
@@ -710,11 +672,27 @@ c_decode_option (argc, argv)
   else if (!strcmp (p, "-Wno-traditional"))
     warn_traditional = 0;
   else if (!strncmp (p, "-Wformat=", 9))
-    warn_format = atol (p + 9);
+    set_Wformat (atoi (p + 9));
   else if (!strcmp (p, "-Wformat"))
-    warn_format = 1;
+    set_Wformat (1);
   else if (!strcmp (p, "-Wno-format"))
-    warn_format = 0;
+    set_Wformat (0);
+  else if (!strcmp (p, "-Wformat-y2k"))
+    warn_format_y2k = 1;
+  else if (!strcmp (p, "-Wno-format-y2k"))
+    warn_format_y2k = 0;
+  else if (!strcmp (p, "-Wformat-extra-args"))
+    warn_format_extra_args = 1;
+  else if (!strcmp (p, "-Wno-format-extra-args"))
+    warn_format_extra_args = 0;
+  else if (!strcmp (p, "-Wformat-nonliteral"))
+    warn_format_nonliteral = 1;
+  else if (!strcmp (p, "-Wno-format-nonliteral"))
+    warn_format_nonliteral = 0;
+  else if (!strcmp (p, "-Wformat-security"))
+    warn_format_security = 1;
+  else if (!strcmp (p, "-Wno-format-security"))
+    warn_format_security = 0;
   else if (!strcmp (p, "-Wchar-subscripts"))
     warn_char_subscripts = 1;
   else if (!strcmp (p, "-Wno-char-subscripts"))
@@ -793,7 +771,7 @@ c_decode_option (argc, argv)
       warn_return_type = 1;
       set_Wunused (1);
       warn_switch = 1;
-      warn_format = 1;
+      set_Wformat (1);
       warn_char_subscripts = 1;
       warn_parentheses = 1;
       warn_sequence_point = 1;
@@ -1277,6 +1255,10 @@ set_block (block)
      register tree block;
 {
   current_binding_level->this_block = block;
+  current_binding_level->names = chainon (current_binding_level->names,
+                                         BLOCK_VARS (block));
+  current_binding_level->blocks = chainon (current_binding_level->blocks,
+                                          BLOCK_SUBBLOCKS (block));
 }
 \f
 void
@@ -1527,7 +1509,7 @@ duplicate_decls (newdecl, olddecl, different_binding_level)
                oldtype = trytype;
            }
          /* Accept harmless mismatch in first argument type also.
-            This is for ffs.  */
+            This is for the ffs and fprintf builtins.  */
          if (TYPE_ARG_TYPES (TREE_TYPE (newdecl)) != 0
              && TYPE_ARG_TYPES (oldtype) != 0
              && TREE_VALUE (TYPE_ARG_TYPES (newtype)) != 0
@@ -1816,11 +1798,17 @@ duplicate_decls (newdecl, olddecl, different_binding_level)
       if (TREE_CODE (newdecl) != FUNCTION_DECL || !DECL_BUILT_IN (olddecl))
        {
          if (different_binding_level)
-           TREE_TYPE (newdecl)
-             = build_type_attribute_variant
-               (newtype,
-                merge_attributes (TYPE_ATTRIBUTES (newtype),
-                                  TYPE_ATTRIBUTES (oldtype)));
+           {
+             if (TYPE_ARG_TYPES (oldtype) != 0
+                 && TYPE_ARG_TYPES (newtype) == 0)
+               TREE_TYPE (newdecl) = common_type (newtype, oldtype);
+             else
+               TREE_TYPE (newdecl)
+                 = build_type_attribute_variant
+                   (newtype,
+                    merge_attributes (TYPE_ATTRIBUTES (newtype),
+                                      TYPE_ATTRIBUTES (oldtype)));
+           }
          else
            TREE_TYPE (newdecl)
              = TREE_TYPE (olddecl)
@@ -1852,7 +1840,7 @@ duplicate_decls (newdecl, olddecl, different_binding_level)
        }
 
       /* Keep the old rtl since we can safely use it.  */
-      DECL_RTL (newdecl) = DECL_RTL (olddecl);
+      COPY_DECL_RTL (olddecl, newdecl);
 
       /* Merge the type qualifiers.  */
       if (TREE_CODE (olddecl) == FUNCTION_DECL
@@ -1909,7 +1897,7 @@ duplicate_decls (newdecl, olddecl, different_binding_level)
 
       /* Copy the assembler name.
         Currently, it can only be defined in the prototype.  */
-      DECL_ASSEMBLER_NAME (newdecl) = DECL_ASSEMBLER_NAME (olddecl);
+      COPY_DECL_ASSEMBLER_NAME (olddecl, newdecl);
 
       if (TREE_CODE (newdecl) == FUNCTION_DECL)
        {
@@ -1972,12 +1960,27 @@ duplicate_decls (newdecl, olddecl, different_binding_level)
 
   if (TREE_CODE (newdecl) == FUNCTION_DECL)
     {
-      /* If either decl says `inline', this fn is inline,
-        unless its definition was passed already.  */
-      if (DECL_INLINE (newdecl) && DECL_INITIAL (olddecl) == 0)
-       DECL_INLINE (olddecl) = 1;
+      /* If we're redefining a function previously defined as extern
+        inline, make sure we emit debug info for the inline before we
+        throw it away, in case it was inlined into a function that hasn't
+        been written out yet.  */
+      if (new_is_definition && DECL_INITIAL (olddecl) && TREE_USED (olddecl))
+       {
+         note_outlining_of_inline_function (olddecl);
 
-      DECL_INLINE (newdecl) = DECL_INLINE (olddecl);
+         /* The new defn must not be inline.  */
+         DECL_INLINE (newdecl) = 0;
+         DECL_UNINLINABLE (newdecl) = 1;
+       }
+      else
+       {
+         /* If either decl says `inline', this fn is inline,
+            unless its definition was passed already.  */
+         if (DECL_INLINE (newdecl) && DECL_INITIAL (olddecl) == 0)
+           DECL_INLINE (olddecl) = 1;
+
+         DECL_INLINE (newdecl) = DECL_INLINE (olddecl);
+       }
 
       if (DECL_BUILT_IN (olddecl))
        {
@@ -2001,7 +2004,7 @@ duplicate_decls (newdecl, olddecl, different_binding_level)
        }
       /* Also preserve various other info from the definition.  */
       else if (! new_is_definition)
-       DECL_FRAME_SIZE (newdecl) = DECL_FRAME_SIZE (olddecl);
+       DECL_NUM_STMTS (newdecl) = DECL_NUM_STMTS (olddecl);
       if (! new_is_definition)
        {
          DECL_RESULT (newdecl) = DECL_RESULT (olddecl);
@@ -2364,7 +2367,7 @@ pushdecl (x)
                      DECL_INITIAL (x) = (current_function_decl == oldglobal
                                          ? 0 : DECL_INITIAL (oldglobal));
                      DECL_SAVED_INSNS (x) = DECL_SAVED_INSNS (oldglobal);
-                     DECL_FRAME_SIZE (x) = DECL_FRAME_SIZE (oldglobal);
+                     DECL_NUM_STMTS (x) = DECL_NUM_STMTS (oldglobal);
                      DECL_ARGUMENTS (x) = DECL_ARGUMENTS (oldglobal);
                      DECL_RESULT (x) = DECL_RESULT (oldglobal);
                      TREE_ASM_WRITTEN (x) = TREE_ASM_WRITTEN (oldglobal);
@@ -2544,7 +2547,7 @@ implicitly_declare (functionid)
   /* This is a no-op in c-lang.c or something real in objc-actions.c.  */
   maybe_objc_check_decl (decl);
 
-  rest_of_decl_compilation (decl, NULL_PTR, 0, 0);
+  rest_of_decl_compilation (decl, NULL, 0, 0);
 
   if (implicit_warning)
     implicit_decl_warning (functionid);
@@ -2826,6 +2829,7 @@ lookup_tag (code, name, binding_level, thislevel_only)
      int thislevel_only;
 {
   register struct binding_level *level;
+  int thislevel = 1;
 
   for (level = binding_level; level; level = level->level_chain)
     {
@@ -2840,12 +2844,22 @@ lookup_tag (code, name, binding_level, thislevel_only)
                  pending_invalid_xref = name;
                  pending_invalid_xref_file = input_filename;
                  pending_invalid_xref_line = lineno;
+                 /* If in the same binding level as a declaration as a tag
+                    of a different type, this must not be allowed to
+                    shadow that tag, so give the error immediately.
+                    (For example, "struct foo; union foo;" is invalid.)  */
+                 if (thislevel)
+                   pending_xref_error ();
                }
              return TREE_VALUE (tail);
            }
        }
-      if (thislevel_only && ! level->tag_transparent)
-       return NULL_TREE;
+      if (! level->tag_transparent)
+       {
+         if (thislevel_only)
+           return NULL_TREE;
+         thislevel = 0;
+       }
     }
   return NULL_TREE;
 }
@@ -2956,9 +2970,6 @@ init_decl_processing ()
 {
   register tree endlink;
   tree ptr_ftype_void, ptr_ftype_ptr;
-  int wchar_type_size;
-  tree array_domain_type;
-  tree t;
 
   current_function_decl = NULL;
   named_labels = NULL;
@@ -2971,96 +2982,7 @@ init_decl_processing ()
 
   build_common_tree_nodes (flag_signed_char);
 
-  /* Define `int' and `char' first so that dbx will output them first.  */
-  pushdecl (build_decl (TYPE_DECL, ridpointers[(int) RID_INT],
-                       integer_type_node));
-  pushdecl (build_decl (TYPE_DECL, get_identifier ("char"),
-                       char_type_node));
-  pushdecl (build_decl (TYPE_DECL, get_identifier ("long int"),
-                       long_integer_type_node));
-  pushdecl (build_decl (TYPE_DECL, get_identifier ("unsigned int"),
-                       unsigned_type_node));
-  pushdecl (build_decl (TYPE_DECL, get_identifier ("long unsigned int"),
-                       long_unsigned_type_node));
-  pushdecl (build_decl (TYPE_DECL, get_identifier ("long long int"),
-                       long_long_integer_type_node));
-  pushdecl (build_decl (TYPE_DECL, get_identifier ("long long unsigned int"),
-                       long_long_unsigned_type_node));
-  pushdecl (build_decl (TYPE_DECL, get_identifier ("short int"),
-                       short_integer_type_node));
-  pushdecl (build_decl (TYPE_DECL, get_identifier ("short unsigned int"),
-                       short_unsigned_type_node));
-  pushdecl (build_decl (TYPE_DECL, get_identifier ("signed char"),
-                       signed_char_type_node));
-  pushdecl (build_decl (TYPE_DECL, get_identifier ("unsigned char"),
-                       unsigned_char_type_node));
-  pushdecl (build_decl (TYPE_DECL, NULL_TREE, intQI_type_node));
-  pushdecl (build_decl (TYPE_DECL, NULL_TREE, intHI_type_node));
-  pushdecl (build_decl (TYPE_DECL, NULL_TREE, intSI_type_node));
-  pushdecl (build_decl (TYPE_DECL, NULL_TREE, intDI_type_node));
-#if HOST_BITS_PER_WIDE_INT >= 64
-  pushdecl (build_decl (TYPE_DECL, NULL_TREE, intTI_type_node));
-#endif
-  pushdecl (build_decl (TYPE_DECL, NULL_TREE, unsigned_intQI_type_node));
-  pushdecl (build_decl (TYPE_DECL, NULL_TREE, unsigned_intHI_type_node));
-  pushdecl (build_decl (TYPE_DECL, NULL_TREE, unsigned_intSI_type_node));
-  pushdecl (build_decl (TYPE_DECL, NULL_TREE, unsigned_intDI_type_node));
-#if HOST_BITS_PER_WIDE_INT >= 64
-  pushdecl (build_decl (TYPE_DECL, NULL_TREE, unsigned_intTI_type_node));
-#endif
-
-  /* `unsigned long' is the standard type for sizeof.
-     Traditionally, use a signed type.
-     Note that stddef.h uses `unsigned long',
-     and this must agree, even if long and int are the same size.  */
-  t = TREE_TYPE (IDENTIFIER_GLOBAL_VALUE (get_identifier (SIZE_TYPE)));
-  signed_size_type_node = signed_type (t);
-  if (flag_traditional && TREE_UNSIGNED (t))
-    t = signed_type (t);
-
-  c_size_type_node = t;
-  set_sizetype (t);
-
-  /* Create the widest literal types.  */
-  widest_integer_literal_type_node
-    = make_signed_type (HOST_BITS_PER_WIDE_INT * 2);
-  widest_unsigned_literal_type_node
-    = make_unsigned_type (HOST_BITS_PER_WIDE_INT * 2);
-  pushdecl (build_decl (TYPE_DECL, NULL_TREE,
-                       widest_integer_literal_type_node));
-  pushdecl (build_decl (TYPE_DECL, NULL_TREE,
-                       widest_unsigned_literal_type_node));
-
-  build_common_tree_nodes_2 (flag_short_double);
-
-  pushdecl (build_decl (TYPE_DECL, ridpointers[(int) RID_FLOAT],
-                       float_type_node));
-  pushdecl (build_decl (TYPE_DECL, ridpointers[(int) RID_DOUBLE],
-                       double_type_node));
-  pushdecl (build_decl (TYPE_DECL, get_identifier ("long double"),
-                       long_double_type_node));
-  pushdecl (build_decl (TYPE_DECL, get_identifier ("complex int"),
-                       complex_integer_type_node));
-  pushdecl (build_decl (TYPE_DECL, get_identifier ("complex float"),
-                       complex_float_type_node));
-  pushdecl (build_decl (TYPE_DECL, get_identifier ("complex double"),
-                       complex_double_type_node));
-  pushdecl (build_decl (TYPE_DECL, get_identifier ("complex long double"),
-                       complex_long_double_type_node));
-  pushdecl (build_decl (TYPE_DECL,
-                       ridpointers[(int) RID_VOID], void_type_node));
-
-#ifdef MD_INIT_BUILTINS
-  MD_INIT_BUILTINS;
-#endif
-
-  wchar_type_node = get_identifier (flag_short_wchar
-                                   ? "short unsigned int"
-                                   : WCHAR_TYPE);
-  wchar_type_node = TREE_TYPE (IDENTIFIER_GLOBAL_VALUE (wchar_type_node));
-  wchar_type_size = TYPE_PRECISION (wchar_type_node);
-  signed_wchar_type_node = signed_type (wchar_type_node);
-  unsigned_wchar_type_node = unsigned_type (wchar_type_node);
+  c_common_nodes_and_builtins ();
 
   boolean_type_node = integer_type_node;
   boolean_true_node = integer_one_node;
@@ -3079,30 +3001,6 @@ init_decl_processing ()
   c_bool_true_node = build_int_2 (1, 0);
   TREE_TYPE (c_bool_true_node) = c_bool_type_node;
 
-  /* Make a type to be the domain of a few array types
-     whose domains don't really matter.
-     200 is small enough that it always fits in size_t
-     and large enough that it can hold most function names for the
-     initializations of __FUNCTION__ and __PRETTY_FUNCTION__.  */
-  array_domain_type = build_index_type (build_int_2 (200, 0));
-
-  /* make a type for arrays of characters.
-     With luck nothing will ever really depend on the length of this
-     array type.  */
-  char_array_type_node = build_array_type (char_type_node, array_domain_type);
-
-  /* Likewise for arrays of ints.  */
-  int_array_type_node
-    = build_array_type (integer_type_node, array_domain_type);
-
-  /* This is for wide string constants.  */
-  wchar_array_type_node
-    = build_array_type (wchar_type_node, array_domain_type);
-
-  void_list_node = tree_cons (NULL_TREE, void_type_node, NULL_TREE);
-
-  c_common_nodes_and_builtins ();
-
   endlink = void_list_node;
   ptr_ftype_void = build_function_type (ptr_type_node, endlink);
   ptr_ftype_ptr
@@ -3158,46 +3056,10 @@ init_decl_processing ()
                            g77_ulongint_type_node));
     }
 
-  builtin_function ("__builtin_aggregate_incoming_address",
-                   build_function_type (ptr_type_node, NULL_TREE),
-                   BUILT_IN_AGGREGATE_INCOMING_ADDRESS,
-                   BUILT_IN_NORMAL, NULL_PTR);
-
-  /* Hooks for the DWARF 2 __throw routine.  */
-  builtin_function ("__builtin_unwind_init",
-                   build_function_type (void_type_node, endlink),
-                   BUILT_IN_UNWIND_INIT, BUILT_IN_NORMAL, NULL_PTR);
-  builtin_function ("__builtin_dwarf_cfa", ptr_ftype_void,
-                   BUILT_IN_DWARF_CFA, BUILT_IN_NORMAL, NULL_PTR);
-  builtin_function ("__builtin_dwarf_fp_regnum",
-                   build_function_type (unsigned_type_node, endlink),
-                   BUILT_IN_DWARF_FP_REGNUM, BUILT_IN_NORMAL, NULL_PTR);
-  builtin_function ("__builtin_init_dwarf_reg_size_table", void_ftype_ptr,
-                   BUILT_IN_INIT_DWARF_REG_SIZES, BUILT_IN_NORMAL, NULL_PTR);
-  builtin_function ("__builtin_frob_return_addr", ptr_ftype_ptr,
-                   BUILT_IN_FROB_RETURN_ADDR, BUILT_IN_NORMAL, NULL_PTR);
-  builtin_function ("__builtin_extract_return_addr", ptr_ftype_ptr,
-                   BUILT_IN_EXTRACT_RETURN_ADDR, BUILT_IN_NORMAL, NULL_PTR);
-  builtin_function
-    ("__builtin_eh_return",
-     build_function_type (void_type_node,
-                         tree_cons (NULL_TREE, ptr_type_node,
-                                    tree_cons (NULL_TREE,
-                                               type_for_mode (ptr_mode, 0),
-                                               tree_cons (NULL_TREE,
-                                                          ptr_type_node,
-                                                          endlink)))),
-     BUILT_IN_EH_RETURN, BUILT_IN_NORMAL, NULL_PTR);
-
   pedantic_lvalues = pedantic;
 
-  /* Create the global bindings for __FUNCTION__, __PRETTY_FUNCTION__,
-     and __func__.  */
-  function_id_node = get_identifier ("__FUNCTION__");
-  pretty_function_id_node = get_identifier ("__PRETTY_FUNCTION__");
-  func_id_node = get_identifier ("__func__");
   make_fname_decl = c_make_fname_decl;
-  declare_function_name ();
+  start_fname_decls ();
 
   start_identifier_warnings ();
 
@@ -3230,30 +3092,33 @@ init_decl_processing ()
    are string merging candidates, which is wrong for C99's __func__.  FIXME.  */
 
 static tree
-c_make_fname_decl (id, name, type_dep)
+c_make_fname_decl (id, type_dep)
      tree id;
-     const char *name;
-     int type_dep ATTRIBUTE_UNUSED;
+     int type_dep;
 {
+  const char *name = fname_as_string (type_dep);
   tree decl, type, init;
   size_t length = strlen (name);
 
   type =  build_array_type
           (build_qualified_type (char_type_node, TYPE_QUAL_CONST),
-          build_index_type (build_int_2 (length, 0)));
+          build_index_type (size_int (length)));
 
   decl = build_decl (VAR_DECL, id, type);
+  /* We don't push the decl, so have to set its context here. */
+  DECL_CONTEXT (decl) = current_function_decl;
+  
   TREE_STATIC (decl) = 1;
   TREE_READONLY (decl) = 1;
-  TREE_ASM_WRITTEN (decl) = 1;
-  DECL_SOURCE_LINE (decl) = 0;
   DECL_ARTIFICIAL (decl) = 1;
-  DECL_IN_SYSTEM_HEADER (decl) = 1;
-  DECL_IGNORED_P (decl) = 1;
+  
   init = build_string (length + 1, name);
   TREE_TYPE (init) = type;
   DECL_INITIAL (decl) = init;
-  finish_decl (pushdecl (decl), init, NULL_TREE);
+
+  TREE_USED (decl) = 1;
+  
+  finish_decl (decl, init, NULL_TREE);
 
   return decl;
 }
@@ -3283,8 +3148,8 @@ builtin_function (name, type, function_code, class, library_name)
   if (flag_traditional && name[0] != '_')
     DECL_BUILT_IN_NONANSI (decl) = 1;
   if (library_name)
-    DECL_ASSEMBLER_NAME (decl) = get_identifier (library_name);
-  make_decl_rtl (decl, NULL_PTR, 1);
+    SET_DECL_ASSEMBLER_NAME (decl, get_identifier (library_name));
+  make_decl_rtl (decl, NULL);
   pushdecl (decl);
   DECL_BUILT_IN_CLASS (decl) = class;
   DECL_FUNCTION_CODE (decl) = function_code;
@@ -3383,6 +3248,60 @@ shadow_tag_warned (declspecs, warned)
     }
 }
 \f
+/* Construct an array declarator.  EXPR is the expression inside [], or
+   NULL_TREE.  QUALS are the type qualifiers inside the [] (to be applied
+   to the pointer to which a parameter array is converted).  STATIC_P is
+   non-zero if "static" is inside the [], zero otherwise.  VLA_UNSPEC_P
+   is non-zero is the array is [*], a VLA of unspecified length which is
+   nevertheless a complete type (not currently implemented by GCC),
+   zero otherwise.  The declarator is constructed as an ARRAY_REF
+   (to be decoded by grokdeclarator), whose operand 0 is what's on the
+   left of the [] (filled by in set_array_declarator_type) and operand 1
+   is the expression inside; whose TREE_TYPE is the type qualifiers and
+   which has TREE_STATIC set if "static" is used.  */
+
+tree
+build_array_declarator (expr, quals, static_p, vla_unspec_p)
+     tree expr;
+     tree quals;
+     int static_p;
+     int vla_unspec_p;
+{
+  tree decl;
+  decl = build_nt (ARRAY_REF, NULL_TREE, expr);
+  TREE_TYPE (decl) = quals;
+  TREE_STATIC (decl) = (static_p ? 1 : 0);
+  if (pedantic && !flag_isoc99)
+    {
+      if (static_p || quals != NULL_TREE)
+       pedwarn ("ISO C89 does not support `static' or type qualifiers in parameter array declarators");
+      if (vla_unspec_p)
+       pedwarn ("ISO C89 does not support `[*]' array declarators");
+    }
+  if (vla_unspec_p)
+    warning ("GCC does not yet properly implement `[*]' array declarators");
+  return decl;
+}
+
+/* Set the type of an array declarator.  DECL is the declarator, as
+   constructed by build_array_declarator; TYPE is what appears on the left
+   of the [] and goes in operand 0.  ABSTRACT_P is non-zero if it is an
+   abstract declarator, zero otherwise; this is used to reject static and
+   type qualifiers in abstract declarators, where they are not in the
+   C99 grammar.  */
+
+tree
+set_array_declarator_type (decl, type, abstract_p)
+     tree decl;
+     tree type;
+     int abstract_p;
+{
+  TREE_OPERAND (decl, 0) = type;
+  if (abstract_p && (TREE_TYPE (decl) != NULL_TREE || TREE_STATIC (decl)))
+    error ("static or type qualifiers in abstract declarator");
+  return decl;
+}
+\f
 /* Decode a "typename", such as "int **", returning a ..._TYPE node.  */
 
 tree
@@ -3552,7 +3471,7 @@ start_decl (declarator, declspecs, initialized, attributes, prefix_attributes)
       /* But not if this is a duplicate decl
         and we preserved the rtl from the previous one
         (which may or may not happen).  */
-      && DECL_RTL (tem) == 0
+      && !DECL_RTL_SET_P (tem)
       && !DECL_CONTEXT (tem))
     {
       if (TREE_TYPE (tem) != error_mark_node
@@ -3585,9 +3504,9 @@ finish_decl (decl, init, asmspec_tree)
     asmspec = TREE_STRING_POINTER (asmspec_tree);
 
   /* If `start_decl' didn't like having an initialization, ignore it now.  */
-
   if (init != 0 && DECL_INITIAL (decl) == 0)
     init = 0;
+  
   /* Don't crash if parm is initialized.  */
   if (TREE_CODE (decl) == PARM_DECL)
     init = 0;
@@ -3605,7 +3524,6 @@ finish_decl (decl, init, asmspec_tree)
     }
 
   /* Deduce size of array from initialization, if not already known */
-
   if (TREE_CODE (type) == ARRAY_TYPE
       && TYPE_DOMAIN (type) == 0
       && TREE_CODE (decl) != TYPE_DECL)
@@ -3695,8 +3613,8 @@ finish_decl (decl, init, asmspec_tree)
   if (TREE_CODE (decl) == FUNCTION_DECL && asmspec)
     {
       DECL_BUILT_IN_CLASS (decl) = NOT_BUILT_IN;
-      DECL_RTL (decl) = 0;
-      DECL_ASSEMBLER_NAME (decl) = get_identifier (asmspec);
+      SET_DECL_RTL (decl, NULL_RTX);
+      SET_DECL_ASSEMBLER_NAME (decl, get_identifier (asmspec));
     }
 
   /* Output the assembler code and/or RTL code for variables and functions,
@@ -3709,16 +3627,43 @@ finish_decl (decl, init, asmspec_tree)
       maybe_objc_check_decl (decl);
 
       if (!DECL_CONTEXT (decl))
-       rest_of_decl_compilation (decl, asmspec,
-                                 (DECL_CONTEXT (decl) == 0
-                                  || TREE_ASM_WRITTEN (decl)), 0);
+       {
+         if (DECL_INITIAL (decl) == NULL_TREE
+             || DECL_INITIAL (decl) == error_mark_node)
+           /* Don't output anything
+              when a tentative file-scope definition is seen.
+              But at end of compilation, do output code for them.  */
+           DECL_DEFER_OUTPUT (decl) = 1;
+         rest_of_decl_compilation (decl, asmspec,
+                                   (DECL_CONTEXT (decl) == 0
+                                    || TREE_ASM_WRITTEN (decl)), 0);
+       }
       else
        {
+         /* This is a local variable.  If there is an ASMSPEC, the
+            user has requested that we handle it specially.  */
          if (asmspec)
            {
-             DECL_ASSEMBLER_NAME (decl) = get_identifier (asmspec);
-             DECL_C_HARD_REGISTER (decl) = 1;
+             /* In conjunction with an ASMSPEC, the `register'
+                keyword indicates that we should place the variable
+                in a particular register.  */
+             if (DECL_REGISTER (decl))
+               DECL_C_HARD_REGISTER (decl) = 1;
+
+             /* If this is not a static variable, issue a warning.
+                It doesn't make any sense to give an ASMSPEC for an
+                ordinary, non-register local variable.  Historically,
+                GCC has accepted -- but ignored -- the ASMSPEC in
+                this case.  */
+             if (TREE_CODE (decl) == VAR_DECL 
+                 && !DECL_REGISTER (decl)
+                 && !TREE_STATIC (decl))
+               warning_with_decl (decl,
+                                  "ignoring asm-specifier for non-static local variable `%s'");
+             else
+               SET_DECL_ASSEMBLER_NAME (decl, get_identifier (asmspec));
            }
+
          add_decl_stmt (decl);
        }
 
@@ -3742,7 +3687,7 @@ finish_decl (decl, init, asmspec_tree)
     {
       /* This is a no-op in c-lang.c or something real in objc-actions.c.  */
       maybe_objc_check_decl (decl);
-      rest_of_decl_compilation (decl, NULL_PTR, DECL_CONTEXT (decl) == 0, 0);
+      rest_of_decl_compilation (decl, NULL, DECL_CONTEXT (decl) == 0, 0);
     }
 
   /* At the end of a declaration, throw away any variable type sizes
@@ -3940,6 +3885,8 @@ grokdeclarator (declarator, declspecs, decl_context, initialized)
   int bitfield = 0;
   int size_varies = 0;
   tree decl_machine_attr = NULL_TREE;
+  tree array_ptr_quals = NULL_TREE;
+  int array_parm_static = 0;
 
   if (decl_context == BITFIELD)
     bitfield = 1, decl_context = FIELD;
@@ -4018,9 +3965,9 @@ grokdeclarator (declarator, declspecs, decl_context, initialized)
       if (TREE_CODE (id) == IDENTIFIER_NODE && C_IS_RESERVED_WORD (id))
        {
          enum rid i = C_RID_CODE (id);
-         if (i <= RID_LAST_MODIFIER)
+         if ((int) i <= (int) RID_LAST_MODIFIER)
            {
-             if (i == RID_LONG && specbits & (1<<i))
+             if (i == RID_LONG && (specbits & (1 << (int) i)))
                {
                  if (longlong)
                    error ("`long long long' is too long for GCC");
@@ -4032,9 +3979,9 @@ grokdeclarator (declarator, declspecs, decl_context, initialized)
                      longlong = 1;
                    }
                }
-             else if (specbits & (1 << i))
+             else if (specbits & (1 << (int) i))
                pedwarn ("duplicate `%s'", IDENTIFIER_POINTER (id));
-             specbits |= 1 << i;
+             specbits |= 1 << (int) i;
              goto found;
            }
        }
@@ -4089,7 +4036,8 @@ grokdeclarator (declarator, declspecs, decl_context, initialized)
          /* Issue a warning if this is an ISO C 99 program or if -Wreturn-type
             and this is a function, or if -Wimplicit; prefer the former
             warning since it is more explicit.  */
-         if ((warn_implicit_int || warn_return_type) && funcdef_flag)
+         if ((warn_implicit_int || warn_return_type || flag_isoc99)
+             && funcdef_flag)
            warn_about_return_type = 1;
          else if (warn_implicit_int || flag_isoc99)
            pedwarn_c99 ("type defaults to `int' in declaration of `%s'",
@@ -4367,6 +4315,16 @@ grokdeclarator (declarator, declspecs, decl_context, initialized)
         array or function or pointer, and DECLARATOR has had its
         outermost layer removed.  */
 
+      if (array_ptr_quals != NULL_TREE || array_parm_static)
+       {
+         /* Only the innermost declarator (making a parameter be of
+            array type which is converted to pointer type)
+            may have static or type qualifiers.  */
+         error ("static or type qualifiers in non-parameter array declarator");
+         array_ptr_quals = NULL_TREE;
+         array_parm_static = 0;
+       }
+
       if (TREE_CODE (declarator) == ARRAY_REF)
        {
          register tree itype = NULL_TREE;
@@ -4374,6 +4332,9 @@ grokdeclarator (declarator, declspecs, decl_context, initialized)
          /* The index is a signed object `sizetype' bits wide.  */
          tree index_type = signed_type (sizetype);
 
+         array_ptr_quals = TREE_TYPE (declarator);
+         array_parm_static = TREE_STATIC (declarator);
+
          declarator = TREE_OPERAND (declarator, 0);
 
          /* Check for some types that there cannot be arrays of.  */
@@ -4479,7 +4440,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized)
          else if (decl_context == FIELD)
            {
              /* ??? Need to check somewhere that this is a structure
-                and not a union, that this field is last, and that 
+                and not a union, that this field is last, and that
                 this structure has at least one other named member.  */
 
              if (pedantic && !flag_isoc99 && !in_system_header)
@@ -4512,14 +4473,24 @@ grokdeclarator (declarator, declspecs, decl_context, initialized)
          if (type_quals)
            type = c_build_qualified_type (type, type_quals);
 
-#if 0
-         /* Don't clear these; leave them set so that the array type
-            or the variable is itself const or volatile.  */
-         type_quals = TYPE_UNQUALIFIED;
-#endif
-
          if (size_varies)
            C_TYPE_VARIABLE_SIZE (type) = 1;
+
+         /* The GCC extension for zero-length arrays differs from
+            ISO flexible array members in that sizeof yields zero.  */
+         if (size && integer_zerop (size))
+           {
+             layout_type (type);
+             TYPE_SIZE (type) = bitsize_zero_node;
+             TYPE_SIZE_UNIT (type) = size_zero_node;
+           }
+         if (decl_context != PARM
+             && (array_ptr_quals != NULL_TREE || array_parm_static))
+           {
+             error ("static or type qualifiers in non-parameter array declarator");
+             array_ptr_quals = NULL_TREE;
+             array_parm_static = 0;
+           }
        }
       else if (TREE_CODE (declarator) == CALL_EXPR)
        {
@@ -4676,7 +4647,12 @@ grokdeclarator (declarator, declspecs, decl_context, initialized)
   if (TREE_CODE (type) == ARRAY_TYPE
       && COMPLETE_TYPE_P (type)
       && TREE_OVERFLOW (TYPE_SIZE (type)))
-    error ("size of array `%s' is too large", name);
+    {
+      error ("size of array `%s' is too large", name);
+      /* If we proceed with the array type as it is, we'll eventully
+        crash in tree_low_cst().  */
+      type = error_mark_node;
+    }
 
   /* If this is declaring a typedef name, return a TYPE_DECL.  */
 
@@ -4766,6 +4742,44 @@ grokdeclarator (declarator, declspecs, decl_context, initialized)
              type = c_build_qualified_type (type, type_quals);
            type = build_pointer_type (type);
            type_quals = TYPE_UNQUALIFIED;
+           if (array_ptr_quals)
+             {
+               tree new_ptr_quals, new_ptr_attrs;
+               int erred = 0;
+               split_specs_attrs (array_ptr_quals, &new_ptr_quals, &new_ptr_attrs);
+               /* We don't yet implement attributes in this context.  */
+               if (new_ptr_attrs != NULL_TREE)
+                 warning ("attributes in parameter array declarator ignored");
+
+               constp = 0;
+               volatilep = 0;
+               restrictp = 0;
+               for (; new_ptr_quals; new_ptr_quals = TREE_CHAIN (new_ptr_quals))
+                 {
+                   tree qualifier = TREE_VALUE (new_ptr_quals);
+
+                   if (C_IS_RESERVED_WORD (qualifier))
+                     {
+                       if (C_RID_CODE (qualifier) == RID_CONST)
+                         constp++;
+                       else if (C_RID_CODE (qualifier) == RID_VOLATILE)
+                         volatilep++;
+                       else if (C_RID_CODE (qualifier) == RID_RESTRICT)
+                         restrictp++;
+                       else
+                         erred++;
+                     }
+                   else
+                     erred++;
+                 }
+
+               if (erred)
+                 error ("invalid type modifier within array declarator");
+
+               type_quals = ((constp ? TYPE_QUAL_CONST : 0)
+                             | (restrictp ? TYPE_QUAL_RESTRICT : 0)
+                             | (volatilep ? TYPE_QUAL_VOLATILE : 0));
+             }
            size_varies = 0;
          }
        else if (TREE_CODE (type) == FUNCTION_TYPE)
@@ -4894,9 +4908,11 @@ grokdeclarator (declarator, declspecs, decl_context, initialized)
        /* Move type qualifiers down to element of an array.  */
        if (TREE_CODE (type) == ARRAY_TYPE && type_quals)
          {
+           int saved_align = TYPE_ALIGN(type);
            type = build_array_type (c_build_qualified_type (TREE_TYPE (type),
                                                             type_quals),
                                     TYPE_DOMAIN (type));
+           TYPE_ALIGN (type) = saved_align;
 #if 0 /* Leave the variable const or volatile as well.  */
            type_quals = TYPE_UNQUALIFIED;
 #endif
@@ -5229,9 +5245,6 @@ xref_tag (code, name)
   ref = make_node (code);
   if (code == ENUMERAL_TYPE)
     {
-      /* (In ANSI, Enums can be referred to only if already defined.)  */
-      if (pedantic)
-       pedwarn ("ISO C forbids forward references to `enum' types");
       /* Give the type a default layout like unsigned int
         to avoid crashing if it does not get defined.  */
       TYPE_MODE (ref) = TYPE_MODE (unsigned_type_node);
@@ -5322,6 +5335,7 @@ finish_struct (t, fieldlist, attributes)
 {
   register tree x;
   int toplevel = global_binding_level == current_binding_level;
+  int saw_named_field;
 
   /* If this type was previously laid out as a forward reference,
      make sure we lay it out again.  */
@@ -5360,6 +5374,7 @@ finish_struct (t, fieldlist, attributes)
      Store 0 there, except for ": 0" fields (so we can find them
      and delete them, below).  */
 
+  saw_named_field = 0;
   for (x = fieldlist; x; x = TREE_CHAIN (x))
     {
       DECL_CONTEXT (x) = t;
@@ -5493,6 +5508,22 @@ finish_struct (t, fieldlist, attributes)
        }
 
       DECL_INITIAL (x) = 0;
+
+      /* Detect flexible array member in an invalid context.  */
+      if (TREE_CODE (TREE_TYPE (x)) == ARRAY_TYPE
+         && TYPE_SIZE (TREE_TYPE (x)) == NULL_TREE
+         && TYPE_DOMAIN (TREE_TYPE (x)) != NULL_TREE
+         && TYPE_MAX_VALUE (TYPE_DOMAIN (TREE_TYPE (x))) == NULL_TREE)
+       {
+         if (TREE_CODE (t) == UNION_TYPE)
+           error_with_decl (x, "flexible array member in union");
+         else if (TREE_CHAIN (x) != NULL_TREE)
+           error_with_decl (x, "flexible array member not at end of struct");
+         else if (! saw_named_field)
+           error_with_decl (x, "flexible array member in otherwise empty struct");
+       }
+      if (DECL_NAME (x))
+       saw_named_field = 1;
     }
 
   /* Delete all duplicate fields from the fieldlist */
@@ -5538,8 +5569,8 @@ finish_struct (t, fieldlist, attributes)
        fieldlistp = &TREE_CHAIN (*fieldlistp);
   }
 
-  /*  Now we have the truly final field list.
-      Store it in this type and in the variants.  */
+  /* Now we have the truly final field list.
+     Store it in this type and in the variants.  */
 
   TYPE_FIELDS (t) = fieldlist;
 
@@ -5575,7 +5606,7 @@ finish_struct (t, fieldlist, attributes)
              layout_decl (decl, 0);
              /* This is a no-op in c-lang.c or something real in objc-actions.c.  */
              maybe_objc_check_decl (decl);
-             rest_of_decl_compilation (decl, NULL_PTR, toplevel, 0);
+             rest_of_decl_compilation (decl, NULL, toplevel, 0);
              if (! toplevel)
                expand_decl (decl);
              --current_binding_level->n_incomplete;
@@ -5701,13 +5732,19 @@ finish_enum (enumtype, values, attributes)
   unsign = (tree_int_cst_sgn (minnode) >= 0);
   precision = MAX (min_precision (minnode, unsign),
                   min_precision (maxnode, unsign));
-  if (!TYPE_PACKED (enumtype))
-    precision = MAX (precision, TYPE_PRECISION (integer_type_node));
-  if (type_for_size (precision, unsign) == 0)
+  if (TYPE_PACKED (enumtype) || precision > TYPE_PRECISION (integer_type_node))
     {
-      warning ("enumeration values exceed range of largest integer");
-      precision = TYPE_PRECISION (long_long_integer_type_node);
+      tree narrowest = type_for_size (precision, unsign);
+      if (narrowest == 0)
+       {
+         warning ("enumeration values exceed range of largest integer");
+         narrowest = long_long_integer_type_node;
+       }
+
+      precision = TYPE_PRECISION (narrowest);
     }
+  else
+    precision = TYPE_PRECISION (integer_type_node);
 
   if (precision == TYPE_PRECISION (integer_type_node))
     enum_value_type = type_for_size (precision, 0);
@@ -5941,12 +5978,18 @@ start_function (declspecs, declarator, prefix_attributes, attributes)
   /* Optionally warn of old-fashioned def with no previous prototype.  */
   if (warn_strict_prototypes
       && TYPE_ARG_TYPES (TREE_TYPE (decl1)) == 0
-      && !(old_decl != 0 && TYPE_ARG_TYPES (TREE_TYPE (old_decl)) != 0))
+      && !(old_decl != 0
+          && (TYPE_ARG_TYPES (TREE_TYPE (old_decl)) != 0
+              || (DECL_BUILT_IN (old_decl)
+                  && ! C_DECL_ANTICIPATED (old_decl)))))
     warning ("function declaration isn't a prototype");
   /* Optionally warn of any global def with no previous prototype.  */
   else if (warn_missing_prototypes
           && TREE_PUBLIC (decl1)
-          && !(old_decl != 0 && TYPE_ARG_TYPES (TREE_TYPE (old_decl)) != 0)
+          && !(old_decl != 0
+               && (TYPE_ARG_TYPES (TREE_TYPE (old_decl)) != 0
+                   || (DECL_BUILT_IN (old_decl)
+                       && ! C_DECL_ANTICIPATED (old_decl))))
           && ! MAIN_NAME_P (DECL_NAME (decl1)))
     warning_with_decl (decl1, "no previous prototype for `%s'");
   /* Optionally warn of any def with no previous prototype
@@ -6036,14 +6079,11 @@ start_function (declspecs, declarator, prefix_attributes, attributes)
        }
 
       /* It is intentional that this message does not mention the third
-        argument, which is warned for only pedantically, because it's
-        blessed by mention in an appendix of the standard.  */
+        argument because it's only mentioned in an appendix of the
+        standard.  */
       if (argct > 0 && (argct < 2 || argct > 3))
        pedwarn_with_decl (decl1, "`%s' takes only zero or two arguments");
 
-      if (argct == 3 && pedantic)
-       pedwarn_with_decl (decl1, "third argument of `%s' is deprecated");
-
       if (! TREE_PUBLIC (decl1))
        pedwarn_with_decl (decl1, "`%s' is normally a non-static function");
     }
@@ -6058,11 +6098,11 @@ start_function (declspecs, declarator, prefix_attributes, attributes)
   declare_parm_level (1);
   current_binding_level->subblocks_tag_transparent = 1;
 
-  make_function_rtl (current_function_decl);
+  make_decl_rtl (current_function_decl, NULL);
 
   restype = TREE_TYPE (TREE_TYPE (current_function_decl));
   /* Promote the value to int before returning it.  */
-  if (C_PROMOTING_INTEGER_TYPE_P (restype))
+  if (c_promoting_integer_type_p (restype))
     {
       /* It retains unsignedness if traditional
         or if not really getting wider.  */
@@ -6084,6 +6124,8 @@ start_function (declspecs, declarator, prefix_attributes, attributes)
 
   immediate_size_expand = old_immediate_size_expand;
 
+  start_fname_decls ();
+  
   return 1;
 }
 
@@ -6500,7 +6542,7 @@ store_parm_decls ()
   init_function_start (fndecl, input_filename, lineno);
 
   /* Begin the statement tree for this function.  */
-  DECL_LANG_SPECIFIC (current_function_decl) 
+  DECL_LANG_SPECIFIC (current_function_decl)
     =((struct lang_decl *) ggc_alloc (sizeof (struct lang_decl)));
   begin_stmt_tree (&DECL_SAVED_TREE (current_function_decl));
 
@@ -6711,6 +6753,8 @@ finish_function (nested)
 #endif
        }
     }
+  
+  finish_fname_decls ();
 
   /* Tie off the statement tree for this function.  */
   finish_stmt_tree (&DECL_SAVED_TREE (fndecl));
@@ -6729,7 +6773,6 @@ finish_function (nested)
         function.  For a nested function, this value is used in
         pop_c_function_context and then reset via pop_function_context.  */
       current_function_decl = NULL;
-      c_function_name_declared_p = 0;
     }
 }
 
@@ -6824,7 +6867,8 @@ c_expand_body (fndecl, nested_p)
     {
       tree ret_type = TREE_TYPE (TREE_TYPE (fndecl));
 
-      if (ret_type && TREE_CODE (TYPE_SIZE_UNIT (ret_type)) == INTEGER_CST
+      if (ret_type && TYPE_SIZE_UNIT (ret_type)
+         && TREE_CODE (TYPE_SIZE_UNIT (ret_type)) == INTEGER_CST
          && 0 < compare_tree_int (TYPE_SIZE_UNIT (ret_type),
                                   larger_than_size))
        {
@@ -6888,7 +6932,7 @@ c_expand_body (fndecl, nested_p)
          pop_function_context ();
        }
     }
-      
+
 }
 \f
 /* Check the declarations given in a for-loop for satisfying the C99
@@ -6964,13 +7008,12 @@ push_c_function_context (f)
      struct function *f;
 {
   struct c_language_function *p;
-  p = ((struct c_language_function *) 
+  p = ((struct c_language_function *)
        xmalloc (sizeof (struct c_language_function)));
   f->language = (struct language_function *) p;
 
   p->base.x_stmt_tree = c_stmt_tree;
   p->base.x_scope_stmt_stack = c_scope_stmt_stack;
-  p->base.x_function_name_declared_p = c_function_name_declared_p;
   p->named_labels = named_labels;
   p->shadowed_labels = shadowed_labels;
   p->returns_value = current_function_returns_value;
@@ -6986,7 +7029,7 @@ void
 pop_c_function_context (f)
      struct function *f;
 {
-  struct c_language_function *p 
+  struct c_language_function *p
     = (struct c_language_function *) f->language;
   tree link;
 
@@ -7008,7 +7051,6 @@ pop_c_function_context (f)
 
   c_stmt_tree = p->base.x_stmt_tree;
   c_scope_stmt_stack = p->base.x_scope_stmt_stack;
-  c_function_name_declared_p = p->base.x_function_name_declared_p;
   named_labels = p->named_labels;
   shadowed_labels = p->shadowed_labels;
   current_function_returns_value = p->returns_value;
@@ -7027,7 +7069,7 @@ void
 mark_c_function_context (f)
      struct function *f;
 {
-  struct c_language_function *p 
+  struct c_language_function *p
     = (struct c_language_function *) f->language;
 
   if (p == 0)
@@ -7141,14 +7183,7 @@ c_begin_compound_stmt ()
 
   /* Create the COMPOUND_STMT.  */
   stmt = add_stmt (build_stmt (COMPOUND_STMT, NULL_TREE));
-  /* If we haven't already declared __FUNCTION__ and its ilk then this
-     is the opening curly brace of the function.  Declare them now.  */
-  if (!c_function_name_declared_p) 
-    {
-      c_function_name_declared_p = 1;
-      declare_function_name ();
-    }
-  
+
   return stmt;
 }
 
@@ -7160,7 +7195,7 @@ c_expand_decl_stmt (t)
      tree t;
 {
   tree decl = DECL_STMT_DECL (t);
-  
+
   /* Expand nested functions.  */
   if (TREE_CODE (decl) == FUNCTION_DECL
       && DECL_CONTEXT (decl) == current_function_decl
@@ -7177,3 +7212,28 @@ identifier_global_value  (t)
 {
   return IDENTIFIER_GLOBAL_VALUE (t);
 }
+
+/* Record a builtin type for C.  If NAME is non-NULL, it is the name used;
+   otherwise the name is found in ridpointers from RID_INDEX.  */
+
+void
+record_builtin_type (rid_index, name, type)
+     enum rid rid_index;
+     const char *name;
+     tree type;
+{
+  tree id;
+  if (name == 0)
+    id = ridpointers[(int) rid_index];
+  else
+    id = get_identifier (name);
+  pushdecl (build_decl (TYPE_DECL, id, type));
+}
+
+/* Build the void_list_node (void_type_node having been created).  */
+tree
+build_void_list_node ()
+{
+  tree t = build_tree_list (NULL_TREE, void_type_node);
+  return t;
+}