OSDN Git Service

PR c/8420
authorjsm28 <jsm28@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 9 Sep 2004 01:25:48 +0000 (01:25 +0000)
committerjsm28 <jsm28@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 9 Sep 2004 01:25:48 +0000 (01:25 +0000)
* c-tree.h (struct c_declspecs): New.
(struct c_declarator, struct c_type_name, struct c_parm): Update
element types.
(build_array_declarator, grokfield, shadow_tag, shadow_tag_warned,
start_function, start_decl, build_c_parm,
make_pointer_declarator): Update prototypes.
(build_null_declspecs, declspecs_add_qual, declspecs_add_type,
declspecs_add_scspec, declspecs_add_attrs): New.
(split_specs_attrs): Remove.
* c-parse.in (%union): Add dsptype.
(declspecs_nosc_nots_nosa_noea, declspecs_nosc_nots_nosa_ea,
declspecs_nosc_nots_sa_noea, declspecs_nosc_nots_sa_ea,
declspecs_nosc_ts_nosa_noea, declspecs_nosc_ts_nosa_ea,
declspecs_nosc_ts_sa_noea, declspecs_nosc_ts_sa_ea,
declspecs_sc_nots_nosa_noea, declspecs_sc_nots_nosa_ea,
declspecs_sc_nots_sa_noea, declspecs_sc_nots_sa_ea,
declspecs_sc_ts_nosa_noea, declspecs_sc_ts_nosa_ea,
declspecs_sc_ts_sa_noea, declspecs_sc_ts_sa_ea, declspecs_ts,
declspecs_nots, declspecs_ts_nosa, declspecs_nots_nosa,
declspecs_nosc_ts, declspecs_nosc_nots, declspecs_nosc, declspecs,
maybe_type_quals_attrs): Change to dsptype.
(struct c_declspec_stack): New.
(current_declspecs, declspec_stack): Change type.
(PUSH_DECLSPEC_STACK, POP_DECLSPEC_STACK): Update to new
structures.
(extdefs): Likewise.
(setspecs): Likewise.
(fndef): Use current_declspecs for empty declspecs list.
(declspecs_nosc_nots_nosa_noea, declspecs_nosc_nots_nosa_ea,
declspecs_nosc_nots_sa_noea, declspecs_nosc_nots_sa_ea,
declspecs_nosc_ts_nosa_noea, declspecs_nosc_ts_nosa_ea,
declspecs_nosc_ts_sa_noea, declspecs_nosc_ts_sa_ea,
declspecs_sc_nots_nosa_noea, declspecs_sc_nots_nosa_ea,
declspecs_sc_nots_sa_noea, declspecs_sc_nots_sa_ea,
declspecs_sc_ts_nosa_noea, declspecs_sc_ts_nosa_ea,
declspecs_sc_ts_sa_noea, declspecs_sc_ts_sa_ea): Update to new
structures and helper functions.  Update comments.
(typespec_nonattr): Correct comment.
(maybe_type_quals_attrs, typename): Update to new structures.
* c-decl.c (grokdeclarator, build_array_declarator, grokfield,
shadow_tag, shadow_tag_warned, start_function, start_decl,
build_c_parm, make_pointer_declarator,
set_array_declarator_inner, groktypename): Update to new
structures.
(build_null_declspecs, declspecs_add_qual, declspecs_add_type,
declspecs_add_scspec, declspecs_add_attrs): New.
(split_specs_attrs): Remove.
(shadow_tag_warned): Make warning for useless type names a
pedwarn.  Give hard error for long, short, signed, unsigned or
_Complex used with struct, union or enum in empty declaration.
Make found_tag a bool.
(grokdeclarator): Remove checks now done at parse time.

testsuite:
* gcc.dg/anon-struct-4.c, gcc.dg/declspec-1.c,
gcc.dg/declspec-2.c, gcc.dg/declspec-3.c, gcc.dg/declspec-4.c,
gcc.dg/declspec-5.c, gcc.dg/declspec-6.c,
gcc.dg/long-long-typespec-1.c: New tests.
* gcc.dg/tls/diag-2.c: Update expected diagnostics

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@87218 138bc75d-0d04-0410-961f-82ee72b054a4

14 files changed:
gcc/ChangeLog
gcc/c-decl.c
gcc/c-parse.in
gcc/c-tree.h
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/anon-struct-4.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/declspec-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/declspec-2.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/declspec-3.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/declspec-4.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/declspec-5.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/declspec-6.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/long-long-typespec-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/tls/diag-2.c

index dd214e7..0c7706c 100644 (file)
@@ -1,5 +1,61 @@
 2004-09-09  Joseph S. Myers  <jsm@polyomino.org.uk>
 
 2004-09-09  Joseph S. Myers  <jsm@polyomino.org.uk>
 
+       PR c/8420
+       * c-tree.h (struct c_declspecs): New.
+       (struct c_declarator, struct c_type_name, struct c_parm): Update
+       element types.
+       (build_array_declarator, grokfield, shadow_tag, shadow_tag_warned,
+       start_function, start_decl, build_c_parm,
+       make_pointer_declarator): Update prototypes.
+       (build_null_declspecs, declspecs_add_qual, declspecs_add_type,
+       declspecs_add_scspec, declspecs_add_attrs): New.
+       (split_specs_attrs): Remove.
+       * c-parse.in (%union): Add dsptype.
+       (declspecs_nosc_nots_nosa_noea, declspecs_nosc_nots_nosa_ea,
+       declspecs_nosc_nots_sa_noea, declspecs_nosc_nots_sa_ea,
+       declspecs_nosc_ts_nosa_noea, declspecs_nosc_ts_nosa_ea,
+       declspecs_nosc_ts_sa_noea, declspecs_nosc_ts_sa_ea,
+       declspecs_sc_nots_nosa_noea, declspecs_sc_nots_nosa_ea,
+       declspecs_sc_nots_sa_noea, declspecs_sc_nots_sa_ea,
+       declspecs_sc_ts_nosa_noea, declspecs_sc_ts_nosa_ea,
+       declspecs_sc_ts_sa_noea, declspecs_sc_ts_sa_ea, declspecs_ts,
+       declspecs_nots, declspecs_ts_nosa, declspecs_nots_nosa,
+       declspecs_nosc_ts, declspecs_nosc_nots, declspecs_nosc, declspecs,
+       maybe_type_quals_attrs): Change to dsptype.
+       (struct c_declspec_stack): New.
+       (current_declspecs, declspec_stack): Change type.
+       (PUSH_DECLSPEC_STACK, POP_DECLSPEC_STACK): Update to new
+       structures.
+       (extdefs): Likewise.
+       (setspecs): Likewise.
+       (fndef): Use current_declspecs for empty declspecs list.
+       (declspecs_nosc_nots_nosa_noea, declspecs_nosc_nots_nosa_ea,
+       declspecs_nosc_nots_sa_noea, declspecs_nosc_nots_sa_ea,
+       declspecs_nosc_ts_nosa_noea, declspecs_nosc_ts_nosa_ea,
+       declspecs_nosc_ts_sa_noea, declspecs_nosc_ts_sa_ea,
+       declspecs_sc_nots_nosa_noea, declspecs_sc_nots_nosa_ea,
+       declspecs_sc_nots_sa_noea, declspecs_sc_nots_sa_ea,
+       declspecs_sc_ts_nosa_noea, declspecs_sc_ts_nosa_ea,
+       declspecs_sc_ts_sa_noea, declspecs_sc_ts_sa_ea): Update to new
+       structures and helper functions.  Update comments.
+       (typespec_nonattr): Correct comment.
+       (maybe_type_quals_attrs, typename): Update to new structures.
+       * c-decl.c (grokdeclarator, build_array_declarator, grokfield,
+       shadow_tag, shadow_tag_warned, start_function, start_decl,
+       build_c_parm, make_pointer_declarator,
+       set_array_declarator_inner, groktypename): Update to new
+       structures.
+       (build_null_declspecs, declspecs_add_qual, declspecs_add_type,
+       declspecs_add_scspec, declspecs_add_attrs): New.
+       (split_specs_attrs): Remove.
+       (shadow_tag_warned): Make warning for useless type names a
+       pedwarn.  Give hard error for long, short, signed, unsigned or
+       _Complex used with struct, union or enum in empty declaration.
+       Make found_tag a bool.
+       (grokdeclarator): Remove checks now done at parse time.
+
+2004-09-09  Joseph S. Myers  <jsm@polyomino.org.uk>
+
        * c-tree.h (enum c_declarator_kind, struct c_arg_info, struct
        c_declarator, struct c_type_name, struct c_parm): New.
        (build_array_declarator, set_array_declarator_inner,
        * c-tree.h (enum c_declarator_kind, struct c_arg_info, struct
        c_declarator, struct c_type_name, struct c_parm): New.
        (build_array_declarator, set_array_declarator_inner,
index 2f03344..12e27a0 100644 (file)
@@ -398,7 +398,8 @@ static GTY(()) tree static_dtors;
 /* Forward declarations.  */
 static tree lookup_name_in_scope (tree, struct c_scope *);
 static tree c_make_fname_decl (tree, int);
 /* Forward declarations.  */
 static tree lookup_name_in_scope (tree, struct c_scope *);
 static tree c_make_fname_decl (tree, int);
-static tree grokdeclarator (const struct c_declarator *, tree,
+static tree grokdeclarator (const struct c_declarator *,
+                           struct c_declspecs *,
                            enum decl_context, bool, tree *);
 static tree grokparms (struct c_arg_info *, bool);
 static void layout_array_type (tree);
                            enum decl_context, bool, tree *);
 static tree grokparms (struct c_arg_info *, bool);
 static void layout_array_type (tree);
@@ -2666,7 +2667,7 @@ builtin_function (const char *name, tree type, int function_code,
    Otherwise, it is an error.  */
 
 void
    Otherwise, it is an error.  */
 
 void
-shadow_tag (tree declspecs)
+shadow_tag (const struct c_declspecs *declspecs)
 {
   shadow_tag_warned (declspecs, 0);
 }
 {
   shadow_tag_warned (declspecs, 0);
 }
@@ -2674,21 +2675,15 @@ shadow_tag (tree declspecs)
 /* WARNED is 1 if we have done a pedwarn, 2 if we have done a warning,
    but no pedwarn.  */
 void
 /* WARNED is 1 if we have done a pedwarn, 2 if we have done a warning,
    but no pedwarn.  */
 void
-shadow_tag_warned (tree declspecs, int warned)
+shadow_tag_warned (const struct c_declspecs *declspecs, int warned)
 {
 {
-  int found_tag = 0;
-  tree link;
-  tree specs, attrs;
+  bool found_tag = false;
 
   pending_invalid_xref = 0;
 
 
   pending_invalid_xref = 0;
 
-  /* Remove the attributes from declspecs, since they will confuse the
-     following code.  */
-  split_specs_attrs (declspecs, &specs, &attrs);
-
-  for (link = specs; link; link = TREE_CHAIN (link))
+  if (declspecs->type && !declspecs->typedef_decl)
     {
     {
-      tree value = TREE_VALUE (link);
+      tree value = declspecs->type;
       enum tree_code code = TREE_CODE (value);
 
       if (code == RECORD_TYPE || code == UNION_TYPE || code == ENUMERAL_TYPE)
       enum tree_code code = TREE_CODE (value);
 
       if (code == RECORD_TYPE || code == UNION_TYPE || code == ENUMERAL_TYPE)
@@ -2698,7 +2693,7 @@ shadow_tag_warned (tree declspecs, int warned)
          tree name = TYPE_NAME (value);
          tree t;
 
          tree name = TYPE_NAME (value);
          tree t;
 
-         found_tag++;
+         found_tag = true;
 
          if (name == 0)
            {
 
          if (name == 0)
            {
@@ -2722,20 +2717,39 @@ shadow_tag_warned (tree declspecs, int warned)
        }
       else
        {
        }
       else
        {
-         if (!warned && ! in_system_header)
+         if (warned != 1 && !in_system_header)
            {
            {
-             warning ("useless keyword or type name in empty declaration");
-             warned = 2;
+             pedwarn ("useless type name in empty declaration");
+             warned = 1;
            }
        }
     }
            }
        }
     }
+  else if (warned != 1 && !in_system_header && declspecs->typedef_decl)
+    {
+      pedwarn ("useless type name in empty declaration");
+      warned = 1;
+    }
+
+  if (found_tag && (declspecs->specbits & ((1 << (int) RID_LONG)
+                                          | (1 << (int) RID_SHORT)
+                                          | (1 << (int) RID_UNSIGNED)
+                                          | (1 << (int) RID_SIGNED)
+                                          | (1 << (int) RID_COMPLEX))))
+    {
+      error ("long, short, signed, unsigned or complex used invalidly "
+            "in empty declaration");
+      warned = 1;
+    }
 
 
-  if (found_tag > 1)
-    error ("two types specified in one empty declaration");
+  if (!warned && !in_system_header && declspecs->specbits)
+    {
+      warning ("useless keyword or type name in empty declaration");
+      warned = 2;
+    }
 
   if (warned != 1)
     {
 
   if (warned != 1)
     {
-      if (found_tag == 0)
+      if (!found_tag)
        pedwarn ("empty declaration");
     }
 }
        pedwarn ("empty declaration");
     }
 }
@@ -2750,7 +2764,7 @@ shadow_tag_warned (tree declspecs, int warned)
    filled in by set_array_declarator_inner.  */
 
 struct c_declarator *
    filled in by set_array_declarator_inner.  */
 
 struct c_declarator *
-build_array_declarator (tree expr, tree quals, bool static_p,
+build_array_declarator (tree expr, struct c_declspecs *quals, bool static_p,
                        bool vla_unspec_p)
 {
   struct c_declarator *declarator = XOBNEW (&parser_obstack,
                        bool vla_unspec_p)
 {
   struct c_declarator *declarator = XOBNEW (&parser_obstack,
@@ -2763,7 +2777,7 @@ build_array_declarator (tree expr, tree quals, bool static_p,
   declarator->u.array.vla_unspec_p = vla_unspec_p;
   if (pedantic && !flag_isoc99)
     {
   declarator->u.array.vla_unspec_p = vla_unspec_p;
   if (pedantic && !flag_isoc99)
     {
-      if (static_p || quals != NULL_TREE)
+      if (static_p || quals != NULL)
        pedwarn ("ISO C90 does not support `static' or type qualifiers in parameter array declarators");
       if (vla_unspec_p)
        pedwarn ("ISO C90 does not support `[*]' array declarators");
        pedwarn ("ISO C90 does not support `static' or type qualifiers in parameter array declarators");
       if (vla_unspec_p)
        pedwarn ("ISO C90 does not support `[*]' array declarators");
@@ -2785,103 +2799,24 @@ set_array_declarator_inner (struct c_declarator *decl,
                            struct c_declarator *inner, bool abstract_p)
 {
   decl->declarator = inner;
                            struct c_declarator *inner, bool abstract_p)
 {
   decl->declarator = inner;
-  if (abstract_p && (decl->u.array.quals != NULL_TREE
+  if (abstract_p && (decl->u.array.quals != NULL
                     || decl->u.array.static_p))
     error ("static or type qualifiers in abstract declarator");
   return decl;
 }
 \f
                     || decl->u.array.static_p))
     error ("static or type qualifiers in abstract declarator");
   return decl;
 }
 \f
-/* Split SPECS_ATTRS, a list of declspecs and prefix attributes, into two
-   lists.  SPECS_ATTRS may also be just a typespec (eg: RECORD_TYPE).
-
-   The head of the declspec list is stored in DECLSPECS.
-   The head of the attribute list is stored in PREFIX_ATTRIBUTES.
-
-   Note that attributes in SPECS_ATTRS are stored in the TREE_PURPOSE of
-   the list elements.  We drop the containing TREE_LIST nodes and link the
-   resulting attributes together the way decl_attributes expects them.  */
-
-void
-split_specs_attrs (tree specs_attrs, tree *declspecs, tree *prefix_attributes)
-{
-  tree t, s, a, next, specs, attrs;
-
-  /* This can happen after an __extension__ in pedantic mode.  */
-  if (specs_attrs != NULL_TREE
-      && TREE_CODE (specs_attrs) == INTEGER_CST)
-    {
-      *declspecs = NULL_TREE;
-      *prefix_attributes = NULL_TREE;
-      return;
-    }
-
-  /* This can happen in c++ (eg: decl: typespec initdecls ';').  */
-  if (specs_attrs != NULL_TREE
-      && TREE_CODE (specs_attrs) != TREE_LIST)
-    {
-      *declspecs = specs_attrs;
-      *prefix_attributes = NULL_TREE;
-      return;
-    }
-
-  /* Remember to keep the lists in the same order, element-wise.  */
-
-  specs = s = NULL_TREE;
-  attrs = a = NULL_TREE;
-  for (t = specs_attrs; t; t = next)
-    {
-      next = TREE_CHAIN (t);
-      /* Declspecs have a non-NULL TREE_VALUE.  */
-      if (TREE_VALUE (t) != NULL_TREE)
-       {
-         if (specs == NULL_TREE)
-           specs = s = t;
-         else
-           {
-             TREE_CHAIN (s) = t;
-             s = t;
-           }
-       }
-      /* The TREE_PURPOSE may also be empty in the case of
-        __attribute__(()).  */
-      else if (TREE_PURPOSE (t) != NULL_TREE)
-       {
-         if (attrs == NULL_TREE)
-           attrs = a = TREE_PURPOSE (t);
-         else
-           {
-             TREE_CHAIN (a) = TREE_PURPOSE (t);
-             a = TREE_PURPOSE (t);
-           }
-         /* More attrs can be linked here, move A to the end.  */
-         while (TREE_CHAIN (a) != NULL_TREE)
-           a = TREE_CHAIN (a);
-       }
-    }
-
-  /* Terminate the lists.  */
-  if (s != NULL_TREE)
-    TREE_CHAIN (s) = NULL_TREE;
-  if (a != NULL_TREE)
-    TREE_CHAIN (a) = NULL_TREE;
-
-  /* All done.  */
-  *declspecs = specs;
-  *prefix_attributes = attrs;
-}
-
 /* Decode a "typename", such as "int **", returning a ..._TYPE node.  */
 
 tree
 groktypename (struct c_type_name *type_name)
 {
   tree type;
 /* Decode a "typename", such as "int **", returning a ..._TYPE node.  */
 
 tree
 groktypename (struct c_type_name *type_name)
 {
   tree type;
-  tree specs, attrs;
+  tree attrs = type_name->specs->attrs;
 
 
-  split_specs_attrs (type_name->specs, &specs, &attrs);
+  type_name->specs->attrs = NULL_TREE;
 
 
-  type = grokdeclarator (type_name->declarator, specs, TYPENAME, false,
-                        NULL);
+  type = grokdeclarator (type_name->declarator, type_name->specs, TYPENAME,
+                        false, NULL);
 
   /* Apply attributes.  */
   decl_attributes (&type, attrs, 0);
 
   /* Apply attributes.  */
   decl_attributes (&type, attrs, 0);
@@ -2905,7 +2840,7 @@ groktypename (struct c_type_name *type_name)
    grokfield and not through here.  */
 
 tree
    grokfield and not through here.  */
 
 tree
-start_decl (struct c_declarator *declarator, tree declspecs,
+start_decl (struct c_declarator *declarator, struct c_declspecs *declspecs,
            bool initialized, tree attributes)
 {
   tree decl;
            bool initialized, tree attributes)
 {
   tree decl;
@@ -3632,8 +3567,7 @@ check_bitfield_type_and_width (tree *type, tree *width, const char *orig_name)
    (In one case we can return a ..._TYPE node instead.
     For invalid input we sometimes return 0.)
 
    (In one case we can return a ..._TYPE node instead.
     For invalid input we sometimes return 0.)
 
-   DECLSPECS is a chain of tree_list nodes whose value fields
-    are the storage classes and type specifiers.
+   DECLSPECS is a c_declspecs structure for the declaration specifiers.
 
    DECL_CONTEXT says which syntactic context this declaration is in:
      NORMAL for most contexts.  Make a VAR_DECL or FUNCTION_DECL or TYPE_DECL.
 
    DECL_CONTEXT says which syntactic context this declaration is in:
      NORMAL for most contexts.  Make a VAR_DECL or FUNCTION_DECL or TYPE_DECL.
@@ -3657,29 +3591,25 @@ check_bitfield_type_and_width (tree *type, tree *width, const char *orig_name)
    and `extern' are interpreted.  */
 
 static tree
    and `extern' are interpreted.  */
 
 static tree
-grokdeclarator (const struct c_declarator *declarator, tree declspecs,
+grokdeclarator (const struct c_declarator *declarator,
+               struct c_declspecs *declspecs,
                enum decl_context decl_context, bool initialized, tree *width)
 {
                enum decl_context decl_context, bool initialized, tree *width)
 {
-  int specbits = 0;
-  tree spec;
-  tree type = NULL_TREE;
-  int longlong = 0;
+  int specbits = declspecs->specbits;
+  tree type = declspecs->type;
   int constp;
   int restrictp;
   int volatilep;
   int type_quals = TYPE_UNQUALIFIED;
   int inlinep;
   int constp;
   int restrictp;
   int volatilep;
   int type_quals = TYPE_UNQUALIFIED;
   int inlinep;
-  int explicit_int = 0;
-  int explicit_char = 0;
   int defaulted_int = 0;
   int defaulted_int = 0;
-  tree typedef_decl = 0;
   const char *name, *orig_name;
   tree typedef_type = 0;
   int funcdef_flag = 0;
   bool funcdef_syntax = false;
   int size_varies = 0;
   tree decl_attr = NULL_TREE;
   const char *name, *orig_name;
   tree typedef_type = 0;
   int funcdef_flag = 0;
   bool funcdef_syntax = false;
   int size_varies = 0;
   tree decl_attr = NULL_TREE;
-  tree array_ptr_quals = NULL_TREE;
+  struct c_declspecs *array_ptr_quals = 0;
   int array_parm_static = 0;
   tree returned_attrs = NULL_TREE;
   bool bitfield = width != NULL;
   int array_parm_static = 0;
   tree returned_attrs = NULL_TREE;
   bool bitfield = width != NULL;
@@ -3735,116 +3665,10 @@ grokdeclarator (const struct c_declarator *declarator, tree declspecs,
   if (decl_context == NORMAL && !funcdef_flag && current_scope->parm_flag)
     decl_context = PARM;
 
   if (decl_context == NORMAL && !funcdef_flag && current_scope->parm_flag)
     decl_context = PARM;
 
-  /* Look through the decl specs and record which ones appear.
-     Some typespecs are defined as built-in typenames.
-     Others, the ones that are modifiers of other types,
-     are represented by bits in SPECBITS: set the bits for
-     the modifiers that appear.  Storage class keywords are also in SPECBITS.
-
-     If there is a typedef name or a type, store the type in TYPE.
-     This includes builtin typedefs such as `int'.
-
-     Set EXPLICIT_INT or EXPLICIT_CHAR if the type is `int' or `char'
-     and did not come from a user typedef.
-
-     Set LONGLONG if `long' is mentioned twice.  */
-
-  for (spec = declspecs; spec; spec = TREE_CHAIN (spec))
-    {
-      tree id = TREE_VALUE (spec);
-
-      /* If the entire declaration is itself tagged as deprecated then
-         suppress reports of deprecated items.  */
-      if (id && TREE_DEPRECATED (id))
-        {
-         if (deprecated_state != DEPRECATED_SUPPRESS)
-           warn_deprecated_use (id);
-        }
-
-      if (id == ridpointers[(int) RID_INT])
-       explicit_int = 1;
-      if (id == ridpointers[(int) RID_CHAR])
-       explicit_char = 1;
-
-      if (TREE_CODE (id) == IDENTIFIER_NODE && C_IS_RESERVED_WORD (id))
-       {
-         enum rid i = C_RID_CODE (id);
-         if ((int) i <= (int) RID_LAST_MODIFIER)
-           {
-             if (i == RID_LONG && (specbits & (1 << (int) RID_LONG)))
-               {
-                 if (longlong)
-                   error ("`long long long' is too long for GCC");
-                 else
-                   {
-                     if (pedantic && !flag_isoc99 && ! in_system_header
-                         && warn_long_long)
-                       pedwarn ("ISO C90 does not support `long long'");
-                     longlong = 1;
-                   }
-               }
-             else if (specbits & (1 << (int) i))
-               {
-                 if (i == RID_CONST || i == RID_VOLATILE || i == RID_RESTRICT)
-                   {
-                     if (pedantic && !flag_isoc99)
-                       pedwarn ("duplicate `%s'", IDENTIFIER_POINTER (id));
-                   }
-                 else
-                   error ("duplicate `%s'", IDENTIFIER_POINTER (id));
-               }
-
-             /* Diagnose "__thread extern".  Recall that this list
-                is in the reverse order seen in the text.  */
-             if (i == RID_THREAD
-                 && (specbits & (1 << (int) RID_EXTERN
-                                 | 1 << (int) RID_STATIC)))
-               {
-                 if (specbits & 1 << (int) RID_EXTERN)
-                   error ("`__thread' before `extern'");
-                 else
-                   error ("`__thread' before `static'");
-               }
-
-             specbits |= 1 << (int) i;
-             goto found;
-           }
-       }
-      if (type)
-       error ("two or more data types in declaration of `%s'", name);
-      /* Actual typedefs come to us as TYPE_DECL nodes.  */
-      else if (TREE_CODE (id) == TYPE_DECL)
-       {
-         if (TREE_TYPE (id) == error_mark_node)
-           ; /* Allow the type to default to int to avoid cascading errors.  */
-         else
-           {
-             type = TREE_TYPE (id);
-             decl_attr = DECL_ATTRIBUTES (id);
-             typedef_decl = id;
-           }
-       }
-      /* Built-in types come as identifiers.  */
-      else if (TREE_CODE (id) == IDENTIFIER_NODE)
-       {
-         tree t = lookup_name (id);
-          if (!t || TREE_CODE (t) != TYPE_DECL)
-           error ("`%s' fails to be a typedef or built in type",
-                  IDENTIFIER_POINTER (id));
-          else if (TREE_TYPE (t) == error_mark_node)
-           ;
-         else
-           {
-             type = TREE_TYPE (t);
-             typedef_decl = t;
-           }
-       }
-      else if (TREE_CODE (id) != ERROR_MARK)
-       type = id;
-
-    found:
-      ;
-    }
+  if (declspecs->deprecated_p && deprecated_state != DEPRECATED_SUPPRESS)
+    warn_deprecated_use (declspecs->typedef_decl
+                        ? declspecs->typedef_decl
+                        : declspecs->type);
 
   typedef_type = type;
   if (type)
 
   typedef_type = type;
   if (type)
@@ -3883,7 +3707,7 @@ grokdeclarator (const struct c_declarator *declarator, tree declspecs,
 
   /* Long double is a special combination.  */
 
 
   /* Long double is a special combination.  */
 
-  if ((specbits & 1 << (int) RID_LONG) && ! longlong
+  if ((specbits & 1 << (int) RID_LONG) && ! declspecs->long_long_p
       && TYPE_MAIN_VARIANT (type) == double_type_node)
     {
       specbits &= ~(1 << (int) RID_LONG);
       && TYPE_MAIN_VARIANT (type) == double_type_node)
     {
       specbits &= ~(1 << (int) RID_LONG);
@@ -3902,7 +3726,7 @@ grokdeclarator (const struct c_declarator *declarator, tree declspecs,
        error ("both long and short specified for `%s'", name);
       else if (((specbits & 1 << (int) RID_LONG)
                || (specbits & 1 << (int) RID_SHORT))
        error ("both long and short specified for `%s'", name);
       else if (((specbits & 1 << (int) RID_LONG)
                || (specbits & 1 << (int) RID_SHORT))
-              && explicit_char)
+              && declspecs->explicit_char_p)
        error ("long or short specified with char for `%s'", name);
       else if (((specbits & 1 << (int) RID_LONG)
                || (specbits & 1 << (int) RID_SHORT))
        error ("long or short specified with char for `%s'", name);
       else if (((specbits & 1 << (int) RID_LONG)
                || (specbits & 1 << (int) RID_SHORT))
@@ -3925,7 +3749,8 @@ grokdeclarator (const struct c_declarator *declarator, tree declspecs,
       else
        {
          ok = 1;
       else
        {
          ok = 1;
-         if (!explicit_int && !defaulted_int && !explicit_char)
+         if (!declspecs->explicit_int_p && !defaulted_int
+             && !declspecs->explicit_char_p)
            {
              error ("long, short, signed or unsigned used invalidly for `%s'",
                     name);
            {
              error ("long, short, signed or unsigned used invalidly for `%s'",
                     name);
@@ -3938,7 +3763,7 @@ grokdeclarator (const struct c_declarator *declarator, tree declspecs,
        {
          specbits &= ~((1 << (int) RID_LONG) | (1 << (int) RID_SHORT)
                        | (1 << (int) RID_UNSIGNED) | (1 << (int) RID_SIGNED));
        {
          specbits &= ~((1 << (int) RID_LONG) | (1 << (int) RID_SHORT)
                        | (1 << (int) RID_UNSIGNED) | (1 << (int) RID_SIGNED));
-         longlong = 0;
+         declspecs->long_long_p = 0;
        }
     }
 
        }
     }
 
@@ -3953,15 +3778,16 @@ grokdeclarator (const struct c_declarator *declarator, tree declspecs,
      Optionally treat bit-fields as signed by default.  */
   if (specbits & 1 << (int) RID_UNSIGNED
       || (bitfield && ! flag_signed_bitfields
      Optionally treat bit-fields as signed by default.  */
   if (specbits & 1 << (int) RID_UNSIGNED
       || (bitfield && ! flag_signed_bitfields
-         && (explicit_int || defaulted_int || explicit_char
+         && (declspecs->explicit_int_p || defaulted_int
+             || declspecs->explicit_char_p
              /* A typedef for plain `int' without `signed'
                 can be controlled just like plain `int'.  */
              /* A typedef for plain `int' without `signed'
                 can be controlled just like plain `int'.  */
-             || ! (typedef_decl != 0
-                   && C_TYPEDEF_EXPLICITLY_SIGNED (typedef_decl)))
+             || ! (declspecs->typedef_decl != 0
+                   && C_TYPEDEF_EXPLICITLY_SIGNED (declspecs->typedef_decl)))
          && TREE_CODE (type) != ENUMERAL_TYPE
          && !(specbits & 1 << (int) RID_SIGNED)))
     {
          && TREE_CODE (type) != ENUMERAL_TYPE
          && !(specbits & 1 << (int) RID_SIGNED)))
     {
-      if (longlong)
+      if (declspecs->long_long_p)
        type = long_long_unsigned_type_node;
       else if (specbits & 1 << (int) RID_LONG)
        type = long_unsigned_type_node;
        type = long_long_unsigned_type_node;
       else if (specbits & 1 << (int) RID_LONG)
        type = long_unsigned_type_node;
@@ -3969,7 +3795,7 @@ grokdeclarator (const struct c_declarator *declarator, tree declspecs,
        type = short_unsigned_type_node;
       else if (type == char_type_node)
        type = unsigned_char_type_node;
        type = short_unsigned_type_node;
       else if (type == char_type_node)
        type = unsigned_char_type_node;
-      else if (typedef_decl)
+      else if (declspecs->typedef_decl)
        type = c_common_unsigned_type (type);
       else
        type = unsigned_type_node;
        type = c_common_unsigned_type (type);
       else
        type = unsigned_type_node;
@@ -3977,7 +3803,7 @@ grokdeclarator (const struct c_declarator *declarator, tree declspecs,
   else if ((specbits & 1 << (int) RID_SIGNED)
           && type == char_type_node)
     type = signed_char_type_node;
   else if ((specbits & 1 << (int) RID_SIGNED)
           && type == char_type_node)
     type = signed_char_type_node;
-  else if (longlong)
+  else if (declspecs->long_long_p)
     type = long_long_integer_type_node;
   else if (specbits & 1 << (int) RID_LONG)
     type = long_integer_type_node;
     type = long_long_integer_type_node;
   else if (specbits & 1 << (int) RID_LONG)
     type = long_integer_type_node;
@@ -3993,7 +3819,7 @@ grokdeclarator (const struct c_declarator *declarator, tree declspecs,
         the complex form of TYPE.  E.g, "complex short" is
         "complex short int".  */
 
         the complex form of TYPE.  E.g, "complex short" is
         "complex short int".  */
 
-      if (defaulted_int && ! longlong
+      if (defaulted_int && ! declspecs->long_long_p
          && ! (specbits & ((1 << (int) RID_LONG) | (1 << (int) RID_SHORT)
                            | (1 << (int) RID_SIGNED)
                            | (1 << (int) RID_UNSIGNED))))
          && ! (specbits & ((1 << (int) RID_LONG) | (1 << (int) RID_SHORT)
                            | (1 << (int) RID_SIGNED)
                            | (1 << (int) RID_UNSIGNED))))
@@ -4180,13 +4006,13 @@ grokdeclarator (const struct c_declarator *declarator, tree declspecs,
         array or function or pointer, and DECLARATOR has had its
         outermost layer removed.  */
 
         array or function or pointer, and DECLARATOR has had its
         outermost layer removed.  */
 
-      if (array_ptr_quals != NULL_TREE || array_parm_static)
+      if (array_ptr_quals != NULL || 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");
        {
          /* 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_ptr_quals = NULL;
          array_parm_static = 0;
        }
 
          array_parm_static = 0;
        }
 
@@ -4372,10 +4198,10 @@ grokdeclarator (const struct c_declarator *declarator, tree declspecs,
              layout_type (type);
 
            if (decl_context != PARM
              layout_type (type);
 
            if (decl_context != PARM
-               && (array_ptr_quals != NULL_TREE || array_parm_static))
+               && (array_ptr_quals != NULL || array_parm_static))
              {
                error ("static or type qualifiers in non-parameter array declarator");
              {
                error ("static or type qualifiers in non-parameter array declarator");
-               array_ptr_quals = NULL_TREE;
+               array_ptr_quals = NULL;
                array_parm_static = 0;
              }
            break;
                array_parm_static = 0;
              }
            break;
@@ -4469,53 +4295,27 @@ grokdeclarator (const struct c_declarator *declarator, tree declspecs,
            
            type = build_pointer_type (type);
            
            
            type = build_pointer_type (type);
            
-           /* Process a list of type modifier keywords (such as const
-              or volatile) that were given inside the `*'.  */
+           /* Process type qualifiers (such as const or volatile)
+              that were given inside the `*'.  */
            if (declarator->u.pointer_quals)
              {
            if (declarator->u.pointer_quals)
              {
-               tree typemodlist;
-               int erred = 0;
-               
-               constp = 0;
-               volatilep = 0;
-               restrictp = 0;
-               for (typemodlist = declarator->u.pointer_quals; typemodlist;
-                    typemodlist = TREE_CHAIN (typemodlist))
-                 {
-                   tree qualifier = TREE_VALUE (typemodlist);
-                   
-                   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 pointer declarator");
-               if (pedantic && !flag_isoc99)
-                 {
-                   if (constp > 1)
-                     pedwarn ("duplicate `const'");
-                   if (volatilep > 1)
-                     pedwarn ("duplicate `volatile'");
-                   if (restrictp > 1)
-                     pedwarn ("duplicate `restrict'");
-                 }
-               
+               int pbits = declarator->u.pointer_quals->specbits;
+
+               /* The grammar should only permit qualifiers here.  */
+               gcc_assert (!declarator->u.pointer_quals->type
+                           && !(pbits & ~((1 << (int) RID_CONST)
+                                          | (1 << (int) RID_VOLATILE)
+                                          | (1 << (int) RID_RESTRICT))));
+
+               constp = !!(pbits & (1 << (int) RID_CONST));
+               volatilep = !!(pbits & (1 << (int) RID_VOLATILE));
+               restrictp = !!(pbits & (1 << (int) RID_RESTRICT));
+
                type_quals = ((constp ? TYPE_QUAL_CONST : 0)
                              | (restrictp ? TYPE_QUAL_RESTRICT : 0)
                              | (volatilep ? TYPE_QUAL_VOLATILE : 0));
              }
                type_quals = ((constp ? TYPE_QUAL_CONST : 0)
                              | (restrictp ? TYPE_QUAL_RESTRICT : 0)
                              | (volatilep ? TYPE_QUAL_VOLATILE : 0));
              }
-           
+
            declarator = declarator->declarator;
            break;
          }
            declarator = declarator->declarator;
            break;
          }
@@ -4552,7 +4352,8 @@ grokdeclarator (const struct c_declarator *declarator, tree declspecs,
        type = c_build_qualified_type (type, type_quals);
       decl = build_decl (TYPE_DECL, declarator->u.id, type);
       if ((specbits & (1 << (int) RID_SIGNED))
        type = c_build_qualified_type (type, type_quals);
       decl = build_decl (TYPE_DECL, declarator->u.id, type);
       if ((specbits & (1 << (int) RID_SIGNED))
-         || (typedef_decl && C_TYPEDEF_EXPLICITLY_SIGNED (typedef_decl)))
+         || (declspecs->typedef_decl
+             && C_TYPEDEF_EXPLICITLY_SIGNED (declspecs->typedef_decl)))
        C_TYPEDEF_EXPLICITLY_SIGNED (decl) = 1;
       decl_attributes (&decl, returned_attrs, 0);
       return decl;
        C_TYPEDEF_EXPLICITLY_SIGNED (decl) = 1;
       decl_attributes (&decl, returned_attrs, 0);
       return decl;
@@ -4630,37 +4431,21 @@ grokdeclarator (const struct c_declarator *declarator, tree declspecs,
            type_quals = TYPE_UNQUALIFIED;
            if (array_ptr_quals)
              {
            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);
+               int apqbits = array_ptr_quals->specbits;
+
                /* We don't yet implement attributes in this context.  */
                /* We don't yet implement attributes in this context.  */
-               if (new_ptr_attrs != NULL_TREE)
+               if (array_ptr_quals->attrs != NULL_TREE)
                  warning ("attributes in parameter array declarator ignored");
 
                  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++;
-                 }
+               /* The grammar should only permit qualifiers here.  */
+               gcc_assert (!array_ptr_quals->type
+                           && !(apqbits & ~((1 << (int) RID_CONST)
+                                            | (1 << (int) RID_VOLATILE)
+                                            | (1 << (int) RID_RESTRICT))));
 
 
-               if (erred)
-                 error ("invalid type modifier within array declarator");
+               constp = !!(apqbits & (1 << (int) RID_CONST));
+               volatilep = !!(apqbits & (1 << (int) RID_VOLATILE));
+               restrictp = !!(apqbits & (1 << (int) RID_RESTRICT));
 
                type_quals = ((constp ? TYPE_QUAL_CONST : 0)
                              | (restrictp ? TYPE_QUAL_RESTRICT : 0)
 
                type_quals = ((constp ? TYPE_QUAL_CONST : 0)
                              | (restrictp ? TYPE_QUAL_RESTRICT : 0)
@@ -5282,7 +5067,8 @@ start_struct (enum tree_code code, tree name)
    are ultimately passed to `build_struct' to make the RECORD_TYPE node.  */
 
 tree
    are ultimately passed to `build_struct' to make the RECORD_TYPE node.  */
 
 tree
-grokfield (struct c_declarator *declarator, tree declspecs, tree width)
+grokfield (struct c_declarator *declarator, struct c_declspecs *declspecs,
+          tree width)
 {
   tree value;
 
 {
   tree value;
 
@@ -5308,11 +5094,12 @@ grokfield (struct c_declarator *declarator, tree declspecs, tree width)
         took this from Plan 9 or if it was an accident of implementation
         that took root before someone noticed the bug...  */
 
         took this from Plan 9 or if it was an accident of implementation
         that took root before someone noticed the bug...  */
 
-      tree type = TREE_VALUE (declspecs);
+      tree type = declspecs->type;
 
 
-      if (flag_ms_extensions && TREE_CODE (type) == TYPE_DECL)
-       type = TREE_TYPE (type);
-      if (TREE_CODE (type) == RECORD_TYPE || TREE_CODE (type) == UNION_TYPE)
+      if (type
+         && (TREE_CODE (type) == RECORD_TYPE
+             || TREE_CODE (type) == UNION_TYPE)
+         && (flag_ms_extensions || !declspecs->typedef_decl))
        {
          if (flag_ms_extensions)
            ; /* ok */
        {
          if (flag_ms_extensions)
            ; /* ok */
@@ -5916,7 +5703,7 @@ build_enumerator (tree name, tree value)
    yyparse to report a parse error.  */
 
 int
    yyparse to report a parse error.  */
 
 int
-start_function (tree declspecs, struct c_declarator *declarator,
+start_function (struct c_declspecs *declspecs, struct c_declarator *declarator,
                tree attributes)
 {
   tree decl1, old_decl;
                tree attributes)
 {
   tree decl1, old_decl;
@@ -6857,7 +6644,8 @@ build_void_list_node (void)
 /* Return a c_parm structure with the given SPECS, ATTRS and DECLARATOR.  */
 
 struct c_parm *
 /* Return a c_parm structure with the given SPECS, ATTRS and DECLARATOR.  */
 
 struct c_parm *
-build_c_parm (tree specs, tree attrs, struct c_declarator *declarator)
+build_c_parm (struct c_declspecs *specs, tree attrs,
+             struct c_declarator *declarator)
 {
   struct c_parm *ret = XOBNEW (&parser_obstack, struct c_parm);
   ret->specs = specs;
 {
   struct c_parm *ret = XOBNEW (&parser_obstack, struct c_parm);
   ret->specs = specs;
@@ -6909,25 +6697,174 @@ build_id_declarator (tree ident)
 
 /* Return something to represent absolute declarators containing a *.
    TARGET is the absolute declarator that the * contains.
 
 /* Return something to represent absolute declarators containing a *.
    TARGET is the absolute declarator that the * contains.
-   TYPE_QUALS_ATTRS is a list of modifiers such as const or volatile
-   to apply to the pointer type, represented as identifiers, possible mixed
-   with attributes.  */
+   TYPE_QUALS_ATTRS is a structure for type qualifiers and attributes
+   to apply to the pointer type.  */
 
 struct c_declarator *
 
 struct c_declarator *
-make_pointer_declarator (tree type_quals_attrs, struct c_declarator *target)
+make_pointer_declarator (struct c_declspecs *type_quals_attrs,
+                        struct c_declarator *target)
 {
 {
-  tree quals, attrs;
+  tree attrs;
   struct c_declarator *itarget = target;
   struct c_declarator *ret = XOBNEW (&parser_obstack, struct c_declarator);
   struct c_declarator *itarget = target;
   struct c_declarator *ret = XOBNEW (&parser_obstack, struct c_declarator);
-  split_specs_attrs (type_quals_attrs, &quals, &attrs);
-  if (attrs != NULL_TREE)
-    itarget = build_attrs_declarator (attrs, target);
+  if (type_quals_attrs)
+    {
+      attrs = type_quals_attrs->attrs;
+      type_quals_attrs->attrs = NULL_TREE;
+      if (attrs != NULL_TREE)
+       itarget = build_attrs_declarator (attrs, target);
+    }
   ret->kind = cdk_pointer;
   ret->declarator = itarget;
   ret->kind = cdk_pointer;
   ret->declarator = itarget;
-  ret->u.pointer_quals = quals;
+  ret->u.pointer_quals = type_quals_attrs;
+  return ret;
+}
+
+/* Return a pointer to a structure for an empty list of declaration
+   specifiers.  */
+
+struct c_declspecs *
+build_null_declspecs (void)
+{
+  struct c_declspecs *ret = XOBNEW (&parser_obstack, struct c_declspecs);
+  ret->type = 0;
+  ret->typedef_decl = 0;
+  ret->decl_attr = 0;
+  ret->attrs = 0;
+  ret->specbits = 0;
+  ret->non_sc_seen_p = false;
+  ret->deprecated_p = false;
+  ret->explicit_int_p = false;
+  ret->explicit_char_p = false;
+  ret->long_long_p = false;
   return ret;
 }
 
   return ret;
 }
 
+/* Add the type qualifier QUAL to the declaration specifiers SPECS,
+   returning SPECS.  */
+
+struct c_declspecs *
+declspecs_add_qual (struct c_declspecs *specs, tree qual)
+{
+  enum rid i;
+  specs->non_sc_seen_p = true;
+  gcc_assert (TREE_CODE (qual) == IDENTIFIER_NODE
+             && C_IS_RESERVED_WORD (qual));
+  i = C_RID_CODE (qual);
+  gcc_assert (i == RID_CONST || i == RID_VOLATILE || i == RID_RESTRICT);
+  if ((specs->specbits & (1 << (int) i)) && pedantic && !flag_isoc99)
+    pedwarn ("duplicate %qs", IDENTIFIER_POINTER (qual));
+  specs->specbits |= 1 << (int) i;
+  return specs;
+}
+
+/* Add the type specifier TYPE to the declaration specifiers SPECS,
+   returning SPECS.  */
+
+struct c_declspecs *
+declspecs_add_type (struct c_declspecs *specs, tree type)
+{
+  specs->non_sc_seen_p = true;
+  if (TREE_DEPRECATED (type))
+    specs->deprecated_p = true;
+  if (type == ridpointers[(int) RID_INT])
+    specs->explicit_int_p = true;
+  if (type == ridpointers[(int) RID_CHAR])
+    specs->explicit_char_p = true;
+
+  if (TREE_CODE (type) == IDENTIFIER_NODE && C_IS_RESERVED_WORD (type))
+    {
+      enum rid i = C_RID_CODE (type);
+      if ((int) i <= (int) RID_LAST_MODIFIER)
+       {
+         if (i == RID_LONG && (specs->specbits & (1 << (int) RID_LONG)))
+           {
+             if (specs->long_long_p)
+               error ("%<long long long%> is too long for GCC");
+             else
+               {
+                 if (pedantic && !flag_isoc99 && !in_system_header
+                     && warn_long_long)
+                   pedwarn ("ISO C90 does not support %<long long%>");
+                 specs->long_long_p = 1;
+               }
+           }
+         else if (specs->specbits & (1 << (int) i))
+           error ("duplicate %qs", IDENTIFIER_POINTER (type));
+
+         specs->specbits |= 1 << (int) i;
+         return specs;
+       }
+    }
+  if (specs->type)
+    error ("two or more data types in declaration specifiers");
+  /* Actual typedefs come to us as TYPE_DECL nodes.  */
+  else if (TREE_CODE (type) == TYPE_DECL)
+    {
+      if (TREE_TYPE (type) == error_mark_node)
+       ; /* Allow the type to default to int to avoid cascading errors.  */
+      else
+       {
+         specs->type = TREE_TYPE (type);
+         specs->decl_attr = DECL_ATTRIBUTES (type);
+         specs->typedef_decl = type;
+       }
+    }
+  /* Built-in types come as identifiers.  */
+  else if (TREE_CODE (type) == IDENTIFIER_NODE)
+    {
+      tree t = lookup_name (type);
+      if (!t || TREE_CODE (t) != TYPE_DECL)
+       error ("%qs fails to be a typedef or built in type",
+              IDENTIFIER_POINTER (type));
+      else if (TREE_TYPE (t) == error_mark_node)
+       ;
+      else
+       specs->type = TREE_TYPE (t);
+    }
+  else if (TREE_CODE (type) != ERROR_MARK)
+    specs->type = type;
+
+  return specs;
+}
+
+/* Add the storage class specifier or function specifier SCSPEC to the
+   declaration specifiers SPECS, returning SPECS.  */
+
+struct c_declspecs *
+declspecs_add_scspec (struct c_declspecs *specs, tree scspec)
+{
+  enum rid i;
+  gcc_assert (TREE_CODE (scspec) == IDENTIFIER_NODE
+             && C_IS_RESERVED_WORD (scspec));
+  i = C_RID_CODE (scspec);
+  if (extra_warnings && specs->non_sc_seen_p)
+    warning ("%qs is not at beginning of declaration",
+            IDENTIFIER_POINTER (scspec));
+  if (specs->specbits & (1 << (int) i))
+    error ("duplicate %qs", IDENTIFIER_POINTER (scspec));
+  /* Diagnose "__thread extern" and "__thread static".  */
+  if (specs->specbits & (1 << (int) RID_THREAD))
+    {
+      if (i == RID_EXTERN)
+       error ("%<__thread%> before %<extern%>");
+      else if (i == RID_STATIC)        
+       error ("%<__thread%> before %<static%>");
+    }
+  specs->specbits |= 1 << (int) i;
+  return specs;
+}
+
+/* Add the attributes ATTRS to the declaration specifiers SPECS,
+   returning SPECS.  */
+
+struct c_declspecs *
+declspecs_add_attrs (struct c_declspecs *specs, tree attrs)
+{
+  specs->attrs = chainon (attrs, specs->attrs);
+  return specs;
+}
+
 /* Synthesize a function which calls all the global ctors or global
    dtors in this file.  This is only used for targets which do not
    support .ctors/.dtors sections.  FIXME: Migrate into cgraph.  */
 /* Synthesize a function which calls all the global ctors or global
    dtors in this file.  This is only used for targets which do not
    support .ctors/.dtors sections.  FIXME: Migrate into cgraph.  */
index 9a0b4d2..ed0e3e1 100644 (file)
@@ -102,7 +102,8 @@ do {                                                                        \
 %union {long itype; tree ttype; void *otype; struct c_expr exprtype;
        struct c_arg_info *arginfotype; struct c_declarator *dtrtype;
        struct c_type_name *typenametype; struct c_parm *parmtype;
 %union {long itype; tree ttype; void *otype; struct c_expr exprtype;
        struct c_arg_info *arginfotype; struct c_declarator *dtrtype;
        struct c_type_name *typenametype; struct c_parm *parmtype;
-       enum tree_code code; location_t location; }
+       struct c_declspecs *dsptype; enum tree_code code;
+       location_t location; }
 
 /* All identifiers that are not reserved words
    and are not declared typedefs in the current block */
 
 /* All identifiers that are not reserved words
    and are not declared typedefs in the current block */
@@ -190,18 +191,19 @@ do {                                                                      \
 %type <ttype> identifier IDENTIFIER TYPENAME CONSTANT STRING FUNC_NAME
 %type <ttype> nonnull_exprlist exprlist
 %type <exprtype> expr expr_no_commas cast_expr unary_expr primary
 %type <ttype> identifier IDENTIFIER TYPENAME CONSTANT STRING FUNC_NAME
 %type <ttype> nonnull_exprlist exprlist
 %type <exprtype> expr expr_no_commas cast_expr unary_expr primary
-%type <ttype> declspecs_nosc_nots_nosa_noea declspecs_nosc_nots_nosa_ea
-%type <ttype> declspecs_nosc_nots_sa_noea declspecs_nosc_nots_sa_ea
-%type <ttype> declspecs_nosc_ts_nosa_noea declspecs_nosc_ts_nosa_ea
-%type <ttype> declspecs_nosc_ts_sa_noea declspecs_nosc_ts_sa_ea
-%type <ttype> declspecs_sc_nots_nosa_noea declspecs_sc_nots_nosa_ea
-%type <ttype> declspecs_sc_nots_sa_noea declspecs_sc_nots_sa_ea
-%type <ttype> declspecs_sc_ts_nosa_noea declspecs_sc_ts_nosa_ea
-%type <ttype> declspecs_sc_ts_sa_noea declspecs_sc_ts_sa_ea
-%type <ttype> declspecs_ts declspecs_nots
-%type <ttype> declspecs_ts_nosa declspecs_nots_nosa
-%type <ttype> declspecs_nosc_ts declspecs_nosc_nots declspecs_nosc declspecs
-%type <ttype> maybe_type_quals_attrs typespec_nonattr typespec_attr
+%type <dsptype> declspecs_nosc_nots_nosa_noea declspecs_nosc_nots_nosa_ea
+%type <dsptype> declspecs_nosc_nots_sa_noea declspecs_nosc_nots_sa_ea
+%type <dsptype> declspecs_nosc_ts_nosa_noea declspecs_nosc_ts_nosa_ea
+%type <dsptype> declspecs_nosc_ts_sa_noea declspecs_nosc_ts_sa_ea
+%type <dsptype> declspecs_sc_nots_nosa_noea declspecs_sc_nots_nosa_ea
+%type <dsptype> declspecs_sc_nots_sa_noea declspecs_sc_nots_sa_ea
+%type <dsptype> declspecs_sc_ts_nosa_noea declspecs_sc_ts_nosa_ea
+%type <dsptype> declspecs_sc_ts_sa_noea declspecs_sc_ts_sa_ea
+%type <dsptype> declspecs_ts declspecs_nots
+%type <dsptype> declspecs_ts_nosa declspecs_nots_nosa
+%type <dsptype> declspecs_nosc_ts declspecs_nosc_nots declspecs_nosc declspecs
+%type <dsptype> maybe_type_quals_attrs
+%type <ttype> typespec_nonattr typespec_attr
 %type <ttype> typespec_reserved_nonattr typespec_reserved_attr
 %type <ttype> typespec_nonreserved_nonattr
 %type <ttype> offsetof_member_designator
 %type <ttype> typespec_reserved_nonattr typespec_reserved_attr
 %type <ttype> typespec_nonreserved_nonattr
 %type <ttype> offsetof_member_designator
@@ -266,8 +268,8 @@ do {                                                                        \
 @@end_ifobjc
 \f
 %{
 @@end_ifobjc
 \f
 %{
-/* List of types and structure classes of the current declaration.  */
-static GTY(()) tree current_declspecs;
+/* Declaration specifiers of the current declaration.  */
+static struct c_declspecs *current_declspecs;
 static GTY(()) tree prefix_attributes;
 
 /* List of all the attributes applying to the identifier currently being
 static GTY(()) tree prefix_attributes;
 
 /* List of all the attributes applying to the identifier currently being
@@ -275,29 +277,44 @@ static GTY(()) tree prefix_attributes;
    just after a comma.  */
 static GTY(()) tree all_prefix_attributes;
 
    just after a comma.  */
 static GTY(()) tree all_prefix_attributes;
 
+/* Structure to save declaration specifiers.  */
+struct c_declspec_stack {
+  /* Saved value of current_declspecs.  */
+  struct c_declspecs *current_declspecs;
+  /* Saved value of prefix_attributes.  */
+  tree prefix_attributes;
+  /* Saved value of all_prefix_attributes.  */
+  tree all_prefix_attributes;
+  /* Next level of stack.  */
+  struct c_declspec_stack *next;
+};
+
 /* Stack of saved values of current_declspecs, prefix_attributes and
    all_prefix_attributes.  */
 /* Stack of saved values of current_declspecs, prefix_attributes and
    all_prefix_attributes.  */
-static GTY(()) tree declspec_stack;
+static struct c_declspec_stack *declspec_stack;
 
 /* INDIRECT_REF with a TREE_TYPE of the type being queried for offsetof.  */
 static tree offsetof_base;
 
 /* PUSH_DECLSPEC_STACK is called from setspecs; POP_DECLSPEC_STACK
    should be called from the productions making use of setspecs.  */
 
 /* INDIRECT_REF with a TREE_TYPE of the type being queried for offsetof.  */
 static tree offsetof_base;
 
 /* PUSH_DECLSPEC_STACK is called from setspecs; POP_DECLSPEC_STACK
    should be called from the productions making use of setspecs.  */
-#define PUSH_DECLSPEC_STACK                                             \
-  do {                                                                  \
-    declspec_stack = tree_cons (build_tree_list (prefix_attributes,     \
-                                                all_prefix_attributes), \
-                               current_declspecs,                       \
-                               declspec_stack);                         \
+#define PUSH_DECLSPEC_STACK                                            \
+  do {                                                                 \
+    struct c_declspec_stack *t = XOBNEW (&parser_obstack,              \
+                                        struct c_declspec_stack);      \
+    t->current_declspecs = current_declspecs;                          \
+    t->prefix_attributes = prefix_attributes;                          \
+    t->all_prefix_attributes = all_prefix_attributes;                  \
+    t->next = declspec_stack;                                          \
+    declspec_stack = t;                                                        \
   } while (0)
 
 #define POP_DECLSPEC_STACK                                             \
   do {                                                                 \
   } while (0)
 
 #define POP_DECLSPEC_STACK                                             \
   do {                                                                 \
-    current_declspecs = TREE_VALUE (declspec_stack);                   \
-    prefix_attributes = TREE_PURPOSE (TREE_PURPOSE (declspec_stack));  \
-    all_prefix_attributes = TREE_VALUE (TREE_PURPOSE (declspec_stack));        \
-    declspec_stack = TREE_CHAIN (declspec_stack);                      \
+    current_declspecs = declspec_stack->current_declspecs;             \
+    prefix_attributes = declspec_stack->prefix_attributes;             \
+    all_prefix_attributes = declspec_stack->all_prefix_attributes;     \
+    declspec_stack = declspec_stack->next;                             \
   } while (0)
 
 /* For __extension__, save/restore the warning flags which are
   } while (0)
 
 /* For __extension__, save/restore the warning flags which are
@@ -363,13 +380,13 @@ program: /* empty */
 
 /* the reason for the strange actions in this rule
  is so that notype_initdecls when reached via datadef
 
 /* the reason for the strange actions in this rule
  is so that notype_initdecls when reached via datadef
- can find a valid list of type and sc specs in $0. */
+ can find valid declaration specifiers in $0. */
 
 extdefs:
 
 extdefs:
-       save_obstack_position { $<ttype>$ = NULL_TREE; } extdef
+       save_obstack_position { $<dsptype>$ = NULL; } extdef
                { obstack_free (&parser_obstack, $1); }
        | extdefs save_obstack_position
                { obstack_free (&parser_obstack, $1); }
        | extdefs save_obstack_position
-               { $<ttype>$ = NULL_TREE; ggc_collect(); } extdef
+               { $<dsptype>$ = NULL; ggc_collect(); } extdef
                { obstack_free (&parser_obstack, $2); }
        ;
 
                { obstack_free (&parser_obstack, $2); }
        ;
 
@@ -439,7 +456,7 @@ fndef:
        | declspecs_nots setspecs notype_declarator error
                { POP_DECLSPEC_STACK; }
        | setspecs notype_declarator
        | declspecs_nots setspecs notype_declarator error
                { POP_DECLSPEC_STACK; }
        | setspecs notype_declarator
-               { if (! start_function (NULL_TREE, $2,
+               { if (! start_function (current_declspecs, $2,
                                        all_prefix_attributes))
                    YYERROR1;
                }
                                        all_prefix_attributes))
                    YYERROR1;
                }
@@ -840,8 +857,17 @@ lineno_decl:
 setspecs: /* empty */
                { pending_xref_error ();
                  PUSH_DECLSPEC_STACK;
 setspecs: /* empty */
                { pending_xref_error ();
                  PUSH_DECLSPEC_STACK;
-                 split_specs_attrs ($<ttype>0,
-                                    &current_declspecs, &prefix_attributes);
+                 if ($<dsptype>0)
+                   {
+                     prefix_attributes = $<dsptype>0->attrs;
+                     $<dsptype>0->attrs = NULL_TREE;
+                     current_declspecs = $<dsptype>0;
+                   }
+                 else
+                   {
+                     prefix_attributes = NULL_TREE;
+                     current_declspecs = build_null_declspecs ();
+                   }
                  all_prefix_attributes = prefix_attributes; }
        ;
 
                  all_prefix_attributes = prefix_attributes; }
        ;
 
@@ -878,16 +904,6 @@ decl:
 
    - Attribute specifier lists (attributes).
 
 
    - Attribute specifier lists (attributes).
 
-   These are stored as a TREE_LIST; the head of the list is the last
-   item in the specifier list.  Each entry in the list has either a
-   TREE_PURPOSE that is an attribute specifier list, or a TREE_VALUE that
-   is a single other specifier or qualifier; and a TREE_CHAIN that is the
-   rest of the list.  TREE_STATIC is set on the list if something other
-   than a storage class specifier or attribute has been seen; this is used
-   to warn for the obsolescent usage of storage class specifiers other than
-   at the start of the list.  (Doing this properly would require function
-   specifiers to be handled separately from storage class specifiers.)
-
    The various cases below are classified according to:
 
    (a) Whether a storage class specifier is included or not; some
    The various cases below are classified according to:
 
    (a) Whether a storage class specifier is included or not; some
@@ -916,334 +932,208 @@ decl:
 
 /* Declspecs which contain at least one type specifier or typedef name.
    (Just `const' or `volatile' is not enough.)
 
 /* Declspecs which contain at least one type specifier or typedef name.
    (Just `const' or `volatile' is not enough.)
-   A typedef'd name following these is taken as a name to be declared.
-   Declspecs have a non-NULL TREE_VALUE, attributes do not.  */
+   A typedef'd name following these is taken as a name to be declared.  */
 
 declspecs_nosc_nots_nosa_noea:
          TYPE_QUAL
 
 declspecs_nosc_nots_nosa_noea:
          TYPE_QUAL
-               { $$ = tree_cons (NULL_TREE, $1, NULL_TREE);
-                 TREE_STATIC ($$) = 1; }
+               { $$ = declspecs_add_qual (build_null_declspecs (), $1); }
        | declspecs_nosc_nots_nosa_noea TYPE_QUAL
        | declspecs_nosc_nots_nosa_noea TYPE_QUAL
-               { $$ = tree_cons (NULL_TREE, $2, $1);
-                 TREE_STATIC ($$) = 1; }
+               { $$ = declspecs_add_qual ($1, $2); }
        | declspecs_nosc_nots_nosa_ea TYPE_QUAL
        | declspecs_nosc_nots_nosa_ea TYPE_QUAL
-               { $$ = tree_cons (NULL_TREE, $2, $1);
-                 TREE_STATIC ($$) = 1; }
+               { $$ = declspecs_add_qual ($1, $2); }
        ;
 
 declspecs_nosc_nots_nosa_ea:
          declspecs_nosc_nots_nosa_noea attributes
        ;
 
 declspecs_nosc_nots_nosa_ea:
          declspecs_nosc_nots_nosa_noea attributes
-               { $$ = tree_cons ($2, NULL_TREE, $1);
-                 TREE_STATIC ($$) = TREE_STATIC ($1); }
+               { $$ = declspecs_add_attrs ($1, $2); }
        ;
 
 declspecs_nosc_nots_sa_noea:
          declspecs_nosc_nots_sa_noea TYPE_QUAL
        ;
 
 declspecs_nosc_nots_sa_noea:
          declspecs_nosc_nots_sa_noea TYPE_QUAL
-               { $$ = tree_cons (NULL_TREE, $2, $1);
-                 TREE_STATIC ($$) = 1; }
+               { $$ = declspecs_add_qual ($1, $2); }
        | declspecs_nosc_nots_sa_ea TYPE_QUAL
        | declspecs_nosc_nots_sa_ea TYPE_QUAL
-               { $$ = tree_cons (NULL_TREE, $2, $1);
-                 TREE_STATIC ($$) = 1; }
+               { $$ = declspecs_add_qual ($1, $2); }
        ;
 
 declspecs_nosc_nots_sa_ea:
          attributes
        ;
 
 declspecs_nosc_nots_sa_ea:
          attributes
-               { $$ = tree_cons ($1, NULL_TREE, NULL_TREE);
-                 TREE_STATIC ($$) = 0; }
+               { $$ = declspecs_add_attrs (build_null_declspecs (), $1); }
        | declspecs_nosc_nots_sa_noea attributes
        | declspecs_nosc_nots_sa_noea attributes
-               { $$ = tree_cons ($2, NULL_TREE, $1);
-                 TREE_STATIC ($$) = TREE_STATIC ($1); }
+               { $$ = declspecs_add_attrs ($1, $2); }
        ;
 
 declspecs_nosc_ts_nosa_noea:
          typespec_nonattr
        ;
 
 declspecs_nosc_ts_nosa_noea:
          typespec_nonattr
-               { $$ = tree_cons (NULL_TREE, $1, NULL_TREE);
-                 TREE_STATIC ($$) = 1; }
+               { $$ = declspecs_add_type (build_null_declspecs (), $1); }
        | declspecs_nosc_ts_nosa_noea TYPE_QUAL
        | declspecs_nosc_ts_nosa_noea TYPE_QUAL
-               { $$ = tree_cons (NULL_TREE, $2, $1);
-                 TREE_STATIC ($$) = 1; }
+               { $$ = declspecs_add_qual ($1, $2); }
        | declspecs_nosc_ts_nosa_ea TYPE_QUAL
        | declspecs_nosc_ts_nosa_ea TYPE_QUAL
-               { $$ = tree_cons (NULL_TREE, $2, $1);
-                 TREE_STATIC ($$) = 1; }
+               { $$ = declspecs_add_qual ($1, $2); }
        | declspecs_nosc_ts_nosa_noea typespec_reserved_nonattr
        | declspecs_nosc_ts_nosa_noea typespec_reserved_nonattr
-               { $$ = tree_cons (NULL_TREE, $2, $1);
-                 TREE_STATIC ($$) = 1; }
+               { $$ = declspecs_add_type ($1, $2); }
        | declspecs_nosc_ts_nosa_ea typespec_reserved_nonattr
        | declspecs_nosc_ts_nosa_ea typespec_reserved_nonattr
-               { $$ = tree_cons (NULL_TREE, $2, $1);
-                 TREE_STATIC ($$) = 1; }
+               { $$ = declspecs_add_type ($1, $2); }
        | declspecs_nosc_nots_nosa_noea typespec_nonattr
        | declspecs_nosc_nots_nosa_noea typespec_nonattr
-               { $$ = tree_cons (NULL_TREE, $2, $1);
-                 TREE_STATIC ($$) = 1; }
+               { $$ = declspecs_add_type ($1, $2); }
        | declspecs_nosc_nots_nosa_ea typespec_nonattr
        | declspecs_nosc_nots_nosa_ea typespec_nonattr
-               { $$ = tree_cons (NULL_TREE, $2, $1);
-                 TREE_STATIC ($$) = 1; }
+               { $$ = declspecs_add_type ($1, $2); }
        ;
 
 declspecs_nosc_ts_nosa_ea:
          typespec_attr
        ;
 
 declspecs_nosc_ts_nosa_ea:
          typespec_attr
-               { $$ = tree_cons (NULL_TREE, $1, NULL_TREE);
-                 TREE_STATIC ($$) = 1; }
+               { $$ = declspecs_add_type (build_null_declspecs (), $1); }
        | declspecs_nosc_ts_nosa_noea attributes
        | declspecs_nosc_ts_nosa_noea attributes
-               { $$ = tree_cons ($2, NULL_TREE, $1);
-                 TREE_STATIC ($$) = TREE_STATIC ($1); }
+               { $$ = declspecs_add_attrs ($1, $2); }
        | declspecs_nosc_ts_nosa_noea typespec_reserved_attr
        | declspecs_nosc_ts_nosa_noea typespec_reserved_attr
-               { $$ = tree_cons (NULL_TREE, $2, $1);
-                 TREE_STATIC ($$) = 1; }
+               { $$ = declspecs_add_type ($1, $2); }
        | declspecs_nosc_ts_nosa_ea typespec_reserved_attr
        | declspecs_nosc_ts_nosa_ea typespec_reserved_attr
-               { $$ = tree_cons (NULL_TREE, $2, $1);
-                 TREE_STATIC ($$) = 1; }
+               { $$ = declspecs_add_type ($1, $2); }
        | declspecs_nosc_nots_nosa_noea typespec_attr
        | declspecs_nosc_nots_nosa_noea typespec_attr
-               { $$ = tree_cons (NULL_TREE, $2, $1);
-                 TREE_STATIC ($$) = 1; }
+               { $$ = declspecs_add_type ($1, $2); }
        | declspecs_nosc_nots_nosa_ea typespec_attr
        | declspecs_nosc_nots_nosa_ea typespec_attr
-               { $$ = tree_cons (NULL_TREE, $2, $1);
-                 TREE_STATIC ($$) = 1; }
+               { $$ = declspecs_add_type ($1, $2); }
        ;
 
 declspecs_nosc_ts_sa_noea:
          declspecs_nosc_ts_sa_noea TYPE_QUAL
        ;
 
 declspecs_nosc_ts_sa_noea:
          declspecs_nosc_ts_sa_noea TYPE_QUAL
-               { $$ = tree_cons (NULL_TREE, $2, $1);
-                 TREE_STATIC ($$) = 1; }
+               { $$ = declspecs_add_qual ($1, $2); }
        | declspecs_nosc_ts_sa_ea TYPE_QUAL
        | declspecs_nosc_ts_sa_ea TYPE_QUAL
-               { $$ = tree_cons (NULL_TREE, $2, $1);
-                 TREE_STATIC ($$) = 1; }
+               { $$ = declspecs_add_qual ($1, $2); }
        | declspecs_nosc_ts_sa_noea typespec_reserved_nonattr
        | declspecs_nosc_ts_sa_noea typespec_reserved_nonattr
-               { $$ = tree_cons (NULL_TREE, $2, $1);
-                 TREE_STATIC ($$) = 1; }
+               { $$ = declspecs_add_type ($1, $2); }
        | declspecs_nosc_ts_sa_ea typespec_reserved_nonattr
        | declspecs_nosc_ts_sa_ea typespec_reserved_nonattr
-               { $$ = tree_cons (NULL_TREE, $2, $1);
-                 TREE_STATIC ($$) = 1; }
+               { $$ = declspecs_add_type ($1, $2); }
        | declspecs_nosc_nots_sa_noea typespec_nonattr
        | declspecs_nosc_nots_sa_noea typespec_nonattr
-               { $$ = tree_cons (NULL_TREE, $2, $1);
-                 TREE_STATIC ($$) = 1; }
+               { $$ = declspecs_add_type ($1, $2); }
        | declspecs_nosc_nots_sa_ea typespec_nonattr
        | declspecs_nosc_nots_sa_ea typespec_nonattr
-               { $$ = tree_cons (NULL_TREE, $2, $1);
-                 TREE_STATIC ($$) = 1; }
+               { $$ = declspecs_add_type ($1, $2); }
        ;
 
 declspecs_nosc_ts_sa_ea:
          declspecs_nosc_ts_sa_noea attributes
        ;
 
 declspecs_nosc_ts_sa_ea:
          declspecs_nosc_ts_sa_noea attributes
-               { $$ = tree_cons ($2, NULL_TREE, $1);
-                 TREE_STATIC ($$) = TREE_STATIC ($1); }
+               { $$ = declspecs_add_attrs ($1, $2); }
        | declspecs_nosc_ts_sa_noea typespec_reserved_attr
        | declspecs_nosc_ts_sa_noea typespec_reserved_attr
-               { $$ = tree_cons (NULL_TREE, $2, $1);
-                 TREE_STATIC ($$) = 1; }
+               { $$ = declspecs_add_type ($1, $2); }
        | declspecs_nosc_ts_sa_ea typespec_reserved_attr
        | declspecs_nosc_ts_sa_ea typespec_reserved_attr
-               { $$ = tree_cons (NULL_TREE, $2, $1);
-                 TREE_STATIC ($$) = 1; }
+               { $$ = declspecs_add_type ($1, $2); }
        | declspecs_nosc_nots_sa_noea typespec_attr
        | declspecs_nosc_nots_sa_noea typespec_attr
-               { $$ = tree_cons (NULL_TREE, $2, $1);
-                 TREE_STATIC ($$) = 1; }
+               { $$ = declspecs_add_type ($1, $2); }
        | declspecs_nosc_nots_sa_ea typespec_attr
        | declspecs_nosc_nots_sa_ea typespec_attr
-               { $$ = tree_cons (NULL_TREE, $2, $1);
-                 TREE_STATIC ($$) = 1; }
+               { $$ = declspecs_add_type ($1, $2); }
        ;
 
 declspecs_sc_nots_nosa_noea:
          scspec
        ;
 
 declspecs_sc_nots_nosa_noea:
          scspec
-               { $$ = tree_cons (NULL_TREE, $1, NULL_TREE);
-                 TREE_STATIC ($$) = 0; }
+               { $$ = declspecs_add_scspec (build_null_declspecs (), $1); }
        | declspecs_sc_nots_nosa_noea TYPE_QUAL
        | declspecs_sc_nots_nosa_noea TYPE_QUAL
-               { $$ = tree_cons (NULL_TREE, $2, $1);
-                 TREE_STATIC ($$) = 1; }
+               { $$ = declspecs_add_qual ($1, $2); }
        | declspecs_sc_nots_nosa_ea TYPE_QUAL
        | declspecs_sc_nots_nosa_ea TYPE_QUAL
-               { $$ = tree_cons (NULL_TREE, $2, $1);
-                 TREE_STATIC ($$) = 1; }
+               { $$ = declspecs_add_qual ($1, $2); }
        | declspecs_nosc_nots_nosa_noea scspec
        | declspecs_nosc_nots_nosa_noea scspec
-               { if (extra_warnings && TREE_STATIC ($1))
-                   warning ("`%s' is not at beginning of declaration",
-                            IDENTIFIER_POINTER ($2));
-                 $$ = tree_cons (NULL_TREE, $2, $1);
-                 TREE_STATIC ($$) = TREE_STATIC ($1); }
+               { $$ = declspecs_add_scspec ($1, $2); }
        | declspecs_nosc_nots_nosa_ea scspec
        | declspecs_nosc_nots_nosa_ea scspec
-               { if (extra_warnings && TREE_STATIC ($1))
-                   warning ("`%s' is not at beginning of declaration",
-                            IDENTIFIER_POINTER ($2));
-                 $$ = tree_cons (NULL_TREE, $2, $1);
-                 TREE_STATIC ($$) = TREE_STATIC ($1); }
+               { $$ = declspecs_add_scspec ($1, $2); }
        | declspecs_sc_nots_nosa_noea scspec
        | declspecs_sc_nots_nosa_noea scspec
-               { if (extra_warnings && TREE_STATIC ($1))
-                   warning ("`%s' is not at beginning of declaration",
-                            IDENTIFIER_POINTER ($2));
-                 $$ = tree_cons (NULL_TREE, $2, $1);
-                 TREE_STATIC ($$) = TREE_STATIC ($1); }
+               { $$ = declspecs_add_scspec ($1, $2); }
        | declspecs_sc_nots_nosa_ea scspec
        | declspecs_sc_nots_nosa_ea scspec
-               { if (extra_warnings && TREE_STATIC ($1))
-                   warning ("`%s' is not at beginning of declaration",
-                            IDENTIFIER_POINTER ($2));
-                 $$ = tree_cons (NULL_TREE, $2, $1);
-                 TREE_STATIC ($$) = TREE_STATIC ($1); }
+               { $$ = declspecs_add_scspec ($1, $2); }
        ;
 
 declspecs_sc_nots_nosa_ea:
          declspecs_sc_nots_nosa_noea attributes
        ;
 
 declspecs_sc_nots_nosa_ea:
          declspecs_sc_nots_nosa_noea attributes
-               { $$ = tree_cons ($2, NULL_TREE, $1);
-                 TREE_STATIC ($$) = TREE_STATIC ($1); }
+               { $$ = declspecs_add_attrs ($1, $2); }
        ;
 
 declspecs_sc_nots_sa_noea:
          declspecs_sc_nots_sa_noea TYPE_QUAL
        ;
 
 declspecs_sc_nots_sa_noea:
          declspecs_sc_nots_sa_noea TYPE_QUAL
-               { $$ = tree_cons (NULL_TREE, $2, $1);
-                 TREE_STATIC ($$) = 1; }
+               { $$ = declspecs_add_qual ($1, $2); }
        | declspecs_sc_nots_sa_ea TYPE_QUAL
        | declspecs_sc_nots_sa_ea TYPE_QUAL
-               { $$ = tree_cons (NULL_TREE, $2, $1);
-                 TREE_STATIC ($$) = 1; }
+               { $$ = declspecs_add_qual ($1, $2); }
        | declspecs_nosc_nots_sa_noea scspec
        | declspecs_nosc_nots_sa_noea scspec
-               { if (extra_warnings && TREE_STATIC ($1))
-                   warning ("`%s' is not at beginning of declaration",
-                            IDENTIFIER_POINTER ($2));
-                 $$ = tree_cons (NULL_TREE, $2, $1);
-                 TREE_STATIC ($$) = TREE_STATIC ($1); }
+               { $$ = declspecs_add_scspec ($1, $2); }
        | declspecs_nosc_nots_sa_ea scspec
        | declspecs_nosc_nots_sa_ea scspec
-               { if (extra_warnings && TREE_STATIC ($1))
-                   warning ("`%s' is not at beginning of declaration",
-                            IDENTIFIER_POINTER ($2));
-                 $$ = tree_cons (NULL_TREE, $2, $1);
-                 TREE_STATIC ($$) = TREE_STATIC ($1); }
+               { $$ = declspecs_add_scspec ($1, $2); }
        | declspecs_sc_nots_sa_noea scspec
        | declspecs_sc_nots_sa_noea scspec
-               { if (extra_warnings && TREE_STATIC ($1))
-                   warning ("`%s' is not at beginning of declaration",
-                            IDENTIFIER_POINTER ($2));
-                 $$ = tree_cons (NULL_TREE, $2, $1);
-                 TREE_STATIC ($$) = TREE_STATIC ($1); }
+               { $$ = declspecs_add_scspec ($1, $2); }
        | declspecs_sc_nots_sa_ea scspec
        | declspecs_sc_nots_sa_ea scspec
-               { if (extra_warnings && TREE_STATIC ($1))
-                   warning ("`%s' is not at beginning of declaration",
-                            IDENTIFIER_POINTER ($2));
-                 $$ = tree_cons (NULL_TREE, $2, $1);
-                 TREE_STATIC ($$) = TREE_STATIC ($1); }
+               { $$ = declspecs_add_scspec ($1, $2); }
        ;
 
 declspecs_sc_nots_sa_ea:
          declspecs_sc_nots_sa_noea attributes
        ;
 
 declspecs_sc_nots_sa_ea:
          declspecs_sc_nots_sa_noea attributes
-               { $$ = tree_cons ($2, NULL_TREE, $1);
-                 TREE_STATIC ($$) = TREE_STATIC ($1); }
+               { $$ = declspecs_add_attrs ($1, $2); }
        ;
 
 declspecs_sc_ts_nosa_noea:
          declspecs_sc_ts_nosa_noea TYPE_QUAL
        ;
 
 declspecs_sc_ts_nosa_noea:
          declspecs_sc_ts_nosa_noea TYPE_QUAL
-               { $$ = tree_cons (NULL_TREE, $2, $1);
-                 TREE_STATIC ($$) = 1; }
+               { $$ = declspecs_add_qual ($1, $2); }
        | declspecs_sc_ts_nosa_ea TYPE_QUAL
        | declspecs_sc_ts_nosa_ea TYPE_QUAL
-               { $$ = tree_cons (NULL_TREE, $2, $1);
-                 TREE_STATIC ($$) = 1; }
+               { $$ = declspecs_add_qual ($1, $2); }
        | declspecs_sc_ts_nosa_noea typespec_reserved_nonattr
        | declspecs_sc_ts_nosa_noea typespec_reserved_nonattr
-               { $$ = tree_cons (NULL_TREE, $2, $1);
-                 TREE_STATIC ($$) = 1; }
+               { $$ = declspecs_add_type ($1, $2); }
        | declspecs_sc_ts_nosa_ea typespec_reserved_nonattr
        | declspecs_sc_ts_nosa_ea typespec_reserved_nonattr
-               { $$ = tree_cons (NULL_TREE, $2, $1);
-                 TREE_STATIC ($$) = 1; }
+               { $$ = declspecs_add_type ($1, $2); }
        | declspecs_sc_nots_nosa_noea typespec_nonattr
        | declspecs_sc_nots_nosa_noea typespec_nonattr
-               { $$ = tree_cons (NULL_TREE, $2, $1);
-                 TREE_STATIC ($$) = 1; }
+               { $$ = declspecs_add_type ($1, $2); }
        | declspecs_sc_nots_nosa_ea typespec_nonattr
        | declspecs_sc_nots_nosa_ea typespec_nonattr
-               { $$ = tree_cons (NULL_TREE, $2, $1);
-                 TREE_STATIC ($$) = 1; }
+               { $$ = declspecs_add_type ($1, $2); }
        | declspecs_nosc_ts_nosa_noea scspec
        | declspecs_nosc_ts_nosa_noea scspec
-               { if (extra_warnings && TREE_STATIC ($1))
-                   warning ("`%s' is not at beginning of declaration",
-                            IDENTIFIER_POINTER ($2));
-                 $$ = tree_cons (NULL_TREE, $2, $1);
-                 TREE_STATIC ($$) = TREE_STATIC ($1); }
+               { $$ = declspecs_add_scspec ($1, $2); }
        | declspecs_nosc_ts_nosa_ea scspec
        | declspecs_nosc_ts_nosa_ea scspec
-               { if (extra_warnings && TREE_STATIC ($1))
-                   warning ("`%s' is not at beginning of declaration",
-                            IDENTIFIER_POINTER ($2));
-                 $$ = tree_cons (NULL_TREE, $2, $1);
-                 TREE_STATIC ($$) = TREE_STATIC ($1); }
+               { $$ = declspecs_add_scspec ($1, $2); }
        | declspecs_sc_ts_nosa_noea scspec
        | declspecs_sc_ts_nosa_noea scspec
-               { if (extra_warnings && TREE_STATIC ($1))
-                   warning ("`%s' is not at beginning of declaration",
-                            IDENTIFIER_POINTER ($2));
-                 $$ = tree_cons (NULL_TREE, $2, $1);
-                 TREE_STATIC ($$) = TREE_STATIC ($1); }
+               { $$ = declspecs_add_scspec ($1, $2); }
        | declspecs_sc_ts_nosa_ea scspec
        | declspecs_sc_ts_nosa_ea scspec
-               { if (extra_warnings && TREE_STATIC ($1))
-                   warning ("`%s' is not at beginning of declaration",
-                            IDENTIFIER_POINTER ($2));
-                 $$ = tree_cons (NULL_TREE, $2, $1);
-                 TREE_STATIC ($$) = TREE_STATIC ($1); }
+               { $$ = declspecs_add_scspec ($1, $2); }
        ;
 
 declspecs_sc_ts_nosa_ea:
          declspecs_sc_ts_nosa_noea attributes
        ;
 
 declspecs_sc_ts_nosa_ea:
          declspecs_sc_ts_nosa_noea attributes
-               { $$ = tree_cons ($2, NULL_TREE, $1);
-                 TREE_STATIC ($$) = TREE_STATIC ($1); }
+               { $$ = declspecs_add_attrs ($1, $2); }
        | declspecs_sc_ts_nosa_noea typespec_reserved_attr
        | declspecs_sc_ts_nosa_noea typespec_reserved_attr
-               { $$ = tree_cons (NULL_TREE, $2, $1);
-                 TREE_STATIC ($$) = 1; }
+               { $$ = declspecs_add_type ($1, $2); }
        | declspecs_sc_ts_nosa_ea typespec_reserved_attr
        | declspecs_sc_ts_nosa_ea typespec_reserved_attr
-               { $$ = tree_cons (NULL_TREE, $2, $1);
-                 TREE_STATIC ($$) = 1; }
+               { $$ = declspecs_add_type ($1, $2); }
        | declspecs_sc_nots_nosa_noea typespec_attr
        | declspecs_sc_nots_nosa_noea typespec_attr
-               { $$ = tree_cons (NULL_TREE, $2, $1);
-                 TREE_STATIC ($$) = 1; }
+               { $$ = declspecs_add_type ($1, $2); }
        | declspecs_sc_nots_nosa_ea typespec_attr
        | declspecs_sc_nots_nosa_ea typespec_attr
-               { $$ = tree_cons (NULL_TREE, $2, $1);
-                 TREE_STATIC ($$) = 1; }
+               { $$ = declspecs_add_type ($1, $2); }
        ;
 
 declspecs_sc_ts_sa_noea:
          declspecs_sc_ts_sa_noea TYPE_QUAL
        ;
 
 declspecs_sc_ts_sa_noea:
          declspecs_sc_ts_sa_noea TYPE_QUAL
-               { $$ = tree_cons (NULL_TREE, $2, $1);
-                 TREE_STATIC ($$) = 1; }
+               { $$ = declspecs_add_qual ($1, $2); }
        | declspecs_sc_ts_sa_ea TYPE_QUAL
        | declspecs_sc_ts_sa_ea TYPE_QUAL
-               { $$ = tree_cons (NULL_TREE, $2, $1);
-                 TREE_STATIC ($$) = 1; }
+               { $$ = declspecs_add_qual ($1, $2); }
        | declspecs_sc_ts_sa_noea typespec_reserved_nonattr
        | declspecs_sc_ts_sa_noea typespec_reserved_nonattr
-               { $$ = tree_cons (NULL_TREE, $2, $1);
-                 TREE_STATIC ($$) = 1; }
+               { $$ = declspecs_add_type ($1, $2); }
        | declspecs_sc_ts_sa_ea typespec_reserved_nonattr
        | declspecs_sc_ts_sa_ea typespec_reserved_nonattr
-               { $$ = tree_cons (NULL_TREE, $2, $1);
-                 TREE_STATIC ($$) = 1; }
+               { $$ = declspecs_add_type ($1, $2); }
        | declspecs_sc_nots_sa_noea typespec_nonattr
        | declspecs_sc_nots_sa_noea typespec_nonattr
-               { $$ = tree_cons (NULL_TREE, $2, $1);
-                 TREE_STATIC ($$) = 1; }
+               { $$ = declspecs_add_type ($1, $2); }
        | declspecs_sc_nots_sa_ea typespec_nonattr
        | declspecs_sc_nots_sa_ea typespec_nonattr
-               { $$ = tree_cons (NULL_TREE, $2, $1);
-                 TREE_STATIC ($$) = 1; }
+               { $$ = declspecs_add_type ($1, $2); }
        | declspecs_nosc_ts_sa_noea scspec
        | declspecs_nosc_ts_sa_noea scspec
-               { if (extra_warnings && TREE_STATIC ($1))
-                   warning ("`%s' is not at beginning of declaration",
-                            IDENTIFIER_POINTER ($2));
-                 $$ = tree_cons (NULL_TREE, $2, $1);
-                 TREE_STATIC ($$) = TREE_STATIC ($1); }
+               { $$ = declspecs_add_scspec ($1, $2); }
        | declspecs_nosc_ts_sa_ea scspec
        | declspecs_nosc_ts_sa_ea scspec
-               { if (extra_warnings && TREE_STATIC ($1))
-                   warning ("`%s' is not at beginning of declaration",
-                            IDENTIFIER_POINTER ($2));
-                 $$ = tree_cons (NULL_TREE, $2, $1);
-                 TREE_STATIC ($$) = TREE_STATIC ($1); }
+               { $$ = declspecs_add_scspec ($1, $2); }
        | declspecs_sc_ts_sa_noea scspec
        | declspecs_sc_ts_sa_noea scspec
-               { if (extra_warnings && TREE_STATIC ($1))
-                   warning ("`%s' is not at beginning of declaration",
-                            IDENTIFIER_POINTER ($2));
-                 $$ = tree_cons (NULL_TREE, $2, $1);
-                 TREE_STATIC ($$) = TREE_STATIC ($1); }
+               { $$ = declspecs_add_scspec ($1, $2); }
        | declspecs_sc_ts_sa_ea scspec
        | declspecs_sc_ts_sa_ea scspec
-               { if (extra_warnings && TREE_STATIC ($1))
-                   warning ("`%s' is not at beginning of declaration",
-                            IDENTIFIER_POINTER ($2));
-                 $$ = tree_cons (NULL_TREE, $2, $1);
-                 TREE_STATIC ($$) = TREE_STATIC ($1); }
+               { $$ = declspecs_add_scspec ($1, $2); }
        ;
 
 declspecs_sc_ts_sa_ea:
          declspecs_sc_ts_sa_noea attributes
        ;
 
 declspecs_sc_ts_sa_ea:
          declspecs_sc_ts_sa_noea attributes
-               { $$ = tree_cons ($2, NULL_TREE, $1);
-                 TREE_STATIC ($$) = TREE_STATIC ($1); }
+               { $$ = declspecs_add_attrs ($1, $2); }
        | declspecs_sc_ts_sa_noea typespec_reserved_attr
        | declspecs_sc_ts_sa_noea typespec_reserved_attr
-               { $$ = tree_cons (NULL_TREE, $2, $1);
-                 TREE_STATIC ($$) = 1; }
+               { $$ = declspecs_add_type ($1, $2); }
        | declspecs_sc_ts_sa_ea typespec_reserved_attr
        | declspecs_sc_ts_sa_ea typespec_reserved_attr
-               { $$ = tree_cons (NULL_TREE, $2, $1);
-                 TREE_STATIC ($$) = 1; }
+               { $$ = declspecs_add_type ($1, $2); }
        | declspecs_sc_nots_sa_noea typespec_attr
        | declspecs_sc_nots_sa_noea typespec_attr
-               { $$ = tree_cons (NULL_TREE, $2, $1);
-                 TREE_STATIC ($$) = 1; }
+               { $$ = declspecs_add_type ($1, $2); }
        | declspecs_sc_nots_sa_ea typespec_attr
        | declspecs_sc_nots_sa_ea typespec_attr
-               { $$ = tree_cons (NULL_TREE, $2, $1);
-                 TREE_STATIC ($$) = 1; }
+               { $$ = declspecs_add_type ($1, $2); }
        ;
 
 /* Particular useful classes of declspecs.  */
        ;
 
 /* Particular useful classes of declspecs.  */
@@ -1330,7 +1220,7 @@ declspecs:
 /* A (possibly empty) sequence of type qualifiers and attributes.  */
 maybe_type_quals_attrs:
          /* empty */
 /* A (possibly empty) sequence of type qualifiers and attributes.  */
 maybe_type_quals_attrs:
          /* empty */
-               { $$ = NULL_TREE; }
+               { $$ = NULL; }
        | declspecs_nosc_nots
                { $$ = $1; }
        ;
        | declspecs_nosc_nots
                { $$ = $1; }
        ;
@@ -1354,7 +1244,7 @@ maybe_type_quals_attrs:
    or are such that any following attributes would
    be parsed as part of the specifier.
 
    or are such that any following attributes would
    be parsed as part of the specifier.
 
-   _nonattr: specifiers.  */
+   _nonattr: other specifiers not ending with attributes.  */
 
 typespec_nonattr:
          typespec_reserved_nonattr
 
 typespec_nonattr:
          typespec_reserved_nonattr
@@ -1933,10 +1823,10 @@ enumerator:
 typename:
          declspecs_nosc
                { pending_xref_error ();
 typename:
          declspecs_nosc
                { pending_xref_error ();
-                 $<ttype>$ = $1; }
+                 $<dsptype>$ = $1; }
          absdcl
                { $$ = XOBNEW (&parser_obstack, struct c_type_name);
          absdcl
                { $$ = XOBNEW (&parser_obstack, struct c_type_name);
-                 $$->specs = $<ttype>2;
+                 $$->specs = $<dsptype>2;
                  $$->declarator = $3; }
        ;
 
                  $$->declarator = $3; }
        ;
 
index 09f679e..3707551 100644 (file)
@@ -131,6 +131,38 @@ struct c_expr
   enum tree_code original_code;
 };
 
   enum tree_code original_code;
 };
 
+/* A sequence of declaration specifiers in C.  */
+struct c_declspecs {
+  /* The type specified, not reflecting modifiers such as "short" and
+     "unsigned", or NULL_TREE if none.  */
+  tree type;
+  /* If the type was specified with a typedef, that typedef decl.  */
+  tree typedef_decl;
+  /* The attributes from a typedef decl.  */
+  tree decl_attr;
+  /* When parsing, the attributes.  Outside the parser, this will be
+     NULL; attributes (possibly from multiple lists) will be passed
+     separately.  */
+  tree attrs;
+  /* The modifier bits present.  */
+  int specbits;
+  /* Whether something other than a storage class specifier or
+     attribute has been seen.  This is used to warn for the
+     obsolescent usage of storage class specifiers other than at the
+     start of the list.  (Doing this properly would require function
+     specifiers to be handled separately from storage class
+     specifiers.)  */
+  BOOL_BITFIELD non_sc_seen_p : 1;
+  /* Whether the specifiers include a deprecated typedef.  */
+  BOOL_BITFIELD deprecated_p : 1;
+  /* Whether "int" was explicitly specified.  */
+  BOOL_BITFIELD explicit_int_p : 1;
+  /* Whether "char" was explicitly specified.  */
+  BOOL_BITFIELD explicit_char_p : 1;
+  /* Whether "long" was specified more than once.  */
+  BOOL_BITFIELD long_long_p : 1;
+};
+
 /* The various kinds of declarators in C.  */
 enum c_declarator_kind {
   /* An identifier.  */
 /* The various kinds of declarators in C.  */
 enum c_declarator_kind {
   /* An identifier.  */
@@ -175,14 +207,14 @@ struct c_declarator {
       /* The array dimension, or NULL for [] and [*].  */
       tree dimen;
       /* The qualifiers (and attributes, currently ignored) inside [].  */
       /* The array dimension, or NULL for [] and [*].  */
       tree dimen;
       /* The qualifiers (and attributes, currently ignored) inside [].  */
-      tree quals;
+      struct c_declspecs *quals;
       /* Whether [static] was used.  */
       BOOL_BITFIELD static_p : 1;
       /* Whether [*] was used.  */
       BOOL_BITFIELD vla_unspec_p : 1;
     } array;
     /* For pointers, the qualifiers on the pointer type.  */
       /* Whether [static] was used.  */
       BOOL_BITFIELD static_p : 1;
       /* Whether [*] was used.  */
       BOOL_BITFIELD vla_unspec_p : 1;
     } array;
     /* For pointers, the qualifiers on the pointer type.  */
-    tree pointer_quals;
+    struct c_declspecs *pointer_quals;
     /* For attributes.  */
     tree attrs;
   } u;
     /* For attributes.  */
     tree attrs;
   } u;
@@ -191,7 +223,7 @@ struct c_declarator {
 /* A type name.  */
 struct c_type_name {
   /* The declaration specifiers.  */
 /* A type name.  */
 struct c_type_name {
   /* The declaration specifiers.  */
-  tree specs;
+  struct c_declspecs *specs;
   /* The declarator.  */
   struct c_declarator *declarator;
 };
   /* The declarator.  */
   struct c_declarator *declarator;
 };
@@ -199,7 +231,7 @@ struct c_type_name {
 /* A parameter.  */
 struct c_parm {
   /* The declaration specifiers, minus any prefix attributes.  */
 /* A parameter.  */
 struct c_parm {
   /* The declaration specifiers, minus any prefix attributes.  */
-  tree specs;
+  struct c_declspecs *specs;
   /* The attributes.  */
   tree attrs;
   /* The declarator.  */
   /* The attributes.  */
   tree attrs;
   /* The declarator.  */
@@ -246,7 +278,8 @@ extern void c_expand_body (tree);
 extern void c_init_decl_processing (void);
 extern void c_dup_lang_specific_decl (tree);
 extern void c_print_identifier (FILE *, tree, int);
 extern void c_init_decl_processing (void);
 extern void c_dup_lang_specific_decl (tree);
 extern void c_print_identifier (FILE *, tree, int);
-extern struct c_declarator *build_array_declarator (tree, tree, bool, bool);
+extern struct c_declarator *build_array_declarator (tree, struct c_declspecs *,
+                                                   bool, bool);
 extern tree build_enumerator (tree, tree);
 extern void check_for_loop_decls (void);
 extern void mark_forward_parm_decls (void);
 extern tree build_enumerator (tree, tree);
 extern void check_for_loop_decls (void);
 extern void mark_forward_parm_decls (void);
@@ -260,8 +293,7 @@ extern tree finish_enum (tree, tree, tree);
 extern void finish_function (void);
 extern tree finish_struct (tree, tree, tree);
 extern struct c_arg_info *get_parm_info (bool);
 extern void finish_function (void);
 extern tree finish_struct (tree, tree, tree);
 extern struct c_arg_info *get_parm_info (bool);
-extern tree grokfield (struct c_declarator *, tree, tree);
-extern void split_specs_attrs (tree, tree *, tree *);
+extern tree grokfield (struct c_declarator *, struct c_declspecs *, tree);
 extern tree groktypename (struct c_type_name *);
 extern tree grokparm (const struct c_parm *);
 extern tree implicitly_declare (tree);
 extern tree groktypename (struct c_type_name *);
 extern tree grokparm (const struct c_parm *);
 extern tree implicitly_declare (tree);
@@ -277,24 +309,31 @@ extern struct c_declarator *set_array_declarator_inner (struct c_declarator *,
                                                        bool);
 extern tree builtin_function (const char *, tree, int, enum built_in_class,
                              const char *, tree);
                                                        bool);
 extern tree builtin_function (const char *, tree, int, enum built_in_class,
                              const char *, tree);
-extern void shadow_tag (tree);
-extern void shadow_tag_warned (tree, int);
+extern void shadow_tag (const struct c_declspecs *);
+extern void shadow_tag_warned (const struct c_declspecs *, int);
 extern tree start_enum (tree);
 extern tree start_enum (tree);
-extern int  start_function (tree, struct c_declarator *, tree);
-extern tree start_decl (struct c_declarator *, tree, bool, tree);
+extern int  start_function (struct c_declspecs *, struct c_declarator *, tree);
+extern tree start_decl (struct c_declarator *, struct c_declspecs *, bool,
+                       tree);
 extern tree start_struct (enum tree_code, tree);
 extern void store_parm_decls (void);
 extern void store_parm_decls_from (struct c_arg_info *);
 extern tree xref_tag (enum tree_code, tree);
 extern int c_expand_decl (tree);
 extern tree start_struct (enum tree_code, tree);
 extern void store_parm_decls (void);
 extern void store_parm_decls_from (struct c_arg_info *);
 extern tree xref_tag (enum tree_code, tree);
 extern int c_expand_decl (tree);
-extern struct c_parm *build_c_parm (tree, tree, struct c_declarator *);
+extern struct c_parm *build_c_parm (struct c_declspecs *, tree,
+                                   struct c_declarator *);
 extern struct c_declarator *build_attrs_declarator (tree,
                                                    struct c_declarator *);
 extern struct c_declarator *build_function_declarator (struct c_arg_info *,
                                                       struct c_declarator *);
 extern struct c_declarator *build_id_declarator (tree);
 extern struct c_declarator *build_attrs_declarator (tree,
                                                    struct c_declarator *);
 extern struct c_declarator *build_function_declarator (struct c_arg_info *,
                                                       struct c_declarator *);
 extern struct c_declarator *build_id_declarator (tree);
-extern struct c_declarator *make_pointer_declarator (tree,
+extern struct c_declarator *make_pointer_declarator (struct c_declspecs *,
                                                     struct c_declarator *);
                                                     struct c_declarator *);
+extern struct c_declspecs *build_null_declspecs (void);
+extern struct c_declspecs *declspecs_add_qual (struct c_declspecs *, tree);
+extern struct c_declspecs *declspecs_add_type (struct c_declspecs *, tree);
+extern struct c_declspecs *declspecs_add_scspec (struct c_declspecs *, tree);
+extern struct c_declspecs *declspecs_add_attrs (struct c_declspecs *, tree);
 
 /* in c-objc-common.c */
 extern int c_disregard_inline_limits (tree);
 
 /* in c-objc-common.c */
 extern int c_disregard_inline_limits (tree);
index 2a2a325..73a76d0 100644 (file)
@@ -1,5 +1,14 @@
 2004-09-09  Joseph S. Myers  <jsm@polyomino.org.uk>
 
 2004-09-09  Joseph S. Myers  <jsm@polyomino.org.uk>
 
+       PR c/8420
+       * gcc.dg/anon-struct-4.c, gcc.dg/declspec-1.c,
+       gcc.dg/declspec-2.c, gcc.dg/declspec-3.c, gcc.dg/declspec-4.c,
+       gcc.dg/declspec-5.c, gcc.dg/declspec-6.c,
+       gcc.dg/long-long-typespec-1.c: New tests.
+       * gcc.dg/tls/diag-2.c: Update expected diagnostics
+
+2004-09-09  Joseph S. Myers  <jsm@polyomino.org.uk>
+
        * gcc.dg/c90-static-1.c, gcc.dg/c99-static-1.c,
        gcc.dg/gnu99-static-1.c: New tests.
 
        * gcc.dg/c90-static-1.c, gcc.dg/c99-static-1.c,
        gcc.dg/gnu99-static-1.c: New tests.
 
diff --git a/gcc/testsuite/gcc.dg/anon-struct-4.c b/gcc/testsuite/gcc.dg/anon-struct-4.c
new file mode 100644 (file)
index 0000000..dc30b0c
--- /dev/null
@@ -0,0 +1,10 @@
+/* Test anonymous structures with type qualifiers.  Bug 8420.  */
+/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=gnu89" } */
+
+struct s {
+  struct { int a; };
+  const struct { int b; };
+  struct { int c; } volatile;
+};
diff --git a/gcc/testsuite/gcc.dg/declspec-1.c b/gcc/testsuite/gcc.dg/declspec-1.c
new file mode 100644 (file)
index 0000000..c19f107
--- /dev/null
@@ -0,0 +1,27 @@
+/* Test declaration specifiers.  Test cases that used to be handled in
+   a loop in grokdeclarator.  */
+/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=gnu89" } */
+
+typedef int t;
+
+/* These should all be diagnosed, but only once, not for every
+   identifier declared.  */
+struct s0 int x0, /* { dg-error "two or more data types" } */
+x1;
+
+char union u0 x2, /* { dg-error "two or more data types" } */
+x3;
+
+enum e0 struct s1 x4, /* { dg-error "two or more data types" } */
+x5;
+
+short short x6, /* { dg-error "duplicate" } */
+x7;
+
+t int x8, /* { dg-error "two or more data types" } */
+x9;
+
+long long long x10, /* { dg-error "long long long" } */
+x11;
diff --git a/gcc/testsuite/gcc.dg/declspec-2.c b/gcc/testsuite/gcc.dg/declspec-2.c
new file mode 100644 (file)
index 0000000..f2c535a
--- /dev/null
@@ -0,0 +1,14 @@
+/* Test declaration specifiers.  Test cases that used to be handled in
+   a loop in grokdeclarator.  Pedantic cases.  */
+/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=gnu89 -pedantic" } */
+
+/* These should all be diagnosed, but only once, not for every
+   identifier declared.  */
+
+const const int x0, /* { dg-warning "duplicate" } */
+x1;
+
+long long x2, /* { dg-warning "long long" } */
+x3;
diff --git a/gcc/testsuite/gcc.dg/declspec-3.c b/gcc/testsuite/gcc.dg/declspec-3.c
new file mode 100644 (file)
index 0000000..19b1fa2
--- /dev/null
@@ -0,0 +1,34 @@
+/* Test declaration specifiers.  Test diagnosis of storage class
+   specifiers not at start.  */
+/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
+/* { dg-do compile } */
+/* { dg-options "-W" } */
+
+static int x0;
+int static x1; /* { dg-warning "not at beginning" } */
+
+extern int x2;
+int extern x3; /* { dg-warning "not at beginning" } */
+
+typedef int x4;
+int typedef x5; /* { dg-warning "not at beginning" } */
+
+void g (int);
+
+void
+f (void)
+{
+  auto int x6 = 0;
+  int auto x7 = 0; /* { dg-warning "not at beginning" } */
+  register int x8 = 0;
+  int register x9 = 0; /* { dg-warning "not at beginning" } */
+  g (x6 + x7 + x8 + x9);
+}
+
+const static int x10; /* { dg-warning "not at beginning" } */
+
+/* Attributes are OK before storage class specifiers, since some
+   attributes are like such specifiers themselves.  */
+
+__attribute__((format(printf, 1, 2))) static void h (const char *, ...);
+__attribute__((format(printf, 1, 2))) void static i (const char *, ...); /* { dg-warning "not at beginning" } */
diff --git a/gcc/testsuite/gcc.dg/declspec-4.c b/gcc/testsuite/gcc.dg/declspec-4.c
new file mode 100644 (file)
index 0000000..0610e05
--- /dev/null
@@ -0,0 +1,41 @@
+/* Test declaration specifiers.  Test empty declarations.  Test with
+   no special options.  */
+/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+/* If a declaration does not declare a declarator, it must declare a
+   tag or the members of an enumeration, and must only contain one
+   type specifier.  */
+
+typedef int T;
+
+struct s0;
+union u0;
+enum e0; /* A GNU extension.  */
+enum { E0 };
+enum e1 { E1 };
+
+/* Not declaring anything (pedwarns).  */
+struct { int a; }; /* { dg-warning "warning: unnamed struct/union that defines no instances" } */
+int; /* { dg-warning "warning: useless type name in empty declaration" } */
+long; /* { dg-warning "warning: useless keyword or type name in empty declaration" } */
+/* { dg-warning "warning: empty declaration" "long" { target *-*-* } 22 } */
+T; /* { dg-warning "warning: useless type name in empty declaration" } */
+static const; /* { dg-warning "warning: useless keyword or type name in empty declaration" } */
+/* { dg-warning "warning: empty declaration" "long" { target *-*-* } 25 } */
+union { long b; }; /* { dg-warning "warning: unnamed struct/union that defines no instances" } */
+
+/* Multiple type names (errors).  */
+struct s1 int; /* { dg-error "error: two or more data types in declaration specifiers" } */
+char union u1; /* { dg-error "error: two or more data types in declaration specifiers" } */
+/* { dg-warning "warning: useless type name in empty declaration" "char union" { target *-*-* } 31 } */
+double enum { E2 }; /* { dg-error "error: two or more data types in declaration specifiers" } */
+/* { dg-warning "warning: useless type name in empty declaration" "double enum" { target *-*-* } 33 } */
+T struct s2; /* { dg-error "error: two or more data types in declaration specifiers" } */
+/* { dg-warning "warning: useless type name in empty declaration" "T struct" { target *-*-* } 35 } */
+long union u2; /* { dg-error "error: long, short, signed, unsigned or complex used invalidly in empty declaration" } */
+struct s3 short; /* { dg-error "error: long, short, signed, unsigned or complex used invalidly in empty declaration" } */
+union u3 signed; /* { dg-error "error: long, short, signed, unsigned or complex used invalidly in empty declaration" } */
+unsigned struct s4; /* { dg-error "error: long, short, signed, unsigned or complex used invalidly in empty declaration" } */
+_Complex enum { E3 }; /* { dg-error "error: long, short, signed, unsigned or complex used invalidly in empty declaration" } */
diff --git a/gcc/testsuite/gcc.dg/declspec-5.c b/gcc/testsuite/gcc.dg/declspec-5.c
new file mode 100644 (file)
index 0000000..aba2739
--- /dev/null
@@ -0,0 +1,41 @@
+/* Test declaration specifiers.  Test empty declarations.  Test with
+   -pedantic.  */
+/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
+/* { dg-do compile } */
+/* { dg-options "-pedantic" } */
+
+/* If a declaration does not declare a declarator, it must declare a
+   tag or the members of an enumeration, and must only contain one
+   type specifier.  */
+
+typedef int T;
+
+struct s0;
+union u0;
+enum e0; /* { dg-warning "warning: ISO C forbids forward references" } */
+enum { E0 };
+enum e1 { E1 };
+
+/* Not declaring anything (pedwarns).  */
+struct { int a; }; /* { dg-warning "warning: unnamed struct/union that defines no instances" } */
+int; /* { dg-warning "warning: useless type name in empty declaration" } */
+long; /* { dg-warning "warning: useless keyword or type name in empty declaration" } */
+/* { dg-warning "warning: empty declaration" "long" { target *-*-* } 22 } */
+T; /* { dg-warning "warning: useless type name in empty declaration" } */
+static const; /* { dg-warning "warning: useless keyword or type name in empty declaration" } */
+/* { dg-warning "warning: empty declaration" "long" { target *-*-* } 25 } */
+union { long b; }; /* { dg-warning "warning: unnamed struct/union that defines no instances" } */
+
+/* Multiple type names (errors).  */
+struct s1 int; /* { dg-error "error: two or more data types in declaration specifiers" } */
+char union u1; /* { dg-error "error: two or more data types in declaration specifiers" } */
+/* { dg-warning "warning: useless type name in empty declaration" "char union" { target *-*-* } 31 } */
+double enum { E2 }; /* { dg-error "error: two or more data types in declaration specifiers" } */
+/* { dg-warning "warning: useless type name in empty declaration" "double enum" { target *-*-* } 33 } */
+T struct s2; /* { dg-error "error: two or more data types in declaration specifiers" } */
+/* { dg-warning "warning: useless type name in empty declaration" "T struct" { target *-*-* } 35 } */
+long union u2; /* { dg-error "error: long, short, signed, unsigned or complex used invalidly in empty declaration" } */
+struct s3 short; /* { dg-error "error: long, short, signed, unsigned or complex used invalidly in empty declaration" } */
+union u3 signed; /* { dg-error "error: long, short, signed, unsigned or complex used invalidly in empty declaration" } */
+unsigned struct s4; /* { dg-error "error: long, short, signed, unsigned or complex used invalidly in empty declaration" } */
+_Complex enum { E3 }; /* { dg-error "error: long, short, signed, unsigned or complex used invalidly in empty declaration" } */
diff --git a/gcc/testsuite/gcc.dg/declspec-6.c b/gcc/testsuite/gcc.dg/declspec-6.c
new file mode 100644 (file)
index 0000000..91a5d82
--- /dev/null
@@ -0,0 +1,41 @@
+/* Test declaration specifiers.  Test empty declarations.  Test with
+   -pedantic-errors.  */
+/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
+/* { dg-do compile } */
+/* { dg-options "-pedantic-errors" } */
+
+/* If a declaration does not declare a declarator, it must declare a
+   tag or the members of an enumeration, and must only contain one
+   type specifier.  */
+
+typedef int T;
+
+struct s0;
+union u0;
+enum e0; /* { dg-error "error: ISO C forbids forward references" } */
+enum { E0 };
+enum e1 { E1 };
+
+/* Not declaring anything (pedwarns).  */
+struct { int a; }; /* { dg-error "error: unnamed struct/union that defines no instances" } */
+int; /* { dg-error "error: useless type name in empty declaration" } */
+long; /* { dg-warning "warning: useless keyword or type name in empty declaration" } */
+/* { dg-error "error: empty declaration" "long" { target *-*-* } 22 } */
+T; /* { dg-error "error: useless type name in empty declaration" } */
+static const; /* { dg-warning "warning: useless keyword or type name in empty declaration" } */
+/* { dg-error "error: empty declaration" "long" { target *-*-* } 25 } */
+union { long b; }; /* { dg-error "error: unnamed struct/union that defines no instances" } */
+
+/* Multiple type names (errors).  */
+struct s1 int; /* { dg-error "error: two or more data types in declaration specifiers" } */
+char union u1; /* { dg-error "error: two or more data types in declaration specifiers" } */
+/* { dg-error "error: useless type name in empty declaration" "char union" { target *-*-* } 31 } */
+double enum { E2 }; /* { dg-error "error: two or more data types in declaration specifiers" } */
+/* { dg-error "error: useless type name in empty declaration" "double enum" { target *-*-* } 33 } */
+T struct s2; /* { dg-error "error: two or more data types in declaration specifiers" } */
+/* { dg-error "error: useless type name in empty declaration" "T struct" { target *-*-* } 35 } */
+long union u2; /* { dg-error "error: long, short, signed, unsigned or complex used invalidly in empty declaration" } */
+struct s3 short; /* { dg-error "error: long, short, signed, unsigned or complex used invalidly in empty declaration" } */
+union u3 signed; /* { dg-error "error: long, short, signed, unsigned or complex used invalidly in empty declaration" } */
+unsigned struct s4; /* { dg-error "error: long, short, signed, unsigned or complex used invalidly in empty declaration" } */
+_Complex enum { E3 }; /* { dg-error "error: long, short, signed, unsigned or complex used invalidly in empty declaration" } */
diff --git a/gcc/testsuite/gcc.dg/long-long-typespec-1.c b/gcc/testsuite/gcc.dg/long-long-typespec-1.c
new file mode 100644 (file)
index 0000000..5a94c1d
--- /dev/null
@@ -0,0 +1,828 @@
+/* Test for valid and invalid combinations of type specifiers in C90
+   with -Wno-long-long.  */
+/* Origin: Joseph Myers <jsm@polyomino.org.uk> */
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1990 -pedantic-errors -Wno-long-long" } */
+
+typedef char type;
+extern *x0;
+void *x1;
+char *x2;
+short *x3;
+int *x4;
+long *x5;
+float *x6;
+double *x7;
+signed *x8;
+unsigned *x9;
+type *x10;
+void void *x11; /* { dg-error "error" "void void" } */
+void char *x12; /* { dg-error "error" "void char" } */
+void short *x13; /* { dg-error "error" "void short" } */
+void int *x14; /* { dg-error "error" "void int" } */
+void long *x15; /* { dg-error "error" "void long" } */
+void float *x16; /* { dg-error "error" "void float" } */
+void double *x17; /* { dg-error "error" "void double" } */
+void signed *x18; /* { dg-error "error" "void signed" } */
+void unsigned *x19; /* { dg-error "error" "void unsigned" } */
+char void *x20; /* { dg-error "error" "char void" } */
+char char *x21; /* { dg-error "error" "char char" } */
+char short *x22; /* { dg-error "error" "char short" } */
+char int *x23; /* { dg-error "error" "char int" } */
+char long *x24; /* { dg-error "error" "char long" } */
+char float *x25; /* { dg-error "error" "char float" } */
+char double *x26; /* { dg-error "error" "char double" } */
+char signed *x27;
+char unsigned *x28;
+short void *x29; /* { dg-error "error" "short void" } */
+short char *x30; /* { dg-error "error" "short char" } */
+short short *x31; /* { dg-error "error" "short short" } */
+short int *x32;
+short long *x33; /* { dg-error "error" "short long" } */
+short float *x34; /* { dg-error "error" "short float" } */
+short double *x35; /* { dg-error "error" "short double" } */
+short signed *x36;
+short unsigned *x37;
+int void *x38; /* { dg-error "error" "int void" } */
+int char *x39; /* { dg-error "error" "int char" } */
+int short *x40;
+int int *x41; /* { dg-error "error" "int int" } */
+int long *x42;
+int float *x43; /* { dg-error "error" "int float" } */
+int double *x44; /* { dg-error "error" "int double" } */
+int signed *x45;
+int unsigned *x46;
+long void *x47; /* { dg-error "error" "long void" } */
+long char *x48; /* { dg-error "error" "long char" } */
+long short *x49; /* { dg-error "error" "long short" } */
+long int *x50;
+long long *x51;
+long float *x52; /* { dg-error "error" "long float" } */
+long double *x53;
+long signed *x54;
+long unsigned *x55;
+float void *x56; /* { dg-error "error" "float void" } */
+float char *x57; /* { dg-error "error" "float char" } */
+float short *x58; /* { dg-error "error" "float short" } */
+float int *x59; /* { dg-error "error" "float int" } */
+float long *x60; /* { dg-error "error" "float long" } */
+float float *x61; /* { dg-error "error" "float float" } */
+float double *x62; /* { dg-error "error" "float double" } */
+float signed *x63; /* { dg-error "error" "float signed" } */
+float unsigned *x64; /* { dg-error "error" "float unsigned" } */
+double void *x65; /* { dg-error "error" "double void" } */
+double char *x66; /* { dg-error "error" "double char" } */
+double short *x67; /* { dg-error "error" "double short" } */
+double int *x68; /* { dg-error "error" "double int" } */
+double long *x69;
+double float *x70; /* { dg-error "error" "double float" } */
+double double *x71; /* { dg-error "error" "double double" } */
+double signed *x72; /* { dg-error "error" "double signed" } */
+double unsigned *x73; /* { dg-error "error" "double unsigned" } */
+signed void *x74; /* { dg-error "error" "signed void" } */
+signed char *x75;
+signed short *x76;
+signed int *x77;
+signed long *x78;
+signed float *x79; /* { dg-error "error" "signed float" } */
+signed double *x80; /* { dg-error "error" "signed double" } */
+signed signed *x81; /* { dg-error "error" "signed signed" } */
+signed unsigned *x82; /* { dg-error "error" "signed unsigned" } */
+unsigned void *x83; /* { dg-error "error" "unsigned void" } */
+unsigned char *x84;
+unsigned short *x85;
+unsigned int *x86;
+unsigned long *x87;
+unsigned float *x88; /* { dg-error "error" "unsigned float" } */
+unsigned double *x89; /* { dg-error "error" "unsigned double" } */
+unsigned signed *x90; /* { dg-error "error" "unsigned signed" } */
+unsigned unsigned *x91; /* { dg-error "error" "unsigned unsigned" } */
+type void *x92; /* { dg-error "error" "type void" } */
+type char *x93; /* { dg-error "error" "type char" } */
+type short *x94; /* { dg-error "error" "type short" } */
+type int *x95; /* { dg-error "error" "type int" } */
+type long *x96; /* { dg-error "error" "type long" } */
+type float *x97; /* { dg-error "error" "type float" } */
+type double *x98; /* { dg-error "error" "type double" } */
+type signed *x99; /* { dg-error "error" "type signed" } */
+type unsigned *x100; /* { dg-error "error" "type unsigned" } */
+char signed void *x101; /* { dg-error "error" "char signed void" } */
+char signed char *x102; /* { dg-error "error" "char signed char" } */
+char signed short *x103; /* { dg-error "error" "char signed short" } */
+char signed int *x104; /* { dg-error "error" "char signed int" } */
+char signed long *x105; /* { dg-error "error" "char signed long" } */
+char signed float *x106; /* { dg-error "error" "char signed float" } */
+char signed double *x107; /* { dg-error "error" "char signed double" } */
+char signed signed *x108; /* { dg-error "error" "char signed signed" } */
+char signed unsigned *x109; /* { dg-error "error" "char signed unsigned" } */
+char unsigned void *x110; /* { dg-error "error" "char unsigned void" } */
+char unsigned char *x111; /* { dg-error "error" "char unsigned char" } */
+char unsigned short *x112; /* { dg-error "error" "char unsigned short" } */
+char unsigned int *x113; /* { dg-error "error" "char unsigned int" } */
+char unsigned long *x114; /* { dg-error "error" "char unsigned long" } */
+char unsigned float *x115; /* { dg-error "error" "char unsigned float" } */
+char unsigned double *x116; /* { dg-error "error" "char unsigned double" } */
+char unsigned signed *x117; /* { dg-error "error" "char unsigned signed" } */
+char unsigned unsigned *x118; /* { dg-error "error" "char unsigned unsigned" } */
+short int void *x119; /* { dg-error "error" "short int void" } */
+short int char *x120; /* { dg-error "error" "short int char" } */
+short int short *x121; /* { dg-error "error" "short int short" } */
+short int int *x122; /* { dg-error "error" "short int int" } */
+short int long *x123; /* { dg-error "error" "short int long" } */
+short int float *x124; /* { dg-error "error" "short int float" } */
+short int double *x125; /* { dg-error "error" "short int double" } */
+short int signed *x126;
+short int unsigned *x127;
+short signed void *x128; /* { dg-error "error" "short signed void" } */
+short signed char *x129; /* { dg-error "error" "short signed char" } */
+short signed short *x130; /* { dg-error "error" "short signed short" } */
+short signed int *x131;
+short signed long *x132; /* { dg-error "error" "short signed long" } */
+short signed float *x133; /* { dg-error "error" "short signed float" } */
+short signed double *x134; /* { dg-error "error" "short signed double" } */
+short signed signed *x135; /* { dg-error "error" "short signed signed" } */
+short signed unsigned *x136; /* { dg-error "error" "short signed unsigned" } */
+short unsigned void *x137; /* { dg-error "error" "short unsigned void" } */
+short unsigned char *x138; /* { dg-error "error" "short unsigned char" } */
+short unsigned short *x139; /* { dg-error "error" "short unsigned short" } */
+short unsigned int *x140;
+short unsigned long *x141; /* { dg-error "error" "short unsigned long" } */
+short unsigned float *x142; /* { dg-error "error" "short unsigned float" } */
+short unsigned double *x143; /* { dg-error "error" "short unsigned double" } */
+short unsigned signed *x144; /* { dg-error "error" "short unsigned signed" } */
+short unsigned unsigned *x145; /* { dg-error "error" "short unsigned unsigned" } */
+int short void *x146; /* { dg-error "error" "int short void" } */
+int short char *x147; /* { dg-error "error" "int short char" } */
+int short short *x148; /* { dg-error "error" "int short short" } */
+int short int *x149; /* { dg-error "error" "int short int" } */
+int short long *x150; /* { dg-error "error" "int short long" } */
+int short float *x151; /* { dg-error "error" "int short float" } */
+int short double *x152; /* { dg-error "error" "int short double" } */
+int short signed *x153;
+int short unsigned *x154;
+int long void *x155; /* { dg-error "error" "int long void" } */
+int long char *x156; /* { dg-error "error" "int long char" } */
+int long short *x157; /* { dg-error "error" "int long short" } */
+int long int *x158; /* { dg-error "error" "int long int" } */
+int long long *x159;
+int long float *x160; /* { dg-error "error" "int long float" } */
+int long double *x161; /* { dg-error "error" "int long double" } */
+int long signed *x162;
+int long unsigned *x163;
+int signed void *x164; /* { dg-error "error" "int signed void" } */
+int signed char *x165; /* { dg-error "error" "int signed char" } */
+int signed short *x166;
+int signed int *x167; /* { dg-error "error" "int signed int" } */
+int signed long *x168;
+int signed float *x169; /* { dg-error "error" "int signed float" } */
+int signed double *x170; /* { dg-error "error" "int signed double" } */
+int signed signed *x171; /* { dg-error "error" "int signed signed" } */
+int signed unsigned *x172; /* { dg-error "error" "int signed unsigned" } */
+int unsigned void *x173; /* { dg-error "error" "int unsigned void" } */
+int unsigned char *x174; /* { dg-error "error" "int unsigned char" } */
+int unsigned short *x175;
+int unsigned int *x176; /* { dg-error "error" "int unsigned int" } */
+int unsigned long *x177;
+int unsigned float *x178; /* { dg-error "error" "int unsigned float" } */
+int unsigned double *x179; /* { dg-error "error" "int unsigned double" } */
+int unsigned signed *x180; /* { dg-error "error" "int unsigned signed" } */
+int unsigned unsigned *x181; /* { dg-error "error" "int unsigned unsigned" } */
+long int void *x182; /* { dg-error "error" "long int void" } */
+long int char *x183; /* { dg-error "error" "long int char" } */
+long int short *x184; /* { dg-error "error" "long int short" } */
+long int int *x185; /* { dg-error "error" "long int int" } */
+long int long *x186;
+long int float *x187; /* { dg-error "error" "long int float" } */
+long int double *x188; /* { dg-error "error" "long int double" } */
+long int signed *x189;
+long int unsigned *x190;
+long long void *x191; /* { dg-error "error" "long long void" } */
+long long char *x192; /* { dg-error "error" "long long char" } */
+long long short *x193; /* { dg-error "error" "long long short" } */
+long long int *x194;
+long long long *x195; /* { dg-error "error" "long long long" } */
+long long float *x196; /* { dg-error "error" "long long float" } */
+long long double *x197; /* { dg-error "error" "long long double" } */
+long long signed *x198;
+long long unsigned *x199;
+long double void *x200; /* { dg-error "error" "long double void" } */
+long double char *x201; /* { dg-error "error" "long double char" } */
+long double short *x202; /* { dg-error "error" "long double short" } */
+long double int *x203; /* { dg-error "error" "long double int" } */
+long double long *x204; /* { dg-error "error" "long double long" } */
+long double float *x205; /* { dg-error "error" "long double float" } */
+long double double *x206; /* { dg-error "error" "long double double" } */
+long double signed *x207; /* { dg-error "error" "long double signed" } */
+long double unsigned *x208; /* { dg-error "error" "long double unsigned" } */
+long signed void *x209; /* { dg-error "error" "long signed void" } */
+long signed char *x210; /* { dg-error "error" "long signed char" } */
+long signed short *x211; /* { dg-error "error" "long signed short" } */
+long signed int *x212;
+long signed long *x213;
+long signed float *x214; /* { dg-error "error" "long signed float" } */
+long signed double *x215; /* { dg-error "error" "long signed double" } */
+long signed signed *x216; /* { dg-error "error" "long signed signed" } */
+long signed unsigned *x217; /* { dg-error "error" "long signed unsigned" } */
+long unsigned void *x218; /* { dg-error "error" "long unsigned void" } */
+long unsigned char *x219; /* { dg-error "error" "long unsigned char" } */
+long unsigned short *x220; /* { dg-error "error" "long unsigned short" } */
+long unsigned int *x221;
+long unsigned long *x222;
+long unsigned float *x223; /* { dg-error "error" "long unsigned float" } */
+long unsigned double *x224; /* { dg-error "error" "long unsigned double" } */
+long unsigned signed *x225; /* { dg-error "error" "long unsigned signed" } */
+long unsigned unsigned *x226; /* { dg-error "error" "long unsigned unsigned" } */
+double long void *x227; /* { dg-error "error" "double long void" } */
+double long char *x228; /* { dg-error "error" "double long char" } */
+double long short *x229; /* { dg-error "error" "double long short" } */
+double long int *x230; /* { dg-error "error" "double long int" } */
+double long long *x231; /* { dg-error "error" "double long long" } */
+double long float *x232; /* { dg-error "error" "double long float" } */
+double long double *x233; /* { dg-error "error" "double long double" } */
+double long signed *x234; /* { dg-error "error" "double long signed" } */
+double long unsigned *x235; /* { dg-error "error" "double long unsigned" } */
+signed char void *x236; /* { dg-error "error" "signed char void" } */
+signed char char *x237; /* { dg-error "error" "signed char char" } */
+signed char short *x238; /* { dg-error "error" "signed char short" } */
+signed char int *x239; /* { dg-error "error" "signed char int" } */
+signed char long *x240; /* { dg-error "error" "signed char long" } */
+signed char float *x241; /* { dg-error "error" "signed char float" } */
+signed char double *x242; /* { dg-error "error" "signed char double" } */
+signed char signed *x243; /* { dg-error "error" "signed char signed" } */
+signed char unsigned *x244; /* { dg-error "error" "signed char unsigned" } */
+signed short void *x245; /* { dg-error "error" "signed short void" } */
+signed short char *x246; /* { dg-error "error" "signed short char" } */
+signed short short *x247; /* { dg-error "error" "signed short short" } */
+signed short int *x248;
+signed short long *x249; /* { dg-error "error" "signed short long" } */
+signed short float *x250; /* { dg-error "error" "signed short float" } */
+signed short double *x251; /* { dg-error "error" "signed short double" } */
+signed short signed *x252; /* { dg-error "error" "signed short signed" } */
+signed short unsigned *x253; /* { dg-error "error" "signed short unsigned" } */
+signed int void *x254; /* { dg-error "error" "signed int void" } */
+signed int char *x255; /* { dg-error "error" "signed int char" } */
+signed int short *x256;
+signed int int *x257; /* { dg-error "error" "signed int int" } */
+signed int long *x258;
+signed int float *x259; /* { dg-error "error" "signed int float" } */
+signed int double *x260; /* { dg-error "error" "signed int double" } */
+signed int signed *x261; /* { dg-error "error" "signed int signed" } */
+signed int unsigned *x262; /* { dg-error "error" "signed int unsigned" } */
+signed long void *x263; /* { dg-error "error" "signed long void" } */
+signed long char *x264; /* { dg-error "error" "signed long char" } */
+signed long short *x265; /* { dg-error "error" "signed long short" } */
+signed long int *x266;
+signed long long *x267;
+signed long float *x268; /* { dg-error "error" "signed long float" } */
+signed long double *x269; /* { dg-error "error" "signed long double" } */
+signed long signed *x270; /* { dg-error "error" "signed long signed" } */
+signed long unsigned *x271; /* { dg-error "error" "signed long unsigned" } */
+unsigned char void *x272; /* { dg-error "error" "unsigned char void" } */
+unsigned char char *x273; /* { dg-error "error" "unsigned char char" } */
+unsigned char short *x274; /* { dg-error "error" "unsigned char short" } */
+unsigned char int *x275; /* { dg-error "error" "unsigned char int" } */
+unsigned char long *x276; /* { dg-error "error" "unsigned char long" } */
+unsigned char float *x277; /* { dg-error "error" "unsigned char float" } */
+unsigned char double *x278; /* { dg-error "error" "unsigned char double" } */
+unsigned char signed *x279; /* { dg-error "error" "unsigned char signed" } */
+unsigned char unsigned *x280; /* { dg-error "error" "unsigned char unsigned" } */
+unsigned short void *x281; /* { dg-error "error" "unsigned short void" } */
+unsigned short char *x282; /* { dg-error "error" "unsigned short char" } */
+unsigned short short *x283; /* { dg-error "error" "unsigned short short" } */
+unsigned short int *x284;
+unsigned short long *x285; /* { dg-error "error" "unsigned short long" } */
+unsigned short float *x286; /* { dg-error "error" "unsigned short float" } */
+unsigned short double *x287; /* { dg-error "error" "unsigned short double" } */
+unsigned short signed *x288; /* { dg-error "error" "unsigned short signed" } */
+unsigned short unsigned *x289; /* { dg-error "error" "unsigned short unsigned" } */
+unsigned int void *x290; /* { dg-error "error" "unsigned int void" } */
+unsigned int char *x291; /* { dg-error "error" "unsigned int char" } */
+unsigned int short *x292;
+unsigned int int *x293; /* { dg-error "error" "unsigned int int" } */
+unsigned int long *x294;
+unsigned int float *x295; /* { dg-error "error" "unsigned int float" } */
+unsigned int double *x296; /* { dg-error "error" "unsigned int double" } */
+unsigned int signed *x297; /* { dg-error "error" "unsigned int signed" } */
+unsigned int unsigned *x298; /* { dg-error "error" "unsigned int unsigned" } */
+unsigned long void *x299; /* { dg-error "error" "unsigned long void" } */
+unsigned long char *x300; /* { dg-error "error" "unsigned long char" } */
+unsigned long short *x301; /* { dg-error "error" "unsigned long short" } */
+unsigned long int *x302;
+unsigned long long *x303;
+unsigned long float *x304; /* { dg-error "error" "unsigned long float" } */
+unsigned long double *x305; /* { dg-error "error" "unsigned long double" } */
+unsigned long signed *x306; /* { dg-error "error" "unsigned long signed" } */
+unsigned long unsigned *x307; /* { dg-error "error" "unsigned long unsigned" } */
+short int signed void *x308; /* { dg-error "error" "short int signed void" } */
+short int signed char *x309; /* { dg-error "error" "short int signed char" } */
+short int signed short *x310; /* { dg-error "error" "short int signed short" } */
+short int signed int *x311; /* { dg-error "error" "short int signed int" } */
+short int signed long *x312; /* { dg-error "error" "short int signed long" } */
+short int signed float *x313; /* { dg-error "error" "short int signed float" } */
+short int signed double *x314; /* { dg-error "error" "short int signed double" } */
+short int signed signed *x315; /* { dg-error "error" "short int signed signed" } */
+short int signed unsigned *x316; /* { dg-error "error" "short int signed unsigned" } */
+short int unsigned void *x317; /* { dg-error "error" "short int unsigned void" } */
+short int unsigned char *x318; /* { dg-error "error" "short int unsigned char" } */
+short int unsigned short *x319; /* { dg-error "error" "short int unsigned short" } */
+short int unsigned int *x320; /* { dg-error "error" "short int unsigned int" } */
+short int unsigned long *x321; /* { dg-error "error" "short int unsigned long" } */
+short int unsigned float *x322; /* { dg-error "error" "short int unsigned float" } */
+short int unsigned double *x323; /* { dg-error "error" "short int unsigned double" } */
+short int unsigned signed *x324; /* { dg-error "error" "short int unsigned signed" } */
+short int unsigned unsigned *x325; /* { dg-error "error" "short int unsigned unsigned" } */
+short signed int void *x326; /* { dg-error "error" "short signed int void" } */
+short signed int char *x327; /* { dg-error "error" "short signed int char" } */
+short signed int short *x328; /* { dg-error "error" "short signed int short" } */
+short signed int int *x329; /* { dg-error "error" "short signed int int" } */
+short signed int long *x330; /* { dg-error "error" "short signed int long" } */
+short signed int float *x331; /* { dg-error "error" "short signed int float" } */
+short signed int double *x332; /* { dg-error "error" "short signed int double" } */
+short signed int signed *x333; /* { dg-error "error" "short signed int signed" } */
+short signed int unsigned *x334; /* { dg-error "error" "short signed int unsigned" } */
+short unsigned int void *x335; /* { dg-error "error" "short unsigned int void" } */
+short unsigned int char *x336; /* { dg-error "error" "short unsigned int char" } */
+short unsigned int short *x337; /* { dg-error "error" "short unsigned int short" } */
+short unsigned int int *x338; /* { dg-error "error" "short unsigned int int" } */
+short unsigned int long *x339; /* { dg-error "error" "short unsigned int long" } */
+short unsigned int float *x340; /* { dg-error "error" "short unsigned int float" } */
+short unsigned int double *x341; /* { dg-error "error" "short unsigned int double" } */
+short unsigned int signed *x342; /* { dg-error "error" "short unsigned int signed" } */
+short unsigned int unsigned *x343; /* { dg-error "error" "short unsigned int unsigned" } */
+int short signed void *x344; /* { dg-error "error" "int short signed void" } */
+int short signed char *x345; /* { dg-error "error" "int short signed char" } */
+int short signed short *x346; /* { dg-error "error" "int short signed short" } */
+int short signed int *x347; /* { dg-error "error" "int short signed int" } */
+int short signed long *x348; /* { dg-error "error" "int short signed long" } */
+int short signed float *x349; /* { dg-error "error" "int short signed float" } */
+int short signed double *x350; /* { dg-error "error" "int short signed double" } */
+int short signed signed *x351; /* { dg-error "error" "int short signed signed" } */
+int short signed unsigned *x352; /* { dg-error "error" "int short signed unsigned" } */
+int short unsigned void *x353; /* { dg-error "error" "int short unsigned void" } */
+int short unsigned char *x354; /* { dg-error "error" "int short unsigned char" } */
+int short unsigned short *x355; /* { dg-error "error" "int short unsigned short" } */
+int short unsigned int *x356; /* { dg-error "error" "int short unsigned int" } */
+int short unsigned long *x357; /* { dg-error "error" "int short unsigned long" } */
+int short unsigned float *x358; /* { dg-error "error" "int short unsigned float" } */
+int short unsigned double *x359; /* { dg-error "error" "int short unsigned double" } */
+int short unsigned signed *x360; /* { dg-error "error" "int short unsigned signed" } */
+int short unsigned unsigned *x361; /* { dg-error "error" "int short unsigned unsigned" } */
+int long long void *x362; /* { dg-error "error" "int long long void" } */
+int long long char *x363; /* { dg-error "error" "int long long char" } */
+int long long short *x364; /* { dg-error "error" "int long long short" } */
+int long long int *x365; /* { dg-error "error" "int long long int" } */
+int long long long *x366; /* { dg-error "error" "int long long long" } */
+int long long float *x367; /* { dg-error "error" "int long long float" } */
+int long long double *x368; /* { dg-error "error" "int long long double" } */
+int long long signed *x369;
+int long long unsigned *x370;
+int long signed void *x371; /* { dg-error "error" "int long signed void" } */
+int long signed char *x372; /* { dg-error "error" "int long signed char" } */
+int long signed short *x373; /* { dg-error "error" "int long signed short" } */
+int long signed int *x374; /* { dg-error "error" "int long signed int" } */
+int long signed long *x375;
+int long signed float *x376; /* { dg-error "error" "int long signed float" } */
+int long signed double *x377; /* { dg-error "error" "int long signed double" } */
+int long signed signed *x378; /* { dg-error "error" "int long signed signed" } */
+int long signed unsigned *x379; /* { dg-error "error" "int long signed unsigned" } */
+int long unsigned void *x380; /* { dg-error "error" "int long unsigned void" } */
+int long unsigned char *x381; /* { dg-error "error" "int long unsigned char" } */
+int long unsigned short *x382; /* { dg-error "error" "int long unsigned short" } */
+int long unsigned int *x383; /* { dg-error "error" "int long unsigned int" } */
+int long unsigned long *x384;
+int long unsigned float *x385; /* { dg-error "error" "int long unsigned float" } */
+int long unsigned double *x386; /* { dg-error "error" "int long unsigned double" } */
+int long unsigned signed *x387; /* { dg-error "error" "int long unsigned signed" } */
+int long unsigned unsigned *x388; /* { dg-error "error" "int long unsigned unsigned" } */
+int signed short void *x389; /* { dg-error "error" "int signed short void" } */
+int signed short char *x390; /* { dg-error "error" "int signed short char" } */
+int signed short short *x391; /* { dg-error "error" "int signed short short" } */
+int signed short int *x392; /* { dg-error "error" "int signed short int" } */
+int signed short long *x393; /* { dg-error "error" "int signed short long" } */
+int signed short float *x394; /* { dg-error "error" "int signed short float" } */
+int signed short double *x395; /* { dg-error "error" "int signed short double" } */
+int signed short signed *x396; /* { dg-error "error" "int signed short signed" } */
+int signed short unsigned *x397; /* { dg-error "error" "int signed short unsigned" } */
+int signed long void *x398; /* { dg-error "error" "int signed long void" } */
+int signed long char *x399; /* { dg-error "error" "int signed long char" } */
+int signed long short *x400; /* { dg-error "error" "int signed long short" } */
+int signed long int *x401; /* { dg-error "error" "int signed long int" } */
+int signed long long *x402;
+int signed long float *x403; /* { dg-error "error" "int signed long float" } */
+int signed long double *x404; /* { dg-error "error" "int signed long double" } */
+int signed long signed *x405; /* { dg-error "error" "int signed long signed" } */
+int signed long unsigned *x406; /* { dg-error "error" "int signed long unsigned" } */
+int unsigned short void *x407; /* { dg-error "error" "int unsigned short void" } */
+int unsigned short char *x408; /* { dg-error "error" "int unsigned short char" } */
+int unsigned short short *x409; /* { dg-error "error" "int unsigned short short" } */
+int unsigned short int *x410; /* { dg-error "error" "int unsigned short int" } */
+int unsigned short long *x411; /* { dg-error "error" "int unsigned short long" } */
+int unsigned short float *x412; /* { dg-error "error" "int unsigned short float" } */
+int unsigned short double *x413; /* { dg-error "error" "int unsigned short double" } */
+int unsigned short signed *x414; /* { dg-error "error" "int unsigned short signed" } */
+int unsigned short unsigned *x415; /* { dg-error "error" "int unsigned short unsigned" } */
+int unsigned long void *x416; /* { dg-error "error" "int unsigned long void" } */
+int unsigned long char *x417; /* { dg-error "error" "int unsigned long char" } */
+int unsigned long short *x418; /* { dg-error "error" "int unsigned long short" } */
+int unsigned long int *x419; /* { dg-error "error" "int unsigned long int" } */
+int unsigned long long *x420;
+int unsigned long float *x421; /* { dg-error "error" "int unsigned long float" } */
+int unsigned long double *x422; /* { dg-error "error" "int unsigned long double" } */
+int unsigned long signed *x423; /* { dg-error "error" "int unsigned long signed" } */
+int unsigned long unsigned *x424; /* { dg-error "error" "int unsigned long unsigned" } */
+long int long void *x425; /* { dg-error "error" "long int long void" } */
+long int long char *x426; /* { dg-error "error" "long int long char" } */
+long int long short *x427; /* { dg-error "error" "long int long short" } */
+long int long int *x428; /* { dg-error "error" "long int long int" } */
+long int long long *x429; /* { dg-error "error" "long int long long" } */
+long int long float *x430; /* { dg-error "error" "long int long float" } */
+long int long double *x431; /* { dg-error "error" "long int long double" } */
+long int long signed *x432;
+long int long unsigned *x433;
+long int signed void *x434; /* { dg-error "error" "long int signed void" } */
+long int signed char *x435; /* { dg-error "error" "long int signed char" } */
+long int signed short *x436; /* { dg-error "error" "long int signed short" } */
+long int signed int *x437; /* { dg-error "error" "long int signed int" } */
+long int signed long *x438;
+long int signed float *x439; /* { dg-error "error" "long int signed float" } */
+long int signed double *x440; /* { dg-error "error" "long int signed double" } */
+long int signed signed *x441; /* { dg-error "error" "long int signed signed" } */
+long int signed unsigned *x442; /* { dg-error "error" "long int signed unsigned" } */
+long int unsigned void *x443; /* { dg-error "error" "long int unsigned void" } */
+long int unsigned char *x444; /* { dg-error "error" "long int unsigned char" } */
+long int unsigned short *x445; /* { dg-error "error" "long int unsigned short" } */
+long int unsigned int *x446; /* { dg-error "error" "long int unsigned int" } */
+long int unsigned long *x447;
+long int unsigned float *x448; /* { dg-error "error" "long int unsigned float" } */
+long int unsigned double *x449; /* { dg-error "error" "long int unsigned double" } */
+long int unsigned signed *x450; /* { dg-error "error" "long int unsigned signed" } */
+long int unsigned unsigned *x451; /* { dg-error "error" "long int unsigned unsigned" } */
+long long int void *x452; /* { dg-error "error" "long long int void" } */
+long long int char *x453; /* { dg-error "error" "long long int char" } */
+long long int short *x454; /* { dg-error "error" "long long int short" } */
+long long int int *x455; /* { dg-error "error" "long long int int" } */
+long long int long *x456; /* { dg-error "error" "long long int long" } */
+long long int float *x457; /* { dg-error "error" "long long int float" } */
+long long int double *x458; /* { dg-error "error" "long long int double" } */
+long long int signed *x459;
+long long int unsigned *x460;
+long long signed void *x461; /* { dg-error "error" "long long signed void" } */
+long long signed char *x462; /* { dg-error "error" "long long signed char" } */
+long long signed short *x463; /* { dg-error "error" "long long signed short" } */
+long long signed int *x464;
+long long signed long *x465; /* { dg-error "error" "long long signed long" } */
+long long signed float *x466; /* { dg-error "error" "long long signed float" } */
+long long signed double *x467; /* { dg-error "error" "long long signed double" } */
+long long signed signed *x468; /* { dg-error "error" "long long signed signed" } */
+long long signed unsigned *x469; /* { dg-error "error" "long long signed unsigned" } */
+long long unsigned void *x470; /* { dg-error "error" "long long unsigned void" } */
+long long unsigned char *x471; /* { dg-error "error" "long long unsigned char" } */
+long long unsigned short *x472; /* { dg-error "error" "long long unsigned short" } */
+long long unsigned int *x473;
+long long unsigned long *x474; /* { dg-error "error" "long long unsigned long" } */
+long long unsigned float *x475; /* { dg-error "error" "long long unsigned float" } */
+long long unsigned double *x476; /* { dg-error "error" "long long unsigned double" } */
+long long unsigned signed *x477; /* { dg-error "error" "long long unsigned signed" } */
+long long unsigned unsigned *x478; /* { dg-error "error" "long long unsigned unsigned" } */
+long signed int void *x479; /* { dg-error "error" "long signed int void" } */
+long signed int char *x480; /* { dg-error "error" "long signed int char" } */
+long signed int short *x481; /* { dg-error "error" "long signed int short" } */
+long signed int int *x482; /* { dg-error "error" "long signed int int" } */
+long signed int long *x483;
+long signed int float *x484; /* { dg-error "error" "long signed int float" } */
+long signed int double *x485; /* { dg-error "error" "long signed int double" } */
+long signed int signed *x486; /* { dg-error "error" "long signed int signed" } */
+long signed int unsigned *x487; /* { dg-error "error" "long signed int unsigned" } */
+long signed long void *x488; /* { dg-error "error" "long signed long void" } */
+long signed long char *x489; /* { dg-error "error" "long signed long char" } */
+long signed long short *x490; /* { dg-error "error" "long signed long short" } */
+long signed long int *x491;
+long signed long long *x492; /* { dg-error "error" "long signed long long" } */
+long signed long float *x493; /* { dg-error "error" "long signed long float" } */
+long signed long double *x494; /* { dg-error "error" "long signed long double" } */
+long signed long signed *x495; /* { dg-error "error" "long signed long signed" } */
+long signed long unsigned *x496; /* { dg-error "error" "long signed long unsigned" } */
+long unsigned int void *x497; /* { dg-error "error" "long unsigned int void" } */
+long unsigned int char *x498; /* { dg-error "error" "long unsigned int char" } */
+long unsigned int short *x499; /* { dg-error "error" "long unsigned int short" } */
+long unsigned int int *x500; /* { dg-error "error" "long unsigned int int" } */
+long unsigned int long *x501;
+long unsigned int float *x502; /* { dg-error "error" "long unsigned int float" } */
+long unsigned int double *x503; /* { dg-error "error" "long unsigned int double" } */
+long unsigned int signed *x504; /* { dg-error "error" "long unsigned int signed" } */
+long unsigned int unsigned *x505; /* { dg-error "error" "long unsigned int unsigned" } */
+long unsigned long void *x506; /* { dg-error "error" "long unsigned long void" } */
+long unsigned long char *x507; /* { dg-error "error" "long unsigned long char" } */
+long unsigned long short *x508; /* { dg-error "error" "long unsigned long short" } */
+long unsigned long int *x509;
+long unsigned long long *x510; /* { dg-error "error" "long unsigned long long" } */
+long unsigned long float *x511; /* { dg-error "error" "long unsigned long float" } */
+long unsigned long double *x512; /* { dg-error "error" "long unsigned long double" } */
+long unsigned long signed *x513; /* { dg-error "error" "long unsigned long signed" } */
+long unsigned long unsigned *x514; /* { dg-error "error" "long unsigned long unsigned" } */
+signed short int void *x515; /* { dg-error "error" "signed short int void" } */
+signed short int char *x516; /* { dg-error "error" "signed short int char" } */
+signed short int short *x517; /* { dg-error "error" "signed short int short" } */
+signed short int int *x518; /* { dg-error "error" "signed short int int" } */
+signed short int long *x519; /* { dg-error "error" "signed short int long" } */
+signed short int float *x520; /* { dg-error "error" "signed short int float" } */
+signed short int double *x521; /* { dg-error "error" "signed short int double" } */
+signed short int signed *x522; /* { dg-error "error" "signed short int signed" } */
+signed short int unsigned *x523; /* { dg-error "error" "signed short int unsigned" } */
+signed int short void *x524; /* { dg-error "error" "signed int short void" } */
+signed int short char *x525; /* { dg-error "error" "signed int short char" } */
+signed int short short *x526; /* { dg-error "error" "signed int short short" } */
+signed int short int *x527; /* { dg-error "error" "signed int short int" } */
+signed int short long *x528; /* { dg-error "error" "signed int short long" } */
+signed int short float *x529; /* { dg-error "error" "signed int short float" } */
+signed int short double *x530; /* { dg-error "error" "signed int short double" } */
+signed int short signed *x531; /* { dg-error "error" "signed int short signed" } */
+signed int short unsigned *x532; /* { dg-error "error" "signed int short unsigned" } */
+signed int long void *x533; /* { dg-error "error" "signed int long void" } */
+signed int long char *x534; /* { dg-error "error" "signed int long char" } */
+signed int long short *x535; /* { dg-error "error" "signed int long short" } */
+signed int long int *x536; /* { dg-error "error" "signed int long int" } */
+signed int long long *x537;
+signed int long float *x538; /* { dg-error "error" "signed int long float" } */
+signed int long double *x539; /* { dg-error "error" "signed int long double" } */
+signed int long signed *x540; /* { dg-error "error" "signed int long signed" } */
+signed int long unsigned *x541; /* { dg-error "error" "signed int long unsigned" } */
+signed long int void *x542; /* { dg-error "error" "signed long int void" } */
+signed long int char *x543; /* { dg-error "error" "signed long int char" } */
+signed long int short *x544; /* { dg-error "error" "signed long int short" } */
+signed long int int *x545; /* { dg-error "error" "signed long int int" } */
+signed long int long *x546;
+signed long int float *x547; /* { dg-error "error" "signed long int float" } */
+signed long int double *x548; /* { dg-error "error" "signed long int double" } */
+signed long int signed *x549; /* { dg-error "error" "signed long int signed" } */
+signed long int unsigned *x550; /* { dg-error "error" "signed long int unsigned" } */
+signed long long void *x551; /* { dg-error "error" "signed long long void" } */
+signed long long char *x552; /* { dg-error "error" "signed long long char" } */
+signed long long short *x553; /* { dg-error "error" "signed long long short" } */
+signed long long int *x554;
+signed long long long *x555; /* { dg-error "error" "signed long long long" } */
+signed long long float *x556; /* { dg-error "error" "signed long long float" } */
+signed long long double *x557; /* { dg-error "error" "signed long long double" } */
+signed long long signed *x558; /* { dg-error "error" "signed long long signed" } */
+signed long long unsigned *x559; /* { dg-error "error" "signed long long unsigned" } */
+unsigned short int void *x560; /* { dg-error "error" "unsigned short int void" } */
+unsigned short int char *x561; /* { dg-error "error" "unsigned short int char" } */
+unsigned short int short *x562; /* { dg-error "error" "unsigned short int short" } */
+unsigned short int int *x563; /* { dg-error "error" "unsigned short int int" } */
+unsigned short int long *x564; /* { dg-error "error" "unsigned short int long" } */
+unsigned short int float *x565; /* { dg-error "error" "unsigned short int float" } */
+unsigned short int double *x566; /* { dg-error "error" "unsigned short int double" } */
+unsigned short int signed *x567; /* { dg-error "error" "unsigned short int signed" } */
+unsigned short int unsigned *x568; /* { dg-error "error" "unsigned short int unsigned" } */
+unsigned int short void *x569; /* { dg-error "error" "unsigned int short void" } */
+unsigned int short char *x570; /* { dg-error "error" "unsigned int short char" } */
+unsigned int short short *x571; /* { dg-error "error" "unsigned int short short" } */
+unsigned int short int *x572; /* { dg-error "error" "unsigned int short int" } */
+unsigned int short long *x573; /* { dg-error "error" "unsigned int short long" } */
+unsigned int short float *x574; /* { dg-error "error" "unsigned int short float" } */
+unsigned int short double *x575; /* { dg-error "error" "unsigned int short double" } */
+unsigned int short signed *x576; /* { dg-error "error" "unsigned int short signed" } */
+unsigned int short unsigned *x577; /* { dg-error "error" "unsigned int short unsigned" } */
+unsigned int long void *x578; /* { dg-error "error" "unsigned int long void" } */
+unsigned int long char *x579; /* { dg-error "error" "unsigned int long char" } */
+unsigned int long short *x580; /* { dg-error "error" "unsigned int long short" } */
+unsigned int long int *x581; /* { dg-error "error" "unsigned int long int" } */
+unsigned int long long *x582;
+unsigned int long float *x583; /* { dg-error "error" "unsigned int long float" } */
+unsigned int long double *x584; /* { dg-error "error" "unsigned int long double" } */
+unsigned int long signed *x585; /* { dg-error "error" "unsigned int long signed" } */
+unsigned int long unsigned *x586; /* { dg-error "error" "unsigned int long unsigned" } */
+unsigned long int void *x587; /* { dg-error "error" "unsigned long int void" } */
+unsigned long int char *x588; /* { dg-error "error" "unsigned long int char" } */
+unsigned long int short *x589; /* { dg-error "error" "unsigned long int short" } */
+unsigned long int int *x590; /* { dg-error "error" "unsigned long int int" } */
+unsigned long int long *x591;
+unsigned long int float *x592; /* { dg-error "error" "unsigned long int float" } */
+unsigned long int double *x593; /* { dg-error "error" "unsigned long int double" } */
+unsigned long int signed *x594; /* { dg-error "error" "unsigned long int signed" } */
+unsigned long int unsigned *x595; /* { dg-error "error" "unsigned long int unsigned" } */
+unsigned long long void *x596; /* { dg-error "error" "unsigned long long void" } */
+unsigned long long char *x597; /* { dg-error "error" "unsigned long long char" } */
+unsigned long long short *x598; /* { dg-error "error" "unsigned long long short" } */
+unsigned long long int *x599;
+unsigned long long long *x600; /* { dg-error "error" "unsigned long long long" } */
+unsigned long long float *x601; /* { dg-error "error" "unsigned long long float" } */
+unsigned long long double *x602; /* { dg-error "error" "unsigned long long double" } */
+unsigned long long signed *x603; /* { dg-error "error" "unsigned long long signed" } */
+unsigned long long unsigned *x604; /* { dg-error "error" "unsigned long long unsigned" } */
+int long long signed void *x605; /* { dg-error "error" "int long long signed void" } */
+int long long signed char *x606; /* { dg-error "error" "int long long signed char" } */
+int long long signed short *x607; /* { dg-error "error" "int long long signed short" } */
+int long long signed int *x608; /* { dg-error "error" "int long long signed int" } */
+int long long signed long *x609; /* { dg-error "error" "int long long signed long" } */
+int long long signed float *x610; /* { dg-error "error" "int long long signed float" } */
+int long long signed double *x611; /* { dg-error "error" "int long long signed double" } */
+int long long signed signed *x612; /* { dg-error "error" "int long long signed signed" } */
+int long long signed unsigned *x613; /* { dg-error "error" "int long long signed unsigned" } */
+int long long unsigned void *x614; /* { dg-error "error" "int long long unsigned void" } */
+int long long unsigned char *x615; /* { dg-error "error" "int long long unsigned char" } */
+int long long unsigned short *x616; /* { dg-error "error" "int long long unsigned short" } */
+int long long unsigned int *x617; /* { dg-error "error" "int long long unsigned int" } */
+int long long unsigned long *x618; /* { dg-error "error" "int long long unsigned long" } */
+int long long unsigned float *x619; /* { dg-error "error" "int long long unsigned float" } */
+int long long unsigned double *x620; /* { dg-error "error" "int long long unsigned double" } */
+int long long unsigned signed *x621; /* { dg-error "error" "int long long unsigned signed" } */
+int long long unsigned unsigned *x622; /* { dg-error "error" "int long long unsigned unsigned" } */
+int long signed long void *x623; /* { dg-error "error" "int long signed long void" } */
+int long signed long char *x624; /* { dg-error "error" "int long signed long char" } */
+int long signed long short *x625; /* { dg-error "error" "int long signed long short" } */
+int long signed long int *x626; /* { dg-error "error" "int long signed long int" } */
+int long signed long long *x627; /* { dg-error "error" "int long signed long long" } */
+int long signed long float *x628; /* { dg-error "error" "int long signed long float" } */
+int long signed long double *x629; /* { dg-error "error" "int long signed long double" } */
+int long signed long signed *x630; /* { dg-error "error" "int long signed long signed" } */
+int long signed long unsigned *x631; /* { dg-error "error" "int long signed long unsigned" } */
+int long unsigned long void *x632; /* { dg-error "error" "int long unsigned long void" } */
+int long unsigned long char *x633; /* { dg-error "error" "int long unsigned long char" } */
+int long unsigned long short *x634; /* { dg-error "error" "int long unsigned long short" } */
+int long unsigned long int *x635; /* { dg-error "error" "int long unsigned long int" } */
+int long unsigned long long *x636; /* { dg-error "error" "int long unsigned long long" } */
+int long unsigned long float *x637; /* { dg-error "error" "int long unsigned long float" } */
+int long unsigned long double *x638; /* { dg-error "error" "int long unsigned long double" } */
+int long unsigned long signed *x639; /* { dg-error "error" "int long unsigned long signed" } */
+int long unsigned long unsigned *x640; /* { dg-error "error" "int long unsigned long unsigned" } */
+int signed long long void *x641; /* { dg-error "error" "int signed long long void" } */
+int signed long long char *x642; /* { dg-error "error" "int signed long long char" } */
+int signed long long short *x643; /* { dg-error "error" "int signed long long short" } */
+int signed long long int *x644; /* { dg-error "error" "int signed long long int" } */
+int signed long long long *x645; /* { dg-error "error" "int signed long long long" } */
+int signed long long float *x646; /* { dg-error "error" "int signed long long float" } */
+int signed long long double *x647; /* { dg-error "error" "int signed long long double" } */
+int signed long long signed *x648; /* { dg-error "error" "int signed long long signed" } */
+int signed long long unsigned *x649; /* { dg-error "error" "int signed long long unsigned" } */
+int unsigned long long void *x650; /* { dg-error "error" "int unsigned long long void" } */
+int unsigned long long char *x651; /* { dg-error "error" "int unsigned long long char" } */
+int unsigned long long short *x652; /* { dg-error "error" "int unsigned long long short" } */
+int unsigned long long int *x653; /* { dg-error "error" "int unsigned long long int" } */
+int unsigned long long long *x654; /* { dg-error "error" "int unsigned long long long" } */
+int unsigned long long float *x655; /* { dg-error "error" "int unsigned long long float" } */
+int unsigned long long double *x656; /* { dg-error "error" "int unsigned long long double" } */
+int unsigned long long signed *x657; /* { dg-error "error" "int unsigned long long signed" } */
+int unsigned long long unsigned *x658; /* { dg-error "error" "int unsigned long long unsigned" } */
+long int long signed void *x659; /* { dg-error "error" "long int long signed void" } */
+long int long signed char *x660; /* { dg-error "error" "long int long signed char" } */
+long int long signed short *x661; /* { dg-error "error" "long int long signed short" } */
+long int long signed int *x662; /* { dg-error "error" "long int long signed int" } */
+long int long signed long *x663; /* { dg-error "error" "long int long signed long" } */
+long int long signed float *x664; /* { dg-error "error" "long int long signed float" } */
+long int long signed double *x665; /* { dg-error "error" "long int long signed double" } */
+long int long signed signed *x666; /* { dg-error "error" "long int long signed signed" } */
+long int long signed unsigned *x667; /* { dg-error "error" "long int long signed unsigned" } */
+long int long unsigned void *x668; /* { dg-error "error" "long int long unsigned void" } */
+long int long unsigned char *x669; /* { dg-error "error" "long int long unsigned char" } */
+long int long unsigned short *x670; /* { dg-error "error" "long int long unsigned short" } */
+long int long unsigned int *x671; /* { dg-error "error" "long int long unsigned int" } */
+long int long unsigned long *x672; /* { dg-error "error" "long int long unsigned long" } */
+long int long unsigned float *x673; /* { dg-error "error" "long int long unsigned float" } */
+long int long unsigned double *x674; /* { dg-error "error" "long int long unsigned double" } */
+long int long unsigned signed *x675; /* { dg-error "error" "long int long unsigned signed" } */
+long int long unsigned unsigned *x676; /* { dg-error "error" "long int long unsigned unsigned" } */
+long int signed long void *x677; /* { dg-error "error" "long int signed long void" } */
+long int signed long char *x678; /* { dg-error "error" "long int signed long char" } */
+long int signed long short *x679; /* { dg-error "error" "long int signed long short" } */
+long int signed long int *x680; /* { dg-error "error" "long int signed long int" } */
+long int signed long long *x681; /* { dg-error "error" "long int signed long long" } */
+long int signed long float *x682; /* { dg-error "error" "long int signed long float" } */
+long int signed long double *x683; /* { dg-error "error" "long int signed long double" } */
+long int signed long signed *x684; /* { dg-error "error" "long int signed long signed" } */
+long int signed long unsigned *x685; /* { dg-error "error" "long int signed long unsigned" } */
+long int unsigned long void *x686; /* { dg-error "error" "long int unsigned long void" } */
+long int unsigned long char *x687; /* { dg-error "error" "long int unsigned long char" } */
+long int unsigned long short *x688; /* { dg-error "error" "long int unsigned long short" } */
+long int unsigned long int *x689; /* { dg-error "error" "long int unsigned long int" } */
+long int unsigned long long *x690; /* { dg-error "error" "long int unsigned long long" } */
+long int unsigned long float *x691; /* { dg-error "error" "long int unsigned long float" } */
+long int unsigned long double *x692; /* { dg-error "error" "long int unsigned long double" } */
+long int unsigned long signed *x693; /* { dg-error "error" "long int unsigned long signed" } */
+long int unsigned long unsigned *x694; /* { dg-error "error" "long int unsigned long unsigned" } */
+long long int signed void *x695; /* { dg-error "error" "long long int signed void" } */
+long long int signed char *x696; /* { dg-error "error" "long long int signed char" } */
+long long int signed short *x697; /* { dg-error "error" "long long int signed short" } */
+long long int signed int *x698; /* { dg-error "error" "long long int signed int" } */
+long long int signed long *x699; /* { dg-error "error" "long long int signed long" } */
+long long int signed float *x700; /* { dg-error "error" "long long int signed float" } */
+long long int signed double *x701; /* { dg-error "error" "long long int signed double" } */
+long long int signed signed *x702; /* { dg-error "error" "long long int signed signed" } */
+long long int signed unsigned *x703; /* { dg-error "error" "long long int signed unsigned" } */
+long long int unsigned void *x704; /* { dg-error "error" "long long int unsigned void" } */
+long long int unsigned char *x705; /* { dg-error "error" "long long int unsigned char" } */
+long long int unsigned short *x706; /* { dg-error "error" "long long int unsigned short" } */
+long long int unsigned int *x707; /* { dg-error "error" "long long int unsigned int" } */
+long long int unsigned long *x708; /* { dg-error "error" "long long int unsigned long" } */
+long long int unsigned float *x709; /* { dg-error "error" "long long int unsigned float" } */
+long long int unsigned double *x710; /* { dg-error "error" "long long int unsigned double" } */
+long long int unsigned signed *x711; /* { dg-error "error" "long long int unsigned signed" } */
+long long int unsigned unsigned *x712; /* { dg-error "error" "long long int unsigned unsigned" } */
+long long signed int void *x713; /* { dg-error "error" "long long signed int void" } */
+long long signed int char *x714; /* { dg-error "error" "long long signed int char" } */
+long long signed int short *x715; /* { dg-error "error" "long long signed int short" } */
+long long signed int int *x716; /* { dg-error "error" "long long signed int int" } */
+long long signed int long *x717; /* { dg-error "error" "long long signed int long" } */
+long long signed int float *x718; /* { dg-error "error" "long long signed int float" } */
+long long signed int double *x719; /* { dg-error "error" "long long signed int double" } */
+long long signed int signed *x720; /* { dg-error "error" "long long signed int signed" } */
+long long signed int unsigned *x721; /* { dg-error "error" "long long signed int unsigned" } */
+long long unsigned int void *x722; /* { dg-error "error" "long long unsigned int void" } */
+long long unsigned int char *x723; /* { dg-error "error" "long long unsigned int char" } */
+long long unsigned int short *x724; /* { dg-error "error" "long long unsigned int short" } */
+long long unsigned int int *x725; /* { dg-error "error" "long long unsigned int int" } */
+long long unsigned int long *x726; /* { dg-error "error" "long long unsigned int long" } */
+long long unsigned int float *x727; /* { dg-error "error" "long long unsigned int float" } */
+long long unsigned int double *x728; /* { dg-error "error" "long long unsigned int double" } */
+long long unsigned int signed *x729; /* { dg-error "error" "long long unsigned int signed" } */
+long long unsigned int unsigned *x730; /* { dg-error "error" "long long unsigned int unsigned" } */
+long signed int long void *x731; /* { dg-error "error" "long signed int long void" } */
+long signed int long char *x732; /* { dg-error "error" "long signed int long char" } */
+long signed int long short *x733; /* { dg-error "error" "long signed int long short" } */
+long signed int long int *x734; /* { dg-error "error" "long signed int long int" } */
+long signed int long long *x735; /* { dg-error "error" "long signed int long long" } */
+long signed int long float *x736; /* { dg-error "error" "long signed int long float" } */
+long signed int long double *x737; /* { dg-error "error" "long signed int long double" } */
+long signed int long signed *x738; /* { dg-error "error" "long signed int long signed" } */
+long signed int long unsigned *x739; /* { dg-error "error" "long signed int long unsigned" } */
+long signed long int void *x740; /* { dg-error "error" "long signed long int void" } */
+long signed long int char *x741; /* { dg-error "error" "long signed long int char" } */
+long signed long int short *x742; /* { dg-error "error" "long signed long int short" } */
+long signed long int int *x743; /* { dg-error "error" "long signed long int int" } */
+long signed long int long *x744; /* { dg-error "error" "long signed long int long" } */
+long signed long int float *x745; /* { dg-error "error" "long signed long int float" } */
+long signed long int double *x746; /* { dg-error "error" "long signed long int double" } */
+long signed long int signed *x747; /* { dg-error "error" "long signed long int signed" } */
+long signed long int unsigned *x748; /* { dg-error "error" "long signed long int unsigned" } */
+long unsigned int long void *x749; /* { dg-error "error" "long unsigned int long void" } */
+long unsigned int long char *x750; /* { dg-error "error" "long unsigned int long char" } */
+long unsigned int long short *x751; /* { dg-error "error" "long unsigned int long short" } */
+long unsigned int long int *x752; /* { dg-error "error" "long unsigned int long int" } */
+long unsigned int long long *x753; /* { dg-error "error" "long unsigned int long long" } */
+long unsigned int long float *x754; /* { dg-error "error" "long unsigned int long float" } */
+long unsigned int long double *x755; /* { dg-error "error" "long unsigned int long double" } */
+long unsigned int long signed *x756; /* { dg-error "error" "long unsigned int long signed" } */
+long unsigned int long unsigned *x757; /* { dg-error "error" "long unsigned int long unsigned" } */
+long unsigned long int void *x758; /* { dg-error "error" "long unsigned long int void" } */
+long unsigned long int char *x759; /* { dg-error "error" "long unsigned long int char" } */
+long unsigned long int short *x760; /* { dg-error "error" "long unsigned long int short" } */
+long unsigned long int int *x761; /* { dg-error "error" "long unsigned long int int" } */
+long unsigned long int long *x762; /* { dg-error "error" "long unsigned long int long" } */
+long unsigned long int float *x763; /* { dg-error "error" "long unsigned long int float" } */
+long unsigned long int double *x764; /* { dg-error "error" "long unsigned long int double" } */
+long unsigned long int signed *x765; /* { dg-error "error" "long unsigned long int signed" } */
+long unsigned long int unsigned *x766; /* { dg-error "error" "long unsigned long int unsigned" } */
+signed int long long void *x767; /* { dg-error "error" "signed int long long void" } */
+signed int long long char *x768; /* { dg-error "error" "signed int long long char" } */
+signed int long long short *x769; /* { dg-error "error" "signed int long long short" } */
+signed int long long int *x770; /* { dg-error "error" "signed int long long int" } */
+signed int long long long *x771; /* { dg-error "error" "signed int long long long" } */
+signed int long long float *x772; /* { dg-error "error" "signed int long long float" } */
+signed int long long double *x773; /* { dg-error "error" "signed int long long double" } */
+signed int long long signed *x774; /* { dg-error "error" "signed int long long signed" } */
+signed int long long unsigned *x775; /* { dg-error "error" "signed int long long unsigned" } */
+signed long int long void *x776; /* { dg-error "error" "signed long int long void" } */
+signed long int long char *x777; /* { dg-error "error" "signed long int long char" } */
+signed long int long short *x778; /* { dg-error "error" "signed long int long short" } */
+signed long int long int *x779; /* { dg-error "error" "signed long int long int" } */
+signed long int long long *x780; /* { dg-error "error" "signed long int long long" } */
+signed long int long float *x781; /* { dg-error "error" "signed long int long float" } */
+signed long int long double *x782; /* { dg-error "error" "signed long int long double" } */
+signed long int long signed *x783; /* { dg-error "error" "signed long int long signed" } */
+signed long int long unsigned *x784; /* { dg-error "error" "signed long int long unsigned" } */
+signed long long int void *x785; /* { dg-error "error" "signed long long int void" } */
+signed long long int char *x786; /* { dg-error "error" "signed long long int char" } */
+signed long long int short *x787; /* { dg-error "error" "signed long long int short" } */
+signed long long int int *x788; /* { dg-error "error" "signed long long int int" } */
+signed long long int long *x789; /* { dg-error "error" "signed long long int long" } */
+signed long long int float *x790; /* { dg-error "error" "signed long long int float" } */
+signed long long int double *x791; /* { dg-error "error" "signed long long int double" } */
+signed long long int signed *x792; /* { dg-error "error" "signed long long int signed" } */
+signed long long int unsigned *x793; /* { dg-error "error" "signed long long int unsigned" } */
+unsigned int long long void *x794; /* { dg-error "error" "unsigned int long long void" } */
+unsigned int long long char *x795; /* { dg-error "error" "unsigned int long long char" } */
+unsigned int long long short *x796; /* { dg-error "error" "unsigned int long long short" } */
+unsigned int long long int *x797; /* { dg-error "error" "unsigned int long long int" } */
+unsigned int long long long *x798; /* { dg-error "error" "unsigned int long long long" } */
+unsigned int long long float *x799; /* { dg-error "error" "unsigned int long long float" } */
+unsigned int long long double *x800; /* { dg-error "error" "unsigned int long long double" } */
+unsigned int long long signed *x801; /* { dg-error "error" "unsigned int long long signed" } */
+unsigned int long long unsigned *x802; /* { dg-error "error" "unsigned int long long unsigned" } */
+unsigned long int long void *x803; /* { dg-error "error" "unsigned long int long void" } */
+unsigned long int long char *x804; /* { dg-error "error" "unsigned long int long char" } */
+unsigned long int long short *x805; /* { dg-error "error" "unsigned long int long short" } */
+unsigned long int long int *x806; /* { dg-error "error" "unsigned long int long int" } */
+unsigned long int long long *x807; /* { dg-error "error" "unsigned long int long long" } */
+unsigned long int long float *x808; /* { dg-error "error" "unsigned long int long float" } */
+unsigned long int long double *x809; /* { dg-error "error" "unsigned long int long double" } */
+unsigned long int long signed *x810; /* { dg-error "error" "unsigned long int long signed" } */
+unsigned long int long unsigned *x811; /* { dg-error "error" "unsigned long int long unsigned" } */
+unsigned long long int void *x812; /* { dg-error "error" "unsigned long long int void" } */
+unsigned long long int char *x813; /* { dg-error "error" "unsigned long long int char" } */
+unsigned long long int short *x814; /* { dg-error "error" "unsigned long long int short" } */
+unsigned long long int int *x815; /* { dg-error "error" "unsigned long long int int" } */
+unsigned long long int long *x816; /* { dg-error "error" "unsigned long long int long" } */
+unsigned long long int float *x817; /* { dg-error "error" "unsigned long long int float" } */
+unsigned long long int double *x818; /* { dg-error "error" "unsigned long long int double" } */
+unsigned long long int signed *x819; /* { dg-error "error" "unsigned long long int signed" } */
+unsigned long long int unsigned *x820; /* { dg-error "error" "unsigned long long int unsigned" } */
index 4f2b90b..3c5d9bd 100644 (file)
@@ -1,15 +1,15 @@
 /* Invalid __thread specifiers.  */
 
 /* Invalid __thread specifiers.  */
 
-__thread extern int g1;                /* { dg-error "`__thread' before `extern'" } */
-__thread static int g2;                /* { dg-error "`__thread' before `static'" } */
-__thread __thread int g3;      /* { dg-error "duplicate `__thread'" } */
+__thread extern int g1;                /* { dg-error "'__thread' before 'extern'" } */
+__thread static int g2;                /* { dg-error "'__thread' before 'static'" } */
+__thread __thread int g3;      /* { dg-error "duplicate '__thread'" } */
 typedef __thread int g4;       /* { dg-error "multiple storage classes" } */
 
 void foo()
 {
   __thread int l1;             /* { dg-error "implicitly auto and declared `__thread'" } */
   auto __thread int l2;                /* { dg-error "multiple storage classes" } */
 typedef __thread int g4;       /* { dg-error "multiple storage classes" } */
 
 void foo()
 {
   __thread int l1;             /* { dg-error "implicitly auto and declared `__thread'" } */
   auto __thread int l2;                /* { dg-error "multiple storage classes" } */
-  __thread extern int l3;      /* { dg-error "`__thread' before `extern'" } */
+  __thread extern int l3;      /* { dg-error "'__thread' before 'extern'" } */
   register __thread int l4;    /* { dg-error "multiple storage classes" } */
 }
 
   register __thread int l4;    /* { dg-error "multiple storage classes" } */
 }