OSDN Git Service

2010-04-12 Richard Guenther <rguenther@suse.de>
[pf3gnuchains/gcc-fork.git] / gcc / gengtype-parse.c
index 7cd66cf..c6b6e93 100644 (file)
@@ -141,6 +141,8 @@ parse_error (const char *msg, ...)
   vfprintf (stderr, msg, ap);
   va_end (ap);
 
+  fputc ('\n', stderr);
+
   hit_error = true;
 }
 
@@ -197,9 +199,9 @@ string_seq (void)
 
       l1 = strlen (s1);
       l2 = strlen (s2);
-      buf = XRESIZEVEC (char, s1, l1 + l2 + 1);
+      buf = XRESIZEVEC (char, CONST_CAST(char *, s1), l1 + l2 + 1);
       memcpy (buf + l1, s2, l2 + 1);
-      XDELETE (s2);
+      XDELETE (CONST_CAST (char *, s2));
       s1 = buf;
     }
   return s1;
@@ -221,8 +223,8 @@ typedef_name (void)
       c2 = require (ID);
       require (')');
       r = concat ("VEC_", c1, "_", c2, (char *)0);
-      free ((void *)c1);
-      free ((void *)c2);
+      free (CONST_CAST (char *, c1));
+      free (CONST_CAST (char *, c2));
       return r;
     }
   else
@@ -677,7 +679,6 @@ static type_p
 type (options_p *optsp, bool nested)
 {
   const char *s;
-  bool is_union;
   *optsp = 0;
   switch (token ())
     {
@@ -694,15 +695,17 @@ type (options_p *optsp, bool nested)
     case UNION:
       {
        options_p opts = 0;
-
-       is_union = (token() == UNION);
+    /* GTY annotations follow attribute syntax
+       GTY_BEFORE_ID is for union/struct declarations
+       GTY_AFTER_ID is for variable declarations.  */
+    enum {
+        NO_GTY,
+        GTY_BEFORE_ID,
+        GTY_AFTER_ID
+    } is_gty = NO_GTY;
+    bool is_union = (token () == UNION);
        advance ();
 
-       if (token () == ID)
-         s = advance ();
-       else
-         s = xasprintf ("anonymous:%s:%d", lexer_line.file, lexer_line.line);
-
        /* Top-level structures that are not explicitly tagged GTY(())
           are treated as mere forward declarations.  This is because
           there are a lot of structures that we don't need to know
@@ -710,18 +713,40 @@ type (options_p *optsp, bool nested)
           that we can't handle.  */
        if (nested || token () == GTY_TOKEN)
          {
-           opts = gtymarker_opt ();
-           if (token () == '{')
-             {
-               pair_p fields;
-               advance ();
-               fields = struct_field_seq ();
-               require ('}');
-               return new_structure (s, is_union, &lexer_line, fields, opts);
-             }
+        is_gty = GTY_BEFORE_ID;
+        opts = gtymarker_opt ();
+         }
+
+       if (token () == ID)
+         s = advance ();
+       else
+         s = xasprintf ("anonymous:%s:%d", lexer_line.file, lexer_line.line);
+
+        /* Unfortunately above GTY_TOKEN check does not capture the
+           typedef struct_type GTY case.  */
+       if (token () == GTY_TOKEN)
+         {
+        is_gty = GTY_AFTER_ID;
+        opts = gtymarker_opt ();
          }
-       else if (token () == '{')
-         consume_balanced ('{', '}');
+
+    if (is_gty)
+      {
+        if (token () == '{')
+          {
+            pair_p fields;
+
+            if (is_gty == GTY_AFTER_ID)
+                parse_error ("GTY must be specified before identifier");
+
+            advance ();
+            fields = struct_field_seq ();
+            require ('}');
+            return new_structure (s, is_union, &lexer_line, fields, opts);
+          }
+      }
+    else if (token () == '{')
+      consume_balanced ('{', '}');
        if (opts)
          *optsp = opts;
        return find_structure (s, is_union);