* gdbserver/{remote-gutils.c remote-server.c Makefile.in
[deliverable/binutils-gdb.git] / gdb / c-typeprint.c
index 16123afda769bdabe5840a55e1add965d071f047..75913178bad9c6792c8cac0f40538d44f7f102d3 100644 (file)
@@ -87,12 +87,10 @@ c_typedef_print (type, new, stream)
       type_print(type,"",stream,0);
       break;
 #endif
-/* start-sanitize-chill */
 #ifdef _LANG_chill
    case language_chill:
       error ("Missing Chill support in function c_typedef_print."); /*FIXME*/
 #endif
-/* end-sanitize-chill */
    default:
       error("Language not supported.");
    }
@@ -151,8 +149,8 @@ cp_type_print_method_args (args, prefix, varstring, staticp, stream)
 {
   int i;
 
-  fputs_demangled (prefix, stream, DMGL_ANSI, language_cplus);
-  fputs_demangled (varstring, stream, DMGL_ANSI, language_cplus);
+  fprintf_symbol_filtered (stream, prefix, language_cplus, DMGL_ANSI);
+  fprintf_symbol_filtered (stream, varstring, language_cplus, DMGL_ANSI);
   fputs_filtered (" (", stream);
   if (args && args[!staticp] && args[!staticp]->code != TYPE_CODE_VOID)
     {
@@ -494,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
@@ -694,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, "{...}");
This page took 0.025114 seconds and 4 git commands to generate.