* c-typeprint.c (c_type_print_base): Don't print typedef'd names
authorJim Kingdon <jkingdon@engr.sgi.com>
Mon, 24 May 1993 15:44:12 +0000 (15:44 +0000)
committerJim Kingdon <jkingdon@engr.sgi.com>
Mon, 24 May 1993 15:44:12 +0000 (15:44 +0000)
as struct, union, or enum tags.

gdb/ChangeLog
gdb/c-typeprint.c

index e7f647dad2e40d172d4924ef890cadefe83d0df4..5d683063992b46357b6580647d52bb0010399b23 100644 (file)
@@ -1,3 +1,8 @@
+Mon May 24 10:01:10 1993  Jim Kingdon  (kingdon@lioth.cygnus.com)
+
+       * c-typeprint.c (c_type_print_base): Don't print typedef'd names
+       as struct, union, or enum tags.
+
 Mon May 24 01:10:01 1993  Peter Schauer  (pes@regent.e-technik.tu-muenchen.de)
 
        * symmisc.c (dump_msymbols): Avoid gdb coredump with stripped
index 479d5d7c54390a1306d6bccd9bb878249e284111..75913178bad9c6792c8cac0f40538d44f7f102d3 100644 (file)
@@ -492,19 +492,66 @@ c_type_print_base (type, stream, show, level)
       break;
 
     case TYPE_CODE_STRUCT:
-      fprintf_filtered (stream,
-                       HAVE_CPLUS_STRUCT (type) ? "class " : "struct ");
+      if (HAVE_CPLUS_STRUCT (type))
+       {
+         /* Always print it as "class foo" even if foo is a typedef'd
+            name, not a tag.  */
+         fprintf_filtered (stream, "class ");
+         name = type_name_no_tag (type);
+         if (name != NULL)
+           {
+             fputs_filtered (name, stream);
+             fputs_filtered (" ", stream);
+             wrap_here ("    ");
+           }
+       }
+      else
+       {
+         fprintf_filtered (stream, "struct ");
+         name = TYPE_NAME (type);
+         /* If the name does not start with "struct " it means that the
+            type was defined without a tag, so don't print a tag.  It is
+            possible that we should have a better way of distinguising
+            tag names from typedef'd names.  (e.g. a new tagname field in
+            the struct type).  */
+         if (strncmp (name, "struct ", 7) == 0)
+           {
+             fputs_filtered (name + 7, stream);
+             fputs_filtered (" ", stream);
+           }
+       }
       goto struct_union;
 
     case TYPE_CODE_UNION:
       fprintf_filtered (stream, "union ");
-    struct_union:
-      if ((name = type_name_no_tag (type)) != NULL)
+      if (HAVE_CPLUS_STRUCT (type))
        {
-         fputs_filtered (name, stream);
-         fputs_filtered (" ", stream);
-         wrap_here ("    ");
+         /* Always print it as "union foo" even if foo is a typedef'd
+            name, not a tag.  */
+         name = type_name_no_tag (type);
+         if (name != NULL)
+           {
+             fputs_filtered (name, stream);
+             fputs_filtered (" ", stream);
+             wrap_here ("    ");
+           }
        }
+      else
+       {
+         name = TYPE_NAME (type);
+         /* If the name does not start with "union " it means that the
+            type was defined without a tag, so don't print a tag.  It is
+            possible that we should have a better way of distinguising
+            tag names from typedef'd names.  (e.g. a new tagname field in
+            the struct type).  */
+         if (strncmp (name, "union ", 6) == 0)
+           {
+             fputs_filtered (name + 6, stream);
+             fputs_filtered (" ", stream);
+           }
+       }
+    struct_union:
+      wrap_here ("    ");
       if (show < 0)
        fprintf_filtered (stream, "{...}");
       else
@@ -692,11 +739,19 @@ c_type_print_base (type, stream, show, level)
 
     case TYPE_CODE_ENUM:
       fprintf_filtered (stream, "enum ");
-      if ((name = type_name_no_tag (type)) != NULL)
+      name = TYPE_NAME (type);
+
+      /* If the name does not start with "enum " it means that the
+        type was defined without a tag, so don't print a tag.  It is
+        possible that we should have a better way of distinguising
+        tag names from typedef'd names.  (e.g. a new tagname field in
+        the struct type).  */
+      if (name != NULL && strncmp (name, "enum ", 5) == 0)
        {
-         fputs_filtered (name, stream);
+         fputs_filtered (name + 5, stream);
          fputs_filtered (" ", stream);
        }
+
       wrap_here ("    ");
       if (show < 0)
        fprintf_filtered (stream, "{...}");