* symfile.c (reread_symbols): When re-reading symbols, do all the
[binutils-gdb.git] / gdb / c-typeprint.c
index 40e3f52369c5515874746a1e648b0a4fffb5748d..fa4035b00ac872762c2cf19db9cbf789c2a92706 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 | DMGL_PARAMS);
-  fputs_demangled (varstring, stream, DMGL_ANSI | DMGL_PARAMS);
+  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)
     {
@@ -307,7 +305,8 @@ c_type_print_varspec_prefix (type, stream, show, passed_a_ptr)
     case TYPE_CODE_BOOL:
     case TYPE_CODE_SET:
     case TYPE_CODE_RANGE:
-    case TYPE_CODE_PASCAL_ARRAY:
+    case TYPE_CODE_STRING:
+    case TYPE_CODE_BITSTRING:
       /* These types need no prefix.  They are listed here so that
         gcc -Wall will reveal any types that haven't been handled.  */
       break;
@@ -430,7 +429,8 @@ c_type_print_varspec_suffix (type, stream, show, passed_a_ptr, demangled_args)
     case TYPE_CODE_BOOL:
     case TYPE_CODE_SET:
     case TYPE_CODE_RANGE:
-    case TYPE_CODE_PASCAL_ARRAY:
+    case TYPE_CODE_STRING:
+    case TYPE_CODE_BITSTRING:
       /* These types do not need a suffix.  They are listed so that
         gcc -Wall will report types that may not have been considered.  */
       break;
@@ -441,13 +441,16 @@ c_type_print_varspec_suffix (type, stream, show, passed_a_ptr, demangled_args)
    function value or array element), or the description of a
    structure or union.
 
-   SHOW nonzero means don't print this type as just its name;
-   show its real definition even if it has a name.
-   SHOW zero means print just typename or struct tag if there is one
-   SHOW negative means abbreviate structure elements.
-   SHOW is decremented for printing of structure elements.
+   SHOW positive means print details about the type (e.g. enum values),
+   and print structure elements passing SHOW - 1 for show.
+   SHOW zero means just print the type name or struct tag if there is one.
+   If there is no name, print something sensible but concise like
+   "struct {...}".
+   SHOW negative means the same things as SHOW zero.  The difference is that
+   zero is used for printing structure elements and -1 is used for the
+   "whatis" command.  But I don't see any need to distinguish.
 
-   LEVEL is the depth to indent by.
+   LEVEL is the number of spaces to indent by.
    We increase it for some recursive calls.  */
 
 void
@@ -457,7 +460,6 @@ c_type_print_base (type, stream, show, level)
      int show;
      int level;
 {
-  char *name;
   register int i;
   register int len;
   register int lastval;
@@ -474,9 +476,13 @@ c_type_print_base (type, stream, show, level)
     }
 
   /* When SHOW is zero or less, and there is a valid type name, then always
-     just print the type name directly from the type. */
+     just print the type name directly from the type.  */
+  /* If we have "typedef struct foo {. . .} bar;" do we want to print it
+     as "struct foo" or as "bar"?  Pick the latter, because C++ folk tend
+     to expect things like "class5 *foo" rather than "struct class5 *foo".  */
 
-  if ((show <= 0) && (TYPE_NAME (type) != NULL))
+  if (show <= 0
+      && TYPE_NAME (type) != NULL)
     {
       fputs_filtered (TYPE_NAME (type), stream);
       return;
@@ -494,22 +500,34 @@ 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))
+       {
+         fprintf_filtered (stream, "class ");
+       }
+      else
+       {
+         fprintf_filtered (stream, "struct ");
+       }
       goto struct_union;
 
     case TYPE_CODE_UNION:
       fprintf_filtered (stream, "union ");
+
     struct_union:
-      if ((name = type_name_no_tag (type)) != NULL)
+      if (TYPE_TAG_NAME (type) != NULL)
        {
-         fputs_filtered (name, stream);
-         fputs_filtered (" ", stream);
-         wrap_here ("    ");
+         fputs_filtered (TYPE_TAG_NAME (type), stream);
+         if (show > 0)
+           fputs_filtered (" ", stream);
        }
-      if (show < 0)
-       fprintf_filtered (stream, "{...}");
-      else
+      wrap_here ("    ");
+      if (show <= 0)
+       {
+         /* If we just printed a tag name, no need to print anything else.  */
+         if (TYPE_TAG_NAME (type) == NULL)
+           fprintf_filtered (stream, "{...}");
+       }
+      else if (show > 0)
        {
          check_stub_type (type);
          
@@ -608,6 +626,7 @@ c_type_print_base (type, stream, show, level)
              struct fn_field *f = TYPE_FN_FIELDLIST1 (type, i);
              int j, len2 = TYPE_FN_FIELDLIST_LENGTH (type, i);
              char *method_name = TYPE_FN_FIELDLIST_NAME (type, i);
+             char *name = type_name_no_tag (type);
              int is_constructor = name && STREQ(method_name, name);
              for (j = 0; j < len2; j++)
                {
@@ -661,15 +680,24 @@ c_type_print_base (type, stream, show, level)
                      /* Build something we can demangle.  */
                      mangled_name = gdb_mangle_name (type, i, j);
                      demangled_name =
-                         cplus_demangle (mangled_name,
-                                         DMGL_ANSI | DMGL_PARAMS);
+                       cplus_demangle (mangled_name,
+                                       DMGL_ANSI | DMGL_PARAMS);
                      if (demangled_name == NULL)
                        fprintf_filtered (stream, "<badly mangled name %s>",
-                           mangled_name);
-                     else 
+                                         mangled_name);
+                     else
                        {
-                         fprintf_filtered (stream, "%s",
-                             strchr (demangled_name, ':') + 2);
+                         char *demangled_no_class =
+                           strchr (demangled_name, ':');
+
+                         if (demangled_no_class == NULL)
+                           demangled_no_class = demangled_name;
+                         else
+                           {
+                             if (*++demangled_no_class == ':')
+                               ++demangled_no_class;
+                           }
+                         fputs_filtered (demangled_no_class, stream);
                          free (demangled_name);
                        }
                      free (mangled_name);
@@ -694,15 +722,21 @@ c_type_print_base (type, stream, show, level)
 
     case TYPE_CODE_ENUM:
       fprintf_filtered (stream, "enum ");
-      if ((name = type_name_no_tag (type)) != NULL)
+      if (TYPE_TAG_NAME (type) != NULL)
        {
-         fputs_filtered (name, stream);
-         fputs_filtered (" ", stream);
+         fputs_filtered (TYPE_TAG_NAME (type), stream);
+         if (show > 0)
+           fputs_filtered (" ", stream);
        }
+
       wrap_here ("    ");
-      if (show < 0)
-       fprintf_filtered (stream, "{...}");
-      else
+      if (show <= 0)
+       {
+         /* If we just printed a tag name, no need to print anything else.  */
+         if (TYPE_TAG_NAME (type) == NULL)
+           fprintf_filtered (stream, "{...}");
+       }
+      else if (show > 0)
        {
          fprintf_filtered (stream, "{");
          len = TYPE_NFIELDS (type);
@@ -752,7 +786,10 @@ c_type_print_base (type, stream, show, level)
        }
       else
        {
-         error ("Invalid type code (%d) in symbol table.", TYPE_CODE (type));
+         /* At least for dump_symtab, it is important that this not be
+            an error ().  */
+         fprintf_filtered (stream, "<invalid type code %d>",
+                           TYPE_CODE (type));
        }
       break;
     }