OSDN Git Service

Emit an error for too large arrays instead of an ICE.
[pf3gnuchains/gcc-fork.git] / gcc / c-decl.c
index ec94f95..a1fdce7 100644 (file)
@@ -16,8 +16,8 @@ for more details.
 
 You should have received a copy of the GNU General Public License
 along with GCC; see the file COPYING.  If not, write to the Free
-Software Foundation, 59 Temple Place - Suite 330, Boston, MA
-02111-1307, USA.  */
+Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301, USA.  */
 
 /* Process declarations and symbol lookup for C front end.
    Also constructs types; the standard scalar types at initialization,
@@ -60,6 +60,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 #include "libfuncs.h"
 #include "except.h"
 #include "langhooks-def.h"
+#include "pointer-set.h"
 
 /* In grokdeclarator, distinguish syntactic contexts of declarators.  */
 enum decl_context
@@ -465,7 +466,7 @@ c_print_identifier (FILE *file, tree node, int indent)
     {
       tree rid = ridpointers[C_RID_CODE (node)];
       indent_to (file, indent + 4);
-      fprintf (file, "rid " HOST_PTR_PRINTF " \"%s\"",
+      fprintf (file, "rid %p \"%s\"",
               (void *) rid, IDENTIFIER_POINTER (rid));
     }
 }
@@ -560,7 +561,7 @@ c_finish_incomplete_decl (tree decl)
          && !DECL_EXTERNAL (decl)
          && TYPE_DOMAIN (type) == 0)
        {
-         warning (0, "%Jarray %qD assumed to have one element", decl, decl);
+         warning (0, "array %q+D assumed to have one element", decl);
 
          complete_array_type (&TREE_TYPE (decl), NULL_TREE, true);
 
@@ -751,15 +752,15 @@ pop_scope (void)
          /* Warnings for unused labels, errors for undefined labels.  */
          if (TREE_USED (p) && !DECL_INITIAL (p))
            {
-             error ("%Jlabel %qD used but not defined", p, p);
+             error ("label %q+D used but not defined", p);
              DECL_INITIAL (p) = error_mark_node;
            }
          else if (!TREE_USED (p) && warn_unused_label)
            {
              if (DECL_INITIAL (p))
-               warning (0, "%Jlabel %qD defined but not used", p, p);
+               warning (0, "label %q+D defined but not used", p);
              else
-               warning (0, "%Jlabel %qD declared but not defined", p, p);
+               warning (0, "label %q+D declared but not defined", p);
            }
          /* Labels go in BLOCK_VARS.  */
          TREE_CHAIN (p) = BLOCK_VARS (block);
@@ -794,26 +795,25 @@ pop_scope (void)
          if (!DECL_EXTERNAL (p)
              && DECL_INITIAL (p) == 0)
            {
-             error ("%Jnested function %qD declared but never defined", p, p);
+             error ("nested function %q+D declared but never defined", p);
              undef_nested_function = true;
            }
          goto common_symbol;
 
        case VAR_DECL:
          /* Warnings for unused variables.  */
-         if (warn_unused_variable
-             && !TREE_USED (p)
+         if (!TREE_USED (p)
              && !DECL_IN_SYSTEM_HEADER (p)
              && DECL_NAME (p)
              && !DECL_ARTIFICIAL (p)
              && scope != file_scope
              && scope != external_scope) 
-           warning (0, "%Junused variable %qD", p, p);
+           warning (OPT_Wunused_variable, "unused variable %q+D", p);
 
          if (b->inner_comp)
            {
-             error ("%Jtype of array %qD completed incompatibly with"
-                    " implicit initialization", p, p);
+             error ("type of array %q+D completed incompatibly with"
+                    " implicit initialization", p);
            }
 
          /* Fall through.  */
@@ -1088,14 +1088,14 @@ validate_proto_after_old_defn (tree newdecl, tree newtype, tree oldtype)
         agree on the number of arguments.  */
       if (END_OF_ARGLIST (oldargtype))
        {
-         error ("%Jprototype for %qD declares more arguments "
-                "than previous old-style definition", newdecl, newdecl);
+         error ("prototype for %q+D declares more arguments "
+                "than previous old-style definition", newdecl);
          return false;
        }
       else if (END_OF_ARGLIST (newargtype))
        {
-         error ("%Jprototype for %qD declares fewer arguments "
-                "than previous old-style definition", newdecl, newdecl);
+         error ("prototype for %q+D declares fewer arguments "
+                "than previous old-style definition", newdecl);
          return false;
        }
 
@@ -1103,9 +1103,9 @@ validate_proto_after_old_defn (tree newdecl, tree newtype, tree oldtype)
         for the arg.  */
       else if (!comptypes (oldargtype, newargtype))
        {
-         error ("%Jprototype for %qD declares argument %d"
+         error ("prototype for %q+D declares argument %d"
                 " with incompatible type",
-                newdecl, newdecl, i);
+                newdecl, i);
          return false;
        }
 
@@ -1116,8 +1116,8 @@ validate_proto_after_old_defn (tree newdecl, tree newtype, tree oldtype)
 
   /* If we get here, no errors were found, but do issue a warning
      for this poor-style construct.  */
-  warning (0, "%Jprototype for %qD follows non-prototype definition",
-          newdecl, newdecl);
+  warning (0, "prototype for %q+D follows non-prototype definition",
+          newdecl);
   return true;
 #undef END_OF_ARGLIST
 }
@@ -1126,16 +1126,16 @@ validate_proto_after_old_defn (tree newdecl, tree newtype, tree oldtype)
    first in a pair of mismatched declarations, using the diagnostic
    function DIAG.  */
 static void
-locate_old_decl (tree decl, void (*diag)(const char *, ...))
+locate_old_decl (tree decl, void (*diag)(const char *, ...) ATTRIBUTE_GCC_CDIAG(1,2))
 {
   if (TREE_CODE (decl) == FUNCTION_DECL && DECL_BUILT_IN (decl))
     ;
   else if (DECL_INITIAL (decl))
-    diag (N_("%Jprevious definition of %qD was here"), decl, decl);
+    diag (G_("previous definition of %q+D was here"), decl);
   else if (C_DECL_IMPLICIT (decl))
-    diag (N_("%Jprevious implicit declaration of %qD was here"), decl, decl);
+    diag (G_("previous implicit declaration of %q+D was here"), decl);
   else
-    diag (N_("%Jprevious declaration of %qD was here"), decl, decl);
+    diag (G_("previous declaration of %q+D was here"), decl);
 }
 
 /* Subroutine of duplicate_decls.  Compare NEWDECL to OLDDECL.
@@ -1155,6 +1155,9 @@ diagnose_mismatched_decls (tree newdecl, tree olddecl,
   bool warned = false;
   bool retval = true;
 
+#define DECL_EXTERN_INLINE(DECL) (DECL_DECLARED_INLINE_P (DECL)  \
+                                 && DECL_EXTERNAL (DECL))
+
   /* If we have error_mark_node for either decl or type, just discard
      the previous decl - we're in an error cascade already.  */
   if (olddecl == error_mark_node || newdecl == error_mark_node)
@@ -1172,16 +1175,15 @@ diagnose_mismatched_decls (tree newdecl, tree olddecl,
            && DECL_BUILT_IN (olddecl)
            && !C_DECL_DECLARED_BUILTIN (olddecl)))
        {
-         error ("%J%qD redeclared as different kind of symbol",
-                newdecl, newdecl);
+         error ("%q+D redeclared as different kind of symbol", newdecl);
          locate_old_decl (olddecl, error);
        }
       else if (TREE_PUBLIC (newdecl))
-       warning (0, "%Jbuilt-in function %qD declared as non-function",
-                newdecl, newdecl);
+       warning (0, "built-in function %q+D declared as non-function",
+                newdecl);
       else
-       warning (OPT_Wshadow, "%Jdeclaration of %qD shadows "
-                "a built-in function", newdecl, newdecl);
+       warning (OPT_Wshadow, "declaration of %q+D shadows "
+                "a built-in function", newdecl);
       return false;
     }
 
@@ -1189,7 +1191,7 @@ diagnose_mismatched_decls (tree newdecl, tree olddecl,
      given scope.  */
   if (TREE_CODE (olddecl) == CONST_DECL)
     {
-      error ("%Jredeclaration of enumerator %qD", newdecl, newdecl);
+      error ("redeclaration of enumerator %q+D", newdecl);
       locate_old_decl (olddecl, error);
       return false;
     }
@@ -1210,8 +1212,8 @@ diagnose_mismatched_decls (tree newdecl, tree olddecl,
              /* If types don't match for a built-in, throw away the
                 built-in.  No point in calling locate_old_decl here, it
                 won't print anything.  */
-             warning (0, "%Jconflicting types for built-in function %qD",
-                      newdecl, newdecl);
+             warning (0, "conflicting types for built-in function %q+D",
+                      newdecl);
              return false;
            }
        }
@@ -1234,7 +1236,7 @@ diagnose_mismatched_decls (tree newdecl, tree olddecl,
               && TYPE_MAIN_VARIANT (TREE_TYPE (newtype)) == integer_type_node
               && C_FUNCTION_IMPLICIT_INT (newdecl) && !DECL_INITIAL (olddecl))
        {
-         pedwarn ("%Jconflicting types for %qD", newdecl, newdecl);
+         pedwarn ("conflicting types for %q+D", newdecl);
          /* Make sure we keep void as the return type.  */
          TREE_TYPE (newdecl) = *newtypep = newtype = oldtype;
          C_FUNCTION_IMPLICIT_INT (newdecl) = 0;
@@ -1247,7 +1249,7 @@ diagnose_mismatched_decls (tree newdecl, tree olddecl,
               && TYPE_MAIN_VARIANT (TREE_TYPE (oldtype)) == integer_type_node
               && C_DECL_IMPLICIT (olddecl) && !DECL_INITIAL (olddecl))
        {
-         pedwarn ("%Jconflicting types for %qD", newdecl, newdecl);
+         pedwarn ("conflicting types for %q+D", newdecl);
          /* Make sure we keep void as the return type.  */
          TREE_TYPE (olddecl) = *oldtypep = oldtype = newtype;
          pedwarned = true;
@@ -1255,9 +1257,9 @@ diagnose_mismatched_decls (tree newdecl, tree olddecl,
       else
        {
          if (TYPE_QUALS (newtype) != TYPE_QUALS (oldtype))
-           error ("%J conflicting type qualifiers for %qD", newdecl, newdecl);
+           error ("conflicting type qualifiers for %q+D", newdecl);
          else
-           error ("%Jconflicting types for %qD", newdecl, newdecl);
+           error ("conflicting types for %q+D", newdecl);
          diagnose_arglist_conflict (newdecl, olddecl, newtype, oldtype);
          locate_old_decl (olddecl, error);
          return false;
@@ -1272,7 +1274,7 @@ diagnose_mismatched_decls (tree newdecl, tree olddecl,
       if (DECL_IN_SYSTEM_HEADER (newdecl) || DECL_IN_SYSTEM_HEADER (olddecl))
        return true;  /* Allow OLDDECL to continue in use.  */
 
-      error ("%Jredefinition of typedef %qD", newdecl, newdecl);
+      error ("redefinition of typedef %q+D", newdecl);
       locate_old_decl (olddecl, error);
       return false;
     }
@@ -1283,6 +1285,7 @@ diagnose_mismatched_decls (tree newdecl, tree olddecl,
      Multiple definitions are not allowed (6.9p3,5) but GCC permits
      two definitions if one is 'extern inline' and one is not.  The non-
      extern-inline definition supersedes the extern-inline definition.  */
+
   else if (TREE_CODE (newdecl) == FUNCTION_DECL)
     {
       /* If you declare a built-in function name as static, or
@@ -1295,8 +1298,8 @@ diagnose_mismatched_decls (tree newdecl, tree olddecl,
              || (DECL_INITIAL (newdecl)
                  && !TYPE_ARG_TYPES (TREE_TYPE (newdecl)))))
        {
-         warning (OPT_Wshadow, "%Jdeclaration of %qD shadows "
-                  "a built-in function", newdecl, newdecl);
+         warning (OPT_Wshadow, "declaration of %q+D shadows "
+                  "a built-in function", newdecl);
          /* Discard the old built-in function.  */
          return false;
        }
@@ -1305,45 +1308,25 @@ diagnose_mismatched_decls (tree newdecl, tree olddecl,
        {
          if (DECL_INITIAL (olddecl))
            {
-             /* If both decls have extern inline and are in the same TU,
-                reject the new decl.  */
-             if (DECL_DECLARED_INLINE_P (olddecl)
-                 && DECL_EXTERNAL (olddecl)
-                 && DECL_DECLARED_INLINE_P (newdecl)
-                 && DECL_EXTERNAL (newdecl)
+             /* If both decls are in the same TU and the new declaration
+                isn't overriding an extern inline reject the new decl.
+                When we handle c99 style inline rules we'll want to reject
+                the following:
+
+                DECL_EXTERN_INLINE (olddecl)
+                && !DECL_EXTERN_INLINE (newdecl)
+
+                if they're in the same translation unit. Until we implement
+                the full semantics we accept the construct.  */
+             if (!(DECL_EXTERN_INLINE (olddecl)
+                   && !DECL_EXTERN_INLINE (newdecl))
                  && same_translation_unit_p (newdecl, olddecl))
                {
-                 error ("%Jredefinition of %qD", newdecl, newdecl);
+                 error ("redefinition of %q+D", newdecl);
                  locate_old_decl (olddecl, error);
                  return false;
                }
-             /* If both decls have not extern inline, reject the new decl.  */
-             if (!DECL_DECLARED_INLINE_P (olddecl)
-                 && !DECL_EXTERNAL (olddecl)
-                 && !DECL_DECLARED_INLINE_P (newdecl)
-                 && !DECL_EXTERNAL (newdecl))
-               {
-                 error ("%Jredefinition of %qD", newdecl, newdecl);
-                 locate_old_decl (olddecl, error);
-                 return false;
-               }
-             /* If the new decl is declared as extern inline, error if they are
-                in the same TU, otherwise retain the old decl.  */
-             if (!DECL_DECLARED_INLINE_P (olddecl)
-                 && !DECL_EXTERNAL (olddecl)
-                 && DECL_DECLARED_INLINE_P (newdecl)
-                 && DECL_EXTERNAL (newdecl))
-               {
-                 if (same_translation_unit_p (newdecl, olddecl))
-                   {
-                     error ("%Jredefinition of %qD", newdecl, newdecl);
-                     locate_old_decl (olddecl, error);
-                     return false;
-                   }
-                 else
-                   retval = false;
-               }
-          }
+           }
        }
       /* If we have a prototype after an old-style function definition,
         the argument types must be checked specially.  */
@@ -1372,11 +1355,10 @@ diagnose_mismatched_decls (tree newdecl, tree olddecl,
             occur only in Objective C; see also above.  (FIXME: Make
             Objective C use normal builtins.)  */
          if (!DECL_IS_BUILTIN (olddecl)
-             && !(DECL_EXTERNAL (olddecl)
-                  && DECL_DECLARED_INLINE_P (olddecl)))
+             && !DECL_EXTERN_INLINE (olddecl))
            {
-             error ("%Jstatic declaration of %qD follows "
-                    "non-static declaration", newdecl, newdecl);
+             error ("static declaration of %q+D follows "
+                    "non-static declaration", newdecl);
              locate_old_decl (olddecl, error);
            }
          return false;
@@ -1385,15 +1367,15 @@ diagnose_mismatched_decls (tree newdecl, tree olddecl,
        {
          if (DECL_CONTEXT (olddecl))
            {
-             error ("%Jnon-static declaration of %qD follows "
-                    "static declaration", newdecl, newdecl);
+             error ("non-static declaration of %q+D follows "
+                    "static declaration", newdecl);
              locate_old_decl (olddecl, error);
              return false;
            }
          else if (warn_traditional)
            {
-             warning (0, "%Jnon-static declaration of %qD follows "
-                      "static declaration", newdecl, newdecl);
+             warning (OPT_Wtraditional, "non-static declaration of %q+D "
+                      "follows static declaration", newdecl);
              warned = true;
            }
        }
@@ -1402,14 +1384,14 @@ diagnose_mismatched_decls (tree newdecl, tree olddecl,
     {
       /* Only variables can be thread-local, and all declarations must
         agree on this property.  */
-      if (DECL_THREAD_LOCAL (newdecl) != DECL_THREAD_LOCAL (olddecl))
+      if (DECL_THREAD_LOCAL_P (newdecl) != DECL_THREAD_LOCAL_P (olddecl))
        {
-         if (DECL_THREAD_LOCAL (newdecl))
-           error ("%Jthread-local declaration of %qD follows "
-                  "non-thread-local declaration", newdecl, newdecl);
+         if (DECL_THREAD_LOCAL_P (newdecl))
+           error ("thread-local declaration of %q+D follows "
+                  "non-thread-local declaration", newdecl);
          else
-           error ("%Jnon-thread-local declaration of %qD follows "
-                  "thread-local declaration", newdecl, newdecl);
+           error ("non-thread-local declaration of %q+D follows "
+                  "thread-local declaration", newdecl);
 
          locate_old_decl (olddecl, error);
          return false;
@@ -1418,7 +1400,7 @@ diagnose_mismatched_decls (tree newdecl, tree olddecl,
       /* Multiple initialized definitions are not allowed (6.9p3,5).  */
       if (DECL_INITIAL (newdecl) && DECL_INITIAL (olddecl))
        {
-         error ("%Jredefinition of %qD", newdecl, newdecl);
+         error ("redefinition of %q+D", newdecl);
          locate_old_decl (olddecl, error);
          return false;
        }
@@ -1438,26 +1420,26 @@ diagnose_mismatched_decls (tree newdecl, tree olddecl,
            {
              if (!DECL_FILE_SCOPE_P (olddecl))
                {
-                 error ("%Jextern declaration of %qD follows "
-                        "declaration with no linkage", newdecl, newdecl);
+                 error ("extern declaration of %q+D follows "
+                        "declaration with no linkage", newdecl);
                  locate_old_decl (olddecl, error);
                  return false;
                }
              else if (warn_traditional)
                {
-                 warning (0, "%Jnon-static declaration of %qD follows "
-                          "static declaration", newdecl, newdecl);
+                 warning (OPT_Wtraditional, "non-static declaration of %q+D "
+                          "follows static declaration", newdecl);
                  warned = true;
                }
            }
          else
            {
              if (TREE_PUBLIC (newdecl))
-               error ("%Jnon-static declaration of %qD follows "
-                      "static declaration", newdecl, newdecl);
+               error ("non-static declaration of %q+D follows "
+                      "static declaration", newdecl);
              else
-               error ("%Jstatic declaration of %qD follows "
-                      "non-static declaration", newdecl, newdecl);
+               error ("static declaration of %q+D follows "
+                      "non-static declaration", newdecl);
 
              locate_old_decl (olddecl, error);
              return false;
@@ -1474,14 +1456,13 @@ diagnose_mismatched_decls (tree newdecl, tree olddecl,
            }
          else if (DECL_EXTERNAL (olddecl))
            {
-             error ("%Jdeclaration of %qD with no linkage follows "
-                    "extern declaration", newdecl, newdecl);
+             error ("declaration of %q+D with no linkage follows "
+                    "extern declaration", newdecl);
              locate_old_decl (olddecl, error);
            }
          else
            {
-             error ("%Jredeclaration of %qD with no linkage",
-                    newdecl, newdecl);
+             error ("redeclaration of %q+D with no linkage", newdecl);
              locate_old_decl (olddecl, error);
            }
 
@@ -1491,11 +1472,12 @@ diagnose_mismatched_decls (tree newdecl, tree olddecl,
 
   /* warnings */
   /* All decls must agree on a visibility.  */
-  if (DECL_VISIBILITY_SPECIFIED (newdecl) && DECL_VISIBILITY_SPECIFIED (olddecl)
+  if (CODE_CONTAINS_STRUCT (TREE_CODE (newdecl), TS_DECL_WITH_VIS) 
+      && DECL_VISIBILITY_SPECIFIED (newdecl) && DECL_VISIBILITY_SPECIFIED (olddecl)
       && DECL_VISIBILITY (newdecl) != DECL_VISIBILITY (olddecl))
     {
-      warning (0, "%Jredeclaration of %qD with different visibility "
-              "(old visibility preserved)", newdecl, newdecl);
+      warning (0, "redeclaration of %q+D with different visibility "
+              "(old visibility preserved)", newdecl);
       warned = true;
     }
 
@@ -1505,15 +1487,15 @@ diagnose_mismatched_decls (tree newdecl, tree olddecl,
       if (DECL_DECLARED_INLINE_P (newdecl)
          && lookup_attribute ("noinline", DECL_ATTRIBUTES (olddecl)))
        {
-         warning (OPT_Wattributes, "%Jinline declaration of %qD follows "
-                  "declaration with attribute noinline", newdecl, newdecl);
+         warning (OPT_Wattributes, "inline declaration of %qD follows "
+                  "declaration with attribute noinline", newdecl);
          warned = true;
        }
       else if (DECL_DECLARED_INLINE_P (olddecl)
               && lookup_attribute ("noinline", DECL_ATTRIBUTES (newdecl)))
        {
-         warning (OPT_Wattributes, "%Jdeclaration of %qD with attribute "
-                  "noinline follows inline declaration ", newdecl, newdecl);
+         warning (OPT_Wattributes, "declaration of %q+D with attribute "
+                  "noinline follows inline declaration ", newdecl);
          warned = true;
        }
 
@@ -1527,14 +1509,12 @@ diagnose_mismatched_decls (tree newdecl, tree olddecl,
        {
          if (TREE_USED (olddecl))
            {
-             warning (0, "%J%qD declared inline after being called",
-                      olddecl, olddecl);
+             warning (0, "%q+D declared inline after being called", olddecl);
              warned = true;
            }
          else if (DECL_INITIAL (olddecl))
            {
-             warning (0, "%J%qD declared inline after its definition",
-                      olddecl, olddecl);
+             warning (0, "%q+D declared inline after its definition", olddecl);
              warned = true;
            }
        }
@@ -1553,7 +1533,7 @@ diagnose_mismatched_decls (tree newdecl, tree olddecl,
       if (TREE_CODE (newdecl) == PARM_DECL
          && (!TREE_ASM_WRITTEN (olddecl) || TREE_ASM_WRITTEN (newdecl)))
        {
-         error ("%Jredefinition of parameter %qD", newdecl, newdecl);
+         error ("redefinition of parameter %q+D", newdecl);
          locate_old_decl (olddecl, error);
          return false;
        }
@@ -1577,7 +1557,8 @@ diagnose_mismatched_decls (tree newdecl, tree olddecl,
       && !(TREE_CODE (newdecl) == PARM_DECL
           && TREE_ASM_WRITTEN (olddecl) && !TREE_ASM_WRITTEN (newdecl)))
     {
-      warning (0, "%Jredundant redeclaration of %qD", newdecl, newdecl);
+      warning (OPT_Wredundant_decls, "redundant redeclaration of %q+D",
+              newdecl);
       warned = true;
     }
 
@@ -1585,6 +1566,8 @@ diagnose_mismatched_decls (tree newdecl, tree olddecl,
   if (warned || pedwarned)
     locate_old_decl (olddecl, pedwarned ? pedwarn : warning0);
 
+#undef DECL_EXTERN_INLINE
+
   return retval;
 }
 
@@ -1657,8 +1640,6 @@ merge_decls (tree newdecl, tree olddecl, tree newtype, tree oldtype)
          }
     }
 
-  /* Keep the old rtl since we can safely use it.  */
-  COPY_DECL_RTL (olddecl, newdecl);
 
   /* Merge the type qualifiers.  */
   if (TREE_READONLY (newdecl))
@@ -1683,163 +1664,188 @@ merge_decls (tree newdecl, tree olddecl, tree newtype, tree oldtype)
          && !C_DECL_BUILTIN_PROTOTYPE (olddecl)))
     DECL_SOURCE_LOCATION (newdecl) = DECL_SOURCE_LOCATION (olddecl);
 
-  /* Merge the unused-warning information.  */
-  if (DECL_IN_SYSTEM_HEADER (olddecl))
-    DECL_IN_SYSTEM_HEADER (newdecl) = 1;
-  else if (DECL_IN_SYSTEM_HEADER (newdecl))
-    DECL_IN_SYSTEM_HEADER (olddecl) = 1;
-
   /* Merge the initialization information.  */
    if (DECL_INITIAL (newdecl) == 0)
     DECL_INITIAL (newdecl) = DECL_INITIAL (olddecl);
 
-  /* Merge the section attribute.
-     We want to issue an error if the sections conflict but that must be
-     done later in decl_attributes since we are called before attributes
-     are assigned.  */
-  if (DECL_SECTION_NAME (newdecl) == NULL_TREE)
-    DECL_SECTION_NAME (newdecl) = DECL_SECTION_NAME (olddecl);
-
-  /* Copy the assembler name.
-     Currently, it can only be defined in the prototype.  */
-  COPY_DECL_ASSEMBLER_NAME (olddecl, newdecl);
-
-  /* Use visibility of whichever declaration had it specified */
-  if (DECL_VISIBILITY_SPECIFIED (olddecl))
-    {
-      DECL_VISIBILITY (newdecl) = DECL_VISIBILITY (olddecl);
-      DECL_VISIBILITY_SPECIFIED (newdecl) = 1;
-    }
-
-  if (TREE_CODE (newdecl) == FUNCTION_DECL)
-    {
-      DECL_STATIC_CONSTRUCTOR(newdecl) |= DECL_STATIC_CONSTRUCTOR(olddecl);
-      DECL_STATIC_DESTRUCTOR (newdecl) |= DECL_STATIC_DESTRUCTOR (olddecl);
-      DECL_NO_LIMIT_STACK (newdecl) |= DECL_NO_LIMIT_STACK (olddecl);
-      DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (newdecl)
-       |= DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (olddecl);
-      TREE_THIS_VOLATILE (newdecl) |= TREE_THIS_VOLATILE (olddecl);
-      TREE_READONLY (newdecl) |= TREE_READONLY (olddecl);
-      DECL_IS_MALLOC (newdecl) |= DECL_IS_MALLOC (olddecl);
-      DECL_IS_PURE (newdecl) |= DECL_IS_PURE (olddecl);
-      DECL_IS_NOVOPS (newdecl) |= DECL_IS_NOVOPS (olddecl);
-    }
-
-  /* Merge the storage class information.  */
-  merge_weak (newdecl, olddecl);
-
-  /* For functions, static overrides non-static.  */
-  if (TREE_CODE (newdecl) == FUNCTION_DECL)
-    {
-      TREE_PUBLIC (newdecl) &= TREE_PUBLIC (olddecl);
-      /* This is since we don't automatically
-        copy the attributes of NEWDECL into OLDDECL.  */
-      TREE_PUBLIC (olddecl) = TREE_PUBLIC (newdecl);
-      /* If this clears `static', clear it in the identifier too.  */
-      if (!TREE_PUBLIC (olddecl))
-       TREE_PUBLIC (DECL_NAME (olddecl)) = 0;
-    }
-  if (DECL_EXTERNAL (newdecl))
-    {
-      TREE_STATIC (newdecl) = TREE_STATIC (olddecl);
-      DECL_EXTERNAL (newdecl) = DECL_EXTERNAL (olddecl);
-
-      /* An extern decl does not override previous storage class.  */
-      TREE_PUBLIC (newdecl) = TREE_PUBLIC (olddecl);
-      if (!DECL_EXTERNAL (newdecl))
-       {
-         DECL_CONTEXT (newdecl) = DECL_CONTEXT (olddecl);
-         DECL_COMMON (newdecl) = DECL_COMMON (olddecl);
-       }
-    }
-  else
-    {
-      TREE_STATIC (olddecl) = TREE_STATIC (newdecl);
-      TREE_PUBLIC (olddecl) = TREE_PUBLIC (newdecl);
-    }
-
-  if (TREE_CODE (newdecl) == FUNCTION_DECL)
-    {
-      /* 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))
-       {
-         if (TREE_USED (olddecl)
-             /* In unit-at-a-time mode we never inline re-defined extern
-                inline functions.  */
-             && !flag_unit_at_a_time
-             && cgraph_function_possibly_inlined_p (olddecl))
-           (*debug_hooks->outlining_inline_function) (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_DECLARED_INLINE_P (newdecl)
-             || DECL_DECLARED_INLINE_P (olddecl))
-           DECL_DECLARED_INLINE_P (newdecl) = 1;
-
-         DECL_UNINLINABLE (newdecl) = DECL_UNINLINABLE (olddecl)
-           = (DECL_UNINLINABLE (newdecl) || DECL_UNINLINABLE (olddecl));
-       }
+   if (CODE_CONTAINS_STRUCT (TREE_CODE (olddecl), TS_DECL_WITH_VIS))
+     {
+       /* Merge the unused-warning information.  */
+       if (DECL_IN_SYSTEM_HEADER (olddecl))
+        DECL_IN_SYSTEM_HEADER (newdecl) = 1;
+       else if (DECL_IN_SYSTEM_HEADER (newdecl))
+        DECL_IN_SYSTEM_HEADER (olddecl) = 1;
+
+       /* Merge the section attribute.
+         We want to issue an error if the sections conflict but that must be
+         done later in decl_attributes since we are called before attributes
+         are assigned.  */
+       if (DECL_SECTION_NAME (newdecl) == NULL_TREE)
+        DECL_SECTION_NAME (newdecl) = DECL_SECTION_NAME (olddecl);
+       
+       /* Copy the assembler name.
+         Currently, it can only be defined in the prototype.  */
+       COPY_DECL_ASSEMBLER_NAME (olddecl, newdecl);
+
+       /* Use visibility of whichever declaration had it specified */
+       if (DECL_VISIBILITY_SPECIFIED (olddecl))
+        {
+          DECL_VISIBILITY (newdecl) = DECL_VISIBILITY (olddecl);
+          DECL_VISIBILITY_SPECIFIED (newdecl) = 1;
+        }
+       
+       if (TREE_CODE (newdecl) == FUNCTION_DECL)
+        {
+          DECL_STATIC_CONSTRUCTOR(newdecl) |= DECL_STATIC_CONSTRUCTOR(olddecl);
+          DECL_STATIC_DESTRUCTOR (newdecl) |= DECL_STATIC_DESTRUCTOR (olddecl);
+          DECL_NO_LIMIT_STACK (newdecl) |= DECL_NO_LIMIT_STACK (olddecl);
+          DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (newdecl)
+            |= DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (olddecl);
+          TREE_THIS_VOLATILE (newdecl) |= TREE_THIS_VOLATILE (olddecl);
+          TREE_READONLY (newdecl) |= TREE_READONLY (olddecl);
+          DECL_IS_MALLOC (newdecl) |= DECL_IS_MALLOC (olddecl);
+          DECL_IS_PURE (newdecl) |= DECL_IS_PURE (olddecl);
+          DECL_IS_NOVOPS (newdecl) |= DECL_IS_NOVOPS (olddecl);
+        }
+       
+       /* Merge the storage class information.  */
+       merge_weak (newdecl, olddecl);
 
-      if (DECL_BUILT_IN (olddecl))
-       {
-         /* If redeclaring a builtin function, it stays built in.
-            But it gets tagged as having been declared.  */
-         DECL_BUILT_IN_CLASS (newdecl) = DECL_BUILT_IN_CLASS (olddecl);
-         DECL_FUNCTION_CODE (newdecl) = DECL_FUNCTION_CODE (olddecl);
-         C_DECL_DECLARED_BUILTIN (newdecl) = 1;
-         if (new_is_prototype)
-           C_DECL_BUILTIN_PROTOTYPE (newdecl) = 0;
-         else
-           C_DECL_BUILTIN_PROTOTYPE (newdecl)
-             = C_DECL_BUILTIN_PROTOTYPE (olddecl);
-       }
+       /* For functions, static overrides non-static.  */
+       if (TREE_CODE (newdecl) == FUNCTION_DECL)
+        {
+          TREE_PUBLIC (newdecl) &= TREE_PUBLIC (olddecl);
+          /* This is since we don't automatically
+             copy the attributes of NEWDECL into OLDDECL.  */
+          TREE_PUBLIC (olddecl) = TREE_PUBLIC (newdecl);
+          /* If this clears `static', clear it in the identifier too.  */
+          if (!TREE_PUBLIC (olddecl))
+            TREE_PUBLIC (DECL_NAME (olddecl)) = 0;
+        }
+     }
+   
+   if (DECL_EXTERNAL (newdecl))
+     {
+       TREE_STATIC (newdecl) = TREE_STATIC (olddecl);
+       DECL_EXTERNAL (newdecl) = DECL_EXTERNAL (olddecl);
+
+       /* An extern decl does not override previous storage class.  */
+       TREE_PUBLIC (newdecl) = TREE_PUBLIC (olddecl);
+       if (!DECL_EXTERNAL (newdecl))
+        {
+          DECL_CONTEXT (newdecl) = DECL_CONTEXT (olddecl);
+          DECL_COMMON (newdecl) = DECL_COMMON (olddecl);
+        }
+     }
+   else
+     {
+       TREE_STATIC (olddecl) = TREE_STATIC (newdecl);
+       TREE_PUBLIC (olddecl) = TREE_PUBLIC (newdecl);
+     }
+   
+   if (TREE_CODE (newdecl) == FUNCTION_DECL) 
+     {
+       /* 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))
+        {
+          if (TREE_USED (olddecl)
+              /* In unit-at-a-time mode we never inline re-defined extern
+                 inline functions.  */
+              && !flag_unit_at_a_time
+              && cgraph_function_possibly_inlined_p (olddecl))
+            (*debug_hooks->outlining_inline_function) (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_DECLARED_INLINE_P (newdecl)
+              || DECL_DECLARED_INLINE_P (olddecl))
+            DECL_DECLARED_INLINE_P (newdecl) = 1;
+
+          DECL_UNINLINABLE (newdecl) = DECL_UNINLINABLE (olddecl)
+            = (DECL_UNINLINABLE (newdecl) || DECL_UNINLINABLE (olddecl));
+        }
 
-      /* Also preserve various other info from the definition.  */
-      if (!new_is_definition)
-       {
-         DECL_RESULT (newdecl) = DECL_RESULT (olddecl);
-         DECL_INITIAL (newdecl) = DECL_INITIAL (olddecl);
-         DECL_STRUCT_FUNCTION (newdecl) = DECL_STRUCT_FUNCTION (olddecl);
-         DECL_SAVED_TREE (newdecl) = DECL_SAVED_TREE (olddecl);
-         DECL_ARGUMENTS (newdecl) = DECL_ARGUMENTS (olddecl);
-
-         /* Set DECL_INLINE on the declaration if we've got a body
-            from which to instantiate.  */
-         if (DECL_INLINE (olddecl) && !DECL_UNINLINABLE (newdecl))
-           {
-             DECL_INLINE (newdecl) = 1;
-             DECL_ABSTRACT_ORIGIN (newdecl)
-               = DECL_ABSTRACT_ORIGIN (olddecl);
-           }
-       }
-      else
-       {
-         /* If a previous declaration said inline, mark the
-            definition as inlinable.  */
-         if (DECL_DECLARED_INLINE_P (newdecl)
-             && !DECL_UNINLINABLE (newdecl))
-           DECL_INLINE (newdecl) = 1;
-       }
-    }
+       if (DECL_BUILT_IN (olddecl))
+        {
+          /* If redeclaring a builtin function, it stays built in.
+             But it gets tagged as having been declared.  */
+          DECL_BUILT_IN_CLASS (newdecl) = DECL_BUILT_IN_CLASS (olddecl);
+          DECL_FUNCTION_CODE (newdecl) = DECL_FUNCTION_CODE (olddecl);
+          C_DECL_DECLARED_BUILTIN (newdecl) = 1;
+          if (new_is_prototype)
+            C_DECL_BUILTIN_PROTOTYPE (newdecl) = 0;
+          else
+            C_DECL_BUILTIN_PROTOTYPE (newdecl)
+              = C_DECL_BUILTIN_PROTOTYPE (olddecl);
+        }
 
-  /* Copy most of the decl-specific fields of NEWDECL into OLDDECL.
+       /* Also preserve various other info from the definition.  */
+       if (!new_is_definition)
+        {
+          DECL_RESULT (newdecl) = DECL_RESULT (olddecl);
+          DECL_INITIAL (newdecl) = DECL_INITIAL (olddecl);
+          DECL_STRUCT_FUNCTION (newdecl) = DECL_STRUCT_FUNCTION (olddecl);
+          DECL_SAVED_TREE (newdecl) = DECL_SAVED_TREE (olddecl);
+          DECL_ARGUMENTS (newdecl) = DECL_ARGUMENTS (olddecl);
+
+          /* Set DECL_INLINE on the declaration if we've got a body
+             from which to instantiate.  */
+          if (DECL_INLINE (olddecl) && !DECL_UNINLINABLE (newdecl))
+            {
+              DECL_INLINE (newdecl) = 1;
+              DECL_ABSTRACT_ORIGIN (newdecl)
+                = DECL_ABSTRACT_ORIGIN (olddecl);
+            }
+        }
+       else
+        {
+          /* If a previous declaration said inline, mark the
+             definition as inlinable.  */
+          if (DECL_DECLARED_INLINE_P (newdecl)
+              && !DECL_UNINLINABLE (newdecl))
+            DECL_INLINE (newdecl) = 1;
+        }
+     }
+   
+   /* Copy most of the decl-specific fields of NEWDECL into OLDDECL.
      But preserve OLDDECL's DECL_UID and DECL_CONTEXT.  */
   {
     unsigned olddecl_uid = DECL_UID (olddecl);
     tree olddecl_context = DECL_CONTEXT (olddecl);
-
+    
     memcpy ((char *) olddecl + sizeof (struct tree_common),
            (char *) newdecl + sizeof (struct tree_common),
-           sizeof (struct tree_decl) - sizeof (struct tree_common));
+           sizeof (struct tree_decl_common) - sizeof (struct tree_common));
+    switch (TREE_CODE (olddecl))
+      {
+      case FIELD_DECL:
+      case VAR_DECL:
+      case PARM_DECL:
+      case LABEL_DECL:
+      case RESULT_DECL:
+      case CONST_DECL:
+      case TYPE_DECL:
+      case FUNCTION_DECL:
+       memcpy ((char *) olddecl + sizeof (struct tree_decl_common),
+               (char *) newdecl + sizeof (struct tree_decl_common),
+               tree_code_size (TREE_CODE (olddecl)) - sizeof (struct tree_decl_common));
+       break;
+
+      default:
+       
+       memcpy ((char *) olddecl + sizeof (struct tree_decl_common),
+               (char *) newdecl + sizeof (struct tree_decl_common),
+               sizeof (struct tree_decl_non_common) - sizeof (struct tree_decl_common));
+      }
     DECL_UID (olddecl) = olddecl_uid;
     DECL_CONTEXT (olddecl) = olddecl_context;
   }
@@ -1885,13 +1891,7 @@ warn_if_shadowing (tree new_decl)
       /* No shadow warnings for internally generated vars.  */
       || DECL_IS_BUILTIN (new_decl)
       /* No shadow warnings for vars made for inlining.  */
-      || DECL_FROM_INLINE (new_decl)
-      /* Don't warn about the parm names in function declarator
-        within a function declarator.  It would be nice to avoid
-        warning in any function declarator in a declaration, as
-        opposed to a definition, but there is no way to tell
-        it's not a definition at this point.  */
-      || (TREE_CODE (new_decl) == PARM_DECL && current_scope->outer->parm_flag))
+      || DECL_FROM_INLINE (new_decl))
     return;
 
   /* Is anything being shadowed?  Invisible decls do not count.  */
@@ -1902,28 +1902,28 @@ warn_if_shadowing (tree new_decl)
 
        if (old_decl == error_mark_node)
          {
-           warning (0, "%Jdeclaration of %qD shadows previous non-variable",
-                    new_decl, new_decl);
+           warning (OPT_Wshadow, "declaration of %q+D shadows previous "
+                    "non-variable", new_decl);
            break;
          }
        else if (TREE_CODE (old_decl) == PARM_DECL)
-         warning (0, "%Jdeclaration of %qD shadows a parameter",
-                  new_decl, new_decl);
+         warning (OPT_Wshadow, "declaration of %q+D shadows a parameter",
+                  new_decl);
        else if (DECL_FILE_SCOPE_P (old_decl))
-         warning (0, "%Jdeclaration of %qD shadows a global declaration",
-                  new_decl, new_decl);
+         warning (OPT_Wshadow, "declaration of %q+D shadows a global "
+                  "declaration", new_decl);
        else if (TREE_CODE (old_decl) == FUNCTION_DECL
                 && DECL_BUILT_IN (old_decl))
          {
-           warning (0, "%Jdeclaration of %qD shadows a built-in function",
-                    new_decl, new_decl);
+           warning (OPT_Wshadow, "declaration of %q+D shadows "
+                    "a built-in function", new_decl);
            break;
          }
        else
-         warning (0, "%Jdeclaration of %qD shadows a previous local",
-                  new_decl, new_decl);
+         warning (OPT_Wshadow, "declaration of %q+D shadows a previous local",
+                  new_decl);
 
-       warning (0, "%Jshadowed declaration is here", old_decl);
+       warning (OPT_Wshadow, "%Jshadowed declaration is here", old_decl);
 
        break;
       }
@@ -2121,10 +2121,9 @@ pushdecl (tree x)
          visdecl = b->decl;
          vistype = TREE_TYPE (visdecl);
        }
-      if (warn_nested_externs
-         && scope != file_scope
+      if (scope != file_scope
          && !DECL_IN_SYSTEM_HEADER (x))
-       warning (0, "nested extern declaration of %qD", x);
+       warning (OPT_Wnested_externs, "nested extern declaration of %qD", x);
 
       while (b && !B_IN_EXTERNAL_SCOPE (b))
        {
@@ -2216,7 +2215,8 @@ pushdecl (tree x)
        }
     }
 
-  warn_if_shadowing (x);
+  if (TREE_CODE (x) != PARM_DECL)
+    warn_if_shadowing (x);
 
  skip_external_and_shadow_checks:
   if (TREE_CODE (x) == TYPE_DECL)
@@ -2283,7 +2283,7 @@ pushdecl_top_level (tree x)
 static void
 implicit_decl_warning (tree id, tree olddecl)
 {
-  void (*diag) (const char *, ...);
+  void (*diag) (const char *, ...) ATTRIBUTE_GCC_CDIAG(1,2);
   switch (mesg_implicit_function_declaration)
     {
     case 0: return;
@@ -2292,7 +2292,7 @@ implicit_decl_warning (tree id, tree olddecl)
     default: gcc_unreachable ();
     }
 
-  diag (N_("implicit declaration of function %qE"), id);
+  diag (G_("implicit declaration of function %qE"), id);
   if (olddecl)
     locate_old_decl (olddecl, diag);
 }
@@ -3102,7 +3102,7 @@ start_decl (struct c_declarator *declarator, struct c_declspecs *declspecs,
 
   if (warn_main > 0 && TREE_CODE (decl) != FUNCTION_DECL
       && MAIN_NAME_P (DECL_NAME (decl)))
-    warning (0, "%J%qD is usually a function", decl, decl);
+    warning (OPT_Wmain, "%q+D is usually a function", decl);
 
   if (initialized)
     /* Is it valid for this decl to have an initializer at all?
@@ -3192,7 +3192,7 @@ start_decl (struct c_declarator *declarator, struct c_declspecs *declspecs,
   if (TREE_CODE (decl) == VAR_DECL
       && !initialized
       && TREE_PUBLIC (decl)
-      && !DECL_THREAD_LOCAL (decl)
+      && !DECL_THREAD_LOCAL_P (decl)
       && !flag_no_common)
     DECL_COMMON (decl) = 1;
 
@@ -3223,8 +3223,8 @@ start_decl (struct c_declarator *declarator, struct c_declspecs *declspecs,
       && DECL_DECLARED_INLINE_P (decl)
       && DECL_UNINLINABLE (decl)
       && lookup_attribute ("noinline", DECL_ATTRIBUTES (decl)))
-    warning (OPT_Wattributes, "%Jinline function %qD given attribute noinline",
-            decl, decl);
+    warning (OPT_Wattributes, "inline function %q+D given attribute noinline",
+            decl);
 
   /* Add this decl to the current scope.
      TEM may equal DECL or it may be a previous decl of the same name.  */
@@ -3295,12 +3295,12 @@ finish_decl (tree decl, tree init, tree asmspec_tree)
       switch (failure)
        {
        case 1:
-         error ("%Jinitializer fails to determine size of %qD", decl, decl);
+         error ("initializer fails to determine size of %q+D", decl);
          break;
 
        case 2:
          if (do_default)
-           error ("%Jarray size missing in %qD", decl, decl);
+           error ("array size missing in %q+D", decl);
          /* If a `static' var's size isn't known,
             make it extern as well as static, so it does not get
             allocated.
@@ -3312,7 +3312,7 @@ finish_decl (tree decl, tree init, tree asmspec_tree)
          break;
 
        case 3:
-         error ("%Jzero or negative size array %qD", decl, decl);
+         error ("zero or negative size array %q+D", decl);
          break;
 
        case 0:
@@ -3364,7 +3364,7 @@ finish_decl (tree decl, tree init, tree asmspec_tree)
                 is an error.  */
              : !DECL_EXTERNAL (decl)))
         {
-          error ("%Jstorage size of %qD isn%'t known", decl, decl);
+          error ("storage size of %q+D isn%'t known", decl);
           TREE_TYPE (decl) = error_mark_node;
         }
 
@@ -3374,7 +3374,7 @@ finish_decl (tree decl, tree init, tree asmspec_tree)
          if (TREE_CODE (DECL_SIZE (decl)) == INTEGER_CST)
            constant_expression_warning (DECL_SIZE (decl));
          else
-           error ("%Jstorage size of %qD isn%'t constant", decl, decl);
+           error ("storage size of %q+D isn%'t constant", decl);
        }
 
       if (TREE_USED (type))
@@ -3421,8 +3421,8 @@ finish_decl (tree decl, tree init, tree asmspec_tree)
              && TREE_CODE (decl) == VAR_DECL
              && !C_DECL_REGISTER (decl)
              && !TREE_STATIC (decl))
-           warning (0, "%Jignoring asm-specifier for non-static local "
-                    "variable %qD", decl, decl);
+           warning (0, "ignoring asm-specifier for non-static local "
+                    "variable %q+D", decl);
          else if (C_DECL_REGISTER (decl))
            change_decl_assembler_name (decl, get_identifier (asmspec));
          else
@@ -3538,6 +3538,7 @@ finish_decl (tree decl, tree init, tree asmspec_tree)
                = init_one_libfunc (USING_SJLJ_EXCEPTIONS
                                    ? "__gcc_personality_sj0"
                                    : "__gcc_personality_v0");
+             default_init_unwind_resume_libfunc ();
              using_eh_for_cleanups ();
            }
 
@@ -3769,6 +3770,30 @@ check_bitfield_type_and_width (tree *type, tree *width, const char *orig_name)
        warning (0, "%qs is narrower than values of its type", name);
     }
 }
+
+/* Build a bit-field integer type for the given WIDTH and UNSIGNEDP.  */
+static tree
+c_build_bitfield_integer_type (unsigned HOST_WIDE_INT width, int unsignedp)
+{
+  /* Extended integer types of the same width as a standard type have
+     lesser rank, so those of the same width as int promote to int or
+     unsigned int and are valid for printf formats expecting int or
+     unsigned int.  To avoid such special cases, avoid creating
+     extended integer types for bit-fields if a standard integer type
+     is available.  */
+  if (width == TYPE_PRECISION (integer_type_node))
+    return unsignedp ? unsigned_type_node : integer_type_node;
+  if (width == TYPE_PRECISION (signed_char_type_node))
+    return unsignedp ? unsigned_char_type_node : signed_char_type_node;
+  if (width == TYPE_PRECISION (short_integer_type_node))
+    return unsignedp ? short_unsigned_type_node : short_integer_type_node;
+  if (width == TYPE_PRECISION (long_integer_type_node))
+    return unsignedp ? long_unsigned_type_node : long_integer_type_node;
+  if (width == TYPE_PRECISION (long_long_integer_type_node))
+    return (unsignedp ? long_long_unsigned_type_node
+           : long_long_integer_type_node);
+  return build_nonstandard_integer_type (width, unsignedp);
+}
 \f
 /* Given declspecs and a declarator,
    determine the name and type of the object declared
@@ -4180,10 +4205,10 @@ grokdeclarator (const struct c_declarator *declarator,
                       - 1.  Do the calculation in index_type, so that
                       if it is a variable the computations will be
                       done in the proper mode.  */
-                   itype = fold (build2 (MINUS_EXPR, index_type,
-                                         convert (index_type, size),
-                                         convert (index_type,
-                                                  size_one_node)));
+                   itype = fold_build2 (MINUS_EXPR, index_type,
+                                        convert (index_type, size),
+                                        convert (index_type,
+                                                 size_one_node));
 
                    /* If that overflowed, the array is too big.  ??? 
                       While a size of INT_MAX+1 technically shouldn't
@@ -4192,7 +4217,8 @@ grokdeclarator (const struct c_declarator *declarator,
                       index_type, before the subtraction.  Handling
                       this case seems like an unnecessary
                       complication.  */
-                   if (TREE_OVERFLOW (itype))
+                   if (TREE_CODE (itype) == INTEGER_CST
+                       && TREE_OVERFLOW (itype))
                      {
                        error ("size of array %qs is too large", name);
                        type = error_mark_node;
@@ -4357,7 +4383,8 @@ grokdeclarator (const struct c_declarator *declarator,
 
   if (TREE_CODE (type) == ARRAY_TYPE
       && COMPLETE_TYPE_P (type)
-      && TREE_OVERFLOW (TYPE_SIZE (type)))
+      && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST
+      && TREE_OVERFLOW (TYPE_SIZE_UNIT (type)))
     {
       error ("size of array %qs is too large", name);
       /* If we proceed with the array type as it is, we'll eventually
@@ -4380,7 +4407,7 @@ grokdeclarator (const struct c_declarator *declarator,
        C_TYPEDEF_EXPLICITLY_SIGNED (decl) = 1;
       decl_attributes (&decl, returned_attrs, 0);
       if (declspecs->inline_p)
-       pedwarn ("%Jtypedef %qD declared %<inline%>", decl, decl);
+       pedwarn ("typedef %q+D declared %<inline%>", decl);
       return decl;
     }
 
@@ -4493,9 +4520,8 @@ grokdeclarator (const struct c_declarator *declarator,
          promoted_type = c_type_promotes_to (type);
 
        DECL_ARG_TYPE (decl) = promoted_type;
-       DECL_ARG_TYPE_AS_WRITTEN (decl) = type_as_written;
        if (declspecs->inline_p)
-         pedwarn ("%Jparameter %qD declared %<inline%>", decl, decl);
+         pedwarn ("parameter %q+D declared %<inline%>", decl);
       }
     else if (decl_context == FIELD)
       {
@@ -4649,7 +4675,7 @@ grokdeclarator (const struct c_declarator *declarator,
          C_DECL_VARIABLE_SIZE (decl) = 1;
 
        if (declspecs->inline_p)
-         pedwarn ("%Jvariable %qD declared %<inline%>", decl, decl);
+         pedwarn ("variable %q+D declared %<inline%>", decl);
 
        /* At file scope, an initialized extern declaration may follow
           a static declaration.  In that case, DECL_EXTERNAL will be
@@ -4676,7 +4702,7 @@ grokdeclarator (const struct c_declarator *declarator,
        if (threadp)
          {
            if (targetm.have_tls)
-             DECL_THREAD_LOCAL (decl) = 1;
+             DECL_TLS_MODEL (decl) = decl_default_tls_model (decl);
            else
              /* A mere warning is sure to result in improper semantics
                 at runtime.  Don't bother to allow this to compile.  */
@@ -4698,8 +4724,11 @@ grokdeclarator (const struct c_declarator *declarator,
 
     /* If a type has volatile components, it should be stored in memory.
        Otherwise, the fact that those components are volatile
-       will be ignored, and would even crash the compiler.  */
-    if (C_TYPE_FIELDS_VOLATILE (TREE_TYPE (decl)))
+       will be ignored, and would even crash the compiler.
+       Of course, this only makes sense on  VAR,PARM, and RESULT decl's.   */
+    if (C_TYPE_FIELDS_VOLATILE (TREE_TYPE (decl))
+       && (TREE_CODE (decl) == VAR_DECL ||  TREE_CODE (decl) == PARM_DECL
+         || TREE_CODE (decl) == RESULT_DECL))
       {
        /* It is not an error for a structure with volatile fields to
           be declared register, but reset DECL_REGISTER since it
@@ -4740,9 +4769,9 @@ grokparms (struct c_arg_info *arg_info, bool funcdef_flag)
 {
   tree arg_types = arg_info->types;
 
-  if (warn_strict_prototypes && arg_types == 0 && !funcdef_flag
-      && !in_system_header)
-    warning (0, "function declaration isn%'t a prototype");
+  if (arg_types == 0 && !funcdef_flag && !in_system_header)
+    warning (OPT_Wstrict_prototypes,
+            "function declaration isn%'t a prototype");
 
   if (arg_types == error_mark_node)
     return 0;  /* don't set TYPE_ARG_TYPES in this case */
@@ -4783,8 +4812,8 @@ grokparms (struct c_arg_info *arg_info, bool funcdef_flag)
              if (funcdef_flag)
                {
                  if (DECL_NAME (parm))
-                   error ("%Jparameter %u (%qD) has incomplete type",
-                          parm, parmno, parm);
+                   error ("parameter %u (%q+D) has incomplete type",
+                          parmno, parm);
                  else
                    error ("%Jparameter %u has incomplete type",
                           parm, parmno);
@@ -4795,13 +4824,16 @@ grokparms (struct c_arg_info *arg_info, bool funcdef_flag)
              else if (VOID_TYPE_P (type))
                {
                  if (DECL_NAME (parm))
-                   warning (0, "%Jparameter %u (%qD) has void type",
-                            parm, parmno, parm);
+                   warning (0, "parameter %u (%q+D) has void type",
+                            parmno, parm);
                  else
                    warning (0, "%Jparameter %u has void type",
                             parm, parmno);
                }
            }
+
+         if (DECL_NAME (parm) && TREE_USED (parm))
+           warn_if_shadowing (parm);
        }
       return arg_types;
     }
@@ -4887,8 +4919,7 @@ get_parm_info (bool ellipsis)
 
          /* Check for forward decls that never got their actual decl.  */
          if (TREE_ASM_WRITTEN (decl))
-           error ("%Jparameter %qD has just a forward declaration",
-                  decl, decl);
+           error ("parameter %q+D has just a forward declaration", decl);
          /* Check for (..., void, ...) and issue an error.  */
          else if (VOID_TYPE_P (type) && !DECL_NAME (decl))
            {
@@ -5202,7 +5233,7 @@ detect_field_duplicates (tree fieldlist)
            for (y = fieldlist; y != x; y = TREE_CHAIN (y))
              if (DECL_NAME (y) == DECL_NAME (x))
                {
-                 error ("%Jduplicate member %qD", x, x);
+                 error ("duplicate member %q+D", x);
                  DECL_NAME (x) = NULL_TREE;
                }
          }
@@ -5218,7 +5249,7 @@ detect_field_duplicates (tree fieldlist)
            slot = htab_find_slot (htab, y, INSERT);
            if (*slot)
              {
-               error ("%Jduplicate member %qD", x, x);
+               error ("duplicate member %q+D", x);
                DECL_NAME (x) = NULL_TREE;
              }
            *slot = y;
@@ -5368,7 +5399,7 @@ finish_struct (tree t, tree fieldlist, tree attributes)
          if (width != TYPE_PRECISION (type))
            {
              TREE_TYPE (*fieldlistp)
-               = build_nonstandard_integer_type (width, TYPE_UNSIGNED (type));
+               = c_build_bitfield_integer_type (width, TYPE_UNSIGNED (type));
              DECL_MODE (*fieldlistp) = TYPE_MODE (TREE_TYPE (*fieldlistp));
            }
          DECL_INITIAL (*fieldlistp) = 0;
@@ -5439,6 +5470,9 @@ finish_struct (tree t, tree fieldlist, tree attributes)
       TYPE_LANG_SPECIFIC (x) = TYPE_LANG_SPECIFIC (t);
       TYPE_ALIGN (x) = TYPE_ALIGN (t);
       TYPE_USER_ALIGN (x) = TYPE_USER_ALIGN (t);
+      C_TYPE_FIELDS_READONLY (x) = C_TYPE_FIELDS_READONLY (t);
+      C_TYPE_FIELDS_VOLATILE (x) = C_TYPE_FIELDS_VOLATILE (t);
+      C_TYPE_VARIABLE_SIZE (x) = C_TYPE_VARIABLE_SIZE (t);
     }
 
   /* If this was supposed to be a transparent union, but we can't
@@ -5813,8 +5847,8 @@ start_function (struct c_declspecs *declspecs, struct c_declarator *declarator,
   if (DECL_DECLARED_INLINE_P (decl1)
       && DECL_UNINLINABLE (decl1)
       && lookup_attribute ("noinline", DECL_ATTRIBUTES (decl1)))
-    warning (OPT_Wattributes, "%Jinline function %qD given attribute noinline",
-            decl1, decl1);
+    warning (OPT_Wattributes, "inline function %q+D given attribute noinline",
+            decl1);
 
   announce_function (decl1);
 
@@ -5891,14 +5925,15 @@ start_function (struct c_declspecs *declspecs, struct c_declarator *declarator,
       && old_decl != error_mark_node
       && TYPE_ARG_TYPES (TREE_TYPE (decl1)) == 0
       && C_DECL_ISNT_PROTOTYPE (old_decl))
-    warning (0, "function declaration isn%'t a prototype");
+    warning (OPT_Wstrict_prototypes,
+            "function declaration isn%'t a prototype");
   /* Optionally warn of any global def with no previous prototype.  */
   else if (warn_missing_prototypes
           && old_decl != error_mark_node
           && TREE_PUBLIC (decl1)
           && !MAIN_NAME_P (DECL_NAME (decl1))
           && C_DECL_ISNT_PROTOTYPE (old_decl))
-    warning (0, "%Jno previous prototype for %qD", decl1, decl1);
+    warning (OPT_Wmissing_prototypes, "no previous prototype for %q+D", decl1);
   /* Optionally warn of any def with no previous prototype
      if the function has already been used.  */
   else if (warn_missing_prototypes
@@ -5906,14 +5941,15 @@ start_function (struct c_declspecs *declspecs, struct c_declarator *declarator,
           && old_decl != error_mark_node
           && TREE_USED (old_decl)
           && TYPE_ARG_TYPES (TREE_TYPE (old_decl)) == 0)
-    warning (0, "%J%qD was used with no prototype before its definition",
-            decl1, decl1);
+    warning (OPT_Wmissing_prototypes,
+            "%q+D was used with no prototype before its definition", decl1);
   /* Optionally warn of any global def with no previous declaration.  */
   else if (warn_missing_declarations
           && TREE_PUBLIC (decl1)
           && old_decl == 0
           && !MAIN_NAME_P (DECL_NAME (decl1)))
-    warning (0, "%Jno previous declaration for %qD", decl1, decl1);
+    warning (OPT_Wmissing_declarations, "no previous declaration for %q+D",
+            decl1);
   /* Optionally warn of any def with no previous declaration
      if the function has already been used.  */
   else if (warn_missing_declarations
@@ -5921,8 +5957,8 @@ start_function (struct c_declspecs *declspecs, struct c_declarator *declarator,
           && old_decl != error_mark_node
           && TREE_USED (old_decl)
           && C_DECL_IMPLICIT (old_decl))
-    warning (0, "%J%qD was used with no declaration before its definition",
-            decl1, decl1);
+    warning (OPT_Wmissing_declarations,
+            "%q+D was used with no declaration before its definition", decl1);
 
   /* This is a definition, not a reference.
      So normally clear DECL_EXTERNAL.
@@ -5954,7 +5990,7 @@ start_function (struct c_declspecs *declspecs, struct c_declarator *declarator,
 
       if (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (decl1)))
          != integer_type_node)
-       pedwarn ("%Jreturn type of %qD is not %<int%>", decl1, decl1);
+       pedwarn ("return type of %q+D is not %<int%>", decl1);
 
       for (args = TYPE_ARG_TYPES (TREE_TYPE (decl1)); args;
           args = TREE_CHAIN (args))
@@ -5969,8 +6005,7 @@ start_function (struct c_declspecs *declspecs, struct c_declarator *declarator,
            {
            case 1:
              if (TYPE_MAIN_VARIANT (type) != integer_type_node)
-               pedwarn ("%Jfirst argument of %qD should be %<int%>",
-                        decl1, decl1);
+               pedwarn ("first argument of %q+D should be %<int%>", decl1);
              break;
 
            case 2:
@@ -5978,8 +6013,8 @@ start_function (struct c_declspecs *declspecs, struct c_declarator *declarator,
                  || TREE_CODE (TREE_TYPE (type)) != POINTER_TYPE
                  || (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (type)))
                      != char_type_node))
-               pedwarn ("%Jsecond argument of %qD should be %<char **%>",
-                         decl1, decl1);
+               pedwarn ("second argument of %q+D should be %<char **%>",
+                         decl1);
              break;
 
            case 3:
@@ -5987,8 +6022,8 @@ start_function (struct c_declspecs *declspecs, struct c_declarator *declarator,
                  || TREE_CODE (TREE_TYPE (type)) != POINTER_TYPE
                  || (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (type)))
                      != char_type_node))
-               pedwarn ("%Jthird argument of %qD should probably be "
-                         "%<char **%>", decl1, decl1);
+               pedwarn ("third argument of %q+D should probably be "
+                         "%<char **%>", decl1);
              break;
            }
        }
@@ -5997,10 +6032,10 @@ start_function (struct c_declspecs *declspecs, struct c_declarator *declarator,
         argument because it's only mentioned in an appendix of the
         standard.  */
       if (argct > 0 && (argct < 2 || argct > 3))
-       pedwarn ("%J%qD takes only zero or two arguments", decl1, decl1);
+       pedwarn ("%q+D takes only zero or two arguments", decl1);
 
       if (!TREE_PUBLIC (decl1))
-       pedwarn ("%J%qD is normally a non-static function", decl1, decl1);
+       pedwarn ("%q+D is normally a non-static function", decl1);
     }
 
   /* Record the decl so that the function name is defined.
@@ -6057,9 +6092,10 @@ store_parm_decls_newstyle (tree fndecl, const struct c_arg_info *arg_info)
      warning if we got here because ARG_INFO_TYPES was error_mark_node
      (this happens when a function definition has just an ellipsis in
      its parameter list).  */
-  else if (warn_traditional && !in_system_header && !current_function_scope
+  else if (!in_system_header && !current_function_scope
           && arg_info->types != error_mark_node)
-    warning (0, "%Jtraditional C rejects ISO C style function definitions",
+    warning (OPT_Wtraditional,
+            "%Jtraditional C rejects ISO C style function definitions",
             fndecl);
 
   /* Now make all the parameter declarations visible in the function body.
@@ -6068,8 +6104,12 @@ store_parm_decls_newstyle (tree fndecl, const struct c_arg_info *arg_info)
     {
       DECL_CONTEXT (decl) = current_function_decl;
       if (DECL_NAME (decl))
-       bind (DECL_NAME (decl), decl, current_scope,
-             /*invisible=*/false, /*nested=*/false);
+       {
+         bind (DECL_NAME (decl), decl, current_scope,
+               /*invisible=*/false, /*nested=*/false);
+         if (!TREE_USED (decl))
+           warn_if_shadowing (decl);
+       }
       else
        error ("%Jparameter name omitted", decl);
     }
@@ -6102,13 +6142,7 @@ store_parm_decls_oldstyle (tree fndecl, const struct c_arg_info *arg_info)
   struct c_binding *b;
   tree parm, decl, last;
   tree parmids = arg_info->parms;
-
-  /* We use DECL_WEAK as a flag to show which parameters have been
-     seen already, since it is not used on PARM_DECL.  */
-#ifdef ENABLE_CHECKING
-  for (b = current_scope->bindings; b; b = b->prev)
-    gcc_assert (TREE_CODE (b->decl) != PARM_DECL || !DECL_WEAK (b->decl));
-#endif
+  struct pointer_set_t *seen_args = pointer_set_create ();
 
   if (!in_system_header)
     warning (OPT_Wold_style_definition, "%Jold-style function definition",
@@ -6131,12 +6165,12 @@ store_parm_decls_oldstyle (tree fndecl, const struct c_arg_info *arg_info)
          decl = b->decl;
          /* If we got something other than a PARM_DECL it is an error.  */
          if (TREE_CODE (decl) != PARM_DECL)
-           error ("%J%qD declared as a non-parameter", decl, decl);
+           error ("%q+D declared as a non-parameter", decl);
          /* If the declaration is already marked, we have a duplicate
             name.  Complain and ignore the duplicate.  */
-         else if (DECL_WEAK (decl))
+         else if (pointer_set_contains (seen_args, decl))
            {
-             error ("%Jmultiple parameters named %qD", decl, decl);
+             error ("multiple parameters named %q+D", decl);
              TREE_PURPOSE (parm) = 0;
              continue;
            }
@@ -6144,11 +6178,12 @@ store_parm_decls_oldstyle (tree fndecl, const struct c_arg_info *arg_info)
             an int.  */
          else if (VOID_TYPE_P (TREE_TYPE (decl)))
            {
-             error ("%Jparameter %qD declared with void type", decl, decl);
+             error ("parameter %q+D declared with void type", decl);
              TREE_TYPE (decl) = integer_type_node;
              DECL_ARG_TYPE (decl) = integer_type_node;
              layout_decl (decl, 0);
            }
+         warn_if_shadowing (decl);
        }
       /* If no declaration found, default to int.  */
       else
@@ -6157,15 +6192,16 @@ store_parm_decls_oldstyle (tree fndecl, const struct c_arg_info *arg_info)
          DECL_ARG_TYPE (decl) = TREE_TYPE (decl);
          DECL_SOURCE_LOCATION (decl) = DECL_SOURCE_LOCATION (fndecl);
          pushdecl (decl);
+         warn_if_shadowing (decl);
 
          if (flag_isoc99)
-           pedwarn ("%Jtype of %qD defaults to %<int%>", decl, decl);
+           pedwarn ("type of %q+D defaults to %<int%>", decl);
          else if (extra_warnings)
-           warning (0, "%Jtype of %qD defaults to %<int%>", decl, decl);
+           warning (OPT_Wextra, "type of %q+D defaults to %<int%>", decl);
        }
 
       TREE_PURPOSE (parm) = decl;
-      DECL_WEAK (decl) = 1;
+      pointer_set_insert (seen_args, decl);
     }
 
   /* Now examine the parms chain for incomplete declarations
@@ -6180,14 +6216,13 @@ store_parm_decls_oldstyle (tree fndecl, const struct c_arg_info *arg_info)
       if (TREE_TYPE (parm) != error_mark_node
          && !COMPLETE_TYPE_P (TREE_TYPE (parm)))
        {
-         error ("%Jparameter %qD has incomplete type", parm, parm);
+         error ("parameter %q+D has incomplete type", parm);
          TREE_TYPE (parm) = error_mark_node;
        }
 
-      if (!DECL_WEAK (parm))
+      if (!pointer_set_contains (seen_args, parm))
        {
-         error ("%Jdeclaration for parameter %qD but no such parameter",
-                parm, parm);
+         error ("declaration for parameter %q+D but no such parameter", parm);
 
          /* Pretend the parameter was not missing.
             This gets us to a standard state and minimizes
@@ -6208,18 +6243,18 @@ store_parm_decls_oldstyle (tree fndecl, const struct c_arg_info *arg_info)
     {
       last = TREE_PURPOSE (parm);
       DECL_ARGUMENTS (fndecl) = last;
-      DECL_WEAK (last) = 0;
 
       for (parm = TREE_CHAIN (parm); parm; parm = TREE_CHAIN (parm))
        if (TREE_PURPOSE (parm))
          {
            TREE_CHAIN (last) = TREE_PURPOSE (parm);
            last = TREE_PURPOSE (parm);
-           DECL_WEAK (last) = 0;
          }
       TREE_CHAIN (last) = 0;
     }
 
+  pointer_set_destroy (seen_args);
+
   /* If there was a previous prototype,
      set the DECL_ARG_TYPE of each argument according to
      the type previously specified, and report any mismatches.  */
@@ -6472,7 +6507,7 @@ finish_function (void)
          /* If warn_main is 1 (-Wmain) or 2 (-Wall), we have already warned.
             If warn_main is -1 (-Wno-main) we don't want to be warned.  */
          if (!warn_main)
-           pedwarn ("%Jreturn type of %qD is not %<int%>", fndecl, fndecl);
+           pedwarn ("return type of %q+D is not %<int%>", fndecl);
        }
       else
        {
@@ -6516,7 +6551,8 @@ finish_function (void)
         inline function, as we might never be compiled separately.  */
       && DECL_INLINE (fndecl))
     {
-      warning (0, "no return statement in function returning non-void");
+      warning (OPT_Wreturn_type,
+              "no return statement in function returning non-void");
       TREE_NO_WARNING (fndecl) = 1;
     }
 
@@ -6525,7 +6561,7 @@ finish_function (void)
   if (extra_warnings
       && current_function_returns_value
       && current_function_returns_null)
-    warning (0, "this function may return with or without a value");
+    warning (OPT_Wextra, "this function may return with or without a value");
 
   /* Store the end of the function, so that we get good line number
      info for the epilogue.  */
@@ -6647,11 +6683,11 @@ check_for_loop_decls (void)
        {
        case VAR_DECL:
          if (TREE_STATIC (decl))
-           error ("%Jdeclaration of static variable %qD in %<for%> loop "
-                  "initial declaration", decl, decl);
+           error ("declaration of static variable %q+D in %<for%> loop "
+                  "initial declaration", decl);
          else if (DECL_EXTERNAL (decl))
-           error ("%Jdeclaration of %<extern%> variable %qD in %<for%> loop "
-                  "initial declaration", decl, decl);
+           error ("declaration of %<extern%> variable %q+D in %<for%> loop "
+                  "initial declaration", decl);
          break;
 
        case RECORD_TYPE:
@@ -6667,8 +6703,8 @@ check_for_loop_decls (void)
                 id);
          break;
        default:
-         error ("%Jdeclaration of non-variable %qD in %<for%> loop "
-                "initial declaration", decl, decl);
+         error ("declaration of non-variable %q+D in %<for%> loop "
+                "initial declaration", decl);
        }
     }
 }
@@ -7263,7 +7299,7 @@ declspecs_add_scspec (struct c_declspecs *specs, tree scspec)
              && C_IS_RESERVED_WORD (scspec));
   i = C_RID_CODE (scspec);
   if (extra_warnings && specs->non_sc_seen_p)
-    warning (0, "%qE is not at beginning of declaration", scspec);
+    warning (OPT_Wextra, "%qE is not at beginning of declaration", scspec);
   switch (i)
     {
     case RID_INLINE:
@@ -7524,7 +7560,7 @@ c_write_global_declarations_1 (tree globals)
          && !TREE_PUBLIC (decl)
          && C_DECL_USED (decl))
        {
-         pedwarn ("%J%qF used but never defined", decl, decl);
+         pedwarn ("%q+F used but never defined", decl);
          TREE_NO_WARNING (decl) = 1;
        }
     }
@@ -7558,6 +7594,17 @@ c_write_global_declarations (void)
      through wrapup_global_declarations and check_global_declarations.  */
   for (t = all_translation_units; t; t = TREE_CHAIN (t))
     c_write_global_declarations_1 (BLOCK_VARS (DECL_INITIAL (t)));
+  if (ext_block)
+    {
+      tree tmp = BLOCK_VARS (ext_block);
+      int flags;
+      FILE * stream = dump_begin (TDI_tu, &flags);
+      if (stream && tmp)
+        {
+          dump_node (tmp, flags & ~TDF_SLIM, stream);
+          dump_end (TDI_tu, stream);
+        }
+    }
   c_write_global_declarations_1 (BLOCK_VARS (ext_block));
 
   /* Generate functions to call static constructors and destructors