* mips-tdep.c (mips_gdbarch_init): Use Tag_GNU_MIPS_ABI_FP to
[deliverable/binutils-gdb.git] / gdb / c-typeprint.c
index c9a644229bb5defa4ee0eddcf0b03ba206359a44..5d1fe6d19393de3ca94a762f97e34fd27d3928a8 100644 (file)
@@ -1,7 +1,6 @@
 /* Support for printing C and C++ types for GDB, the GNU debugger.
-   Copyright 1986, 1988, 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1998,
-   1999, 2000, 2001, 2002, 2003
-   Free Software Foundation, Inc.
+   Copyright (C) 1986, 1988, 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1998,
+   1999, 2000, 2001, 2002, 2003, 2006, 2007 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -17,8 +16,8 @@
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.  */
+   Foundation, Inc., 51 Franklin Street, Fifth Floor,
+   Boston, MA 02110-1301, USA.  */
 
 #include "defs.h"
 #include "gdb_obstack.h"
@@ -80,7 +79,8 @@ c_print_type (struct type *type, char *varstring, struct ui_file *stream,
        (code == TYPE_CODE_PTR || code == TYPE_CODE_FUNC
        || code == TYPE_CODE_METHOD
        || code == TYPE_CODE_ARRAY
-       || code == TYPE_CODE_MEMBER
+       || code == TYPE_CODE_MEMBERPTR
+       || code == TYPE_CODE_METHODPTR
        || code == TYPE_CODE_REF)))
     fputs_filtered (" ", stream);
   need_post_space = (varstring != NULL && strcmp (varstring, "") != 0);
@@ -218,29 +218,25 @@ c_type_print_varspec_prefix (struct type *type, struct ui_file *stream,
       c_type_print_modifier (type, stream, 1, need_post_space);
       break;
 
-    case TYPE_CODE_MEMBER:
-      if (passed_a_ptr)
-       fprintf_filtered (stream, "(");
+    case TYPE_CODE_MEMBERPTR:
       c_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, show, 0, 0);
-      fprintf_filtered (stream, " ");
       name = type_name_no_tag (TYPE_DOMAIN_TYPE (type));
       if (name)
        fputs_filtered (name, stream);
       else
        c_type_print_base (TYPE_DOMAIN_TYPE (type), stream, 0, passed_a_ptr);
-      fprintf_filtered (stream, "::");
+      fprintf_filtered (stream, "::*");
       break;
 
-    case TYPE_CODE_METHOD:
-      if (passed_a_ptr)
-       fprintf_filtered (stream, "(");
+    case TYPE_CODE_METHODPTR:
       c_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, show, 0, 0);
-      if (passed_a_ptr)
-       {
-         fprintf_filtered (stream, " ");
-         c_type_print_base (TYPE_DOMAIN_TYPE (type), stream, 0, passed_a_ptr);
-         fprintf_filtered (stream, "::");
-       }
+      fprintf_filtered (stream, "(");
+      name = type_name_no_tag (TYPE_DOMAIN_TYPE (type));
+      if (name)
+       fputs_filtered (name, stream);
+      else
+       c_type_print_base (TYPE_DOMAIN_TYPE (type), stream, 0, passed_a_ptr);
+      fprintf_filtered (stream, "::*");
       break;
 
     case TYPE_CODE_REF:
@@ -249,6 +245,7 @@ c_type_print_varspec_prefix (struct type *type, struct ui_file *stream,
       c_type_print_modifier (type, stream, 1, need_post_space);
       break;
 
+    case TYPE_CODE_METHOD:
     case TYPE_CODE_FUNC:
       c_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, show, 0, 0);
       if (passed_a_ptr)
@@ -286,7 +283,7 @@ c_type_print_varspec_prefix (struct type *type, struct ui_file *stream,
          gcc -Wall will reveal any types that haven't been handled.  */
       break;
     default:
-      error ("type not handled in c_type_print_varspec_prefix()");
+      error (_("type not handled in c_type_print_varspec_prefix()"));
       break;
     }
 }
@@ -337,42 +334,49 @@ c_type_print_modifier (struct type *type, struct ui_file *stream,
 }
 
 
-
+/* Print out the arguments of TYPE, which should have TYPE_CODE_METHOD
+   or TYPE_CODE_FUNC, to STREAM.  Artificial arguments, such as "this"
+   in non-static methods, are displayed.  */
 
 static void
 c_type_print_args (struct type *type, struct ui_file *stream)
 {
-  int i;
+  int i, len;
   struct field *args;
+  int printed_any = 0;
 
   fprintf_filtered (stream, "(");
   args = TYPE_FIELDS (type);
-  if (args != NULL)
-    {
-      int i;
-
-      /* FIXME drow/2002-05-31: Always skips the first argument,
-        should we be checking for static members?  */
+  len = TYPE_NFIELDS (type);
 
-      for (i = 1; i < TYPE_NFIELDS (type); i++)
+  for (i = 0; i < TYPE_NFIELDS (type); i++)
+    {
+      if (printed_any)
        {
-         c_print_type (args[i].type, "", stream, -1, 0);
-         if (i != TYPE_NFIELDS (type))
-           {
-             fprintf_filtered (stream, ",");
-             wrap_here ("    ");
-           }
+         fprintf_filtered (stream, ", ");
+         wrap_here ("    ");
        }
-      if (TYPE_VARARGS (type))
-       fprintf_filtered (stream, "...");
-      else if (i == 1
-              && (current_language->la_language == language_cplus))
-       fprintf_filtered (stream, "void");
+
+      c_print_type (TYPE_FIELD_TYPE (type, i), "", stream, -1, 0);
+      printed_any = 1;
     }
-  else if (current_language->la_language == language_cplus)
+
+  if (printed_any && TYPE_VARARGS (type))
     {
-      fprintf_filtered (stream, "void");
+      /* Print out a trailing ellipsis for varargs functions.  Ignore
+        TYPE_VARARGS if the function has no named arguments; that
+        represents unprototyped (K&R style) C functions.  */
+      if (printed_any && TYPE_VARARGS (type))
+       {
+         fprintf_filtered (stream, ", ");
+         wrap_here ("    ");
+         fprintf_filtered (stream, "...");
+       }
     }
+  else if (!printed_any
+      && (TYPE_PROTOTYPED (type)
+         || current_language->la_language == language_cplus))
+    fprintf_filtered (stream, "void");
 
   fprintf_filtered (stream, ")");
 }
@@ -537,7 +541,7 @@ c_type_print_varspec_suffix (struct type *type, struct ui_file *stream,
        fprintf_filtered (stream, ")");
 
       fprintf_filtered (stream, "[");
-      if (TYPE_LENGTH (type) >= 0 && TYPE_LENGTH (TYPE_TARGET_TYPE (type)) > 0
+      if (TYPE_LENGTH (TYPE_TARGET_TYPE (type)) > 0
        && TYPE_ARRAY_UPPER_BOUND_TYPE (type) != BOUND_CANNOT_BE_DETERMINED)
        fprintf_filtered (stream, "%d",
                          (TYPE_LENGTH (type)
@@ -548,22 +552,15 @@ c_type_print_varspec_suffix (struct type *type, struct ui_file *stream,
                                   0, 0);
       break;
 
-    case TYPE_CODE_MEMBER:
-      if (passed_a_ptr)
-       fprintf_filtered (stream, ")");
+    case TYPE_CODE_MEMBERPTR:
       c_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, show,
                                   0, 0);
       break;
 
-    case TYPE_CODE_METHOD:
-      if (passed_a_ptr)
-       fprintf_filtered (stream, ")");
+    case TYPE_CODE_METHODPTR:
+      fprintf_filtered (stream, ")");
       c_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, show,
                                   0, 0);
-      if (passed_a_ptr)
-       {
-         c_type_print_args (type, stream);
-       }
       break;
 
     case TYPE_CODE_PTR:
@@ -572,31 +569,12 @@ c_type_print_varspec_suffix (struct type *type, struct ui_file *stream,
                                   1, 0);
       break;
 
+    case TYPE_CODE_METHOD:
     case TYPE_CODE_FUNC:
       if (passed_a_ptr)
        fprintf_filtered (stream, ")");
       if (!demangled_args)
-       {
-         int i, len = TYPE_NFIELDS (type);
-         fprintf_filtered (stream, "(");
-         if (len == 0
-              && (TYPE_PROTOTYPED (type)
-                  || current_language->la_language == language_cplus))
-           {
-             fprintf_filtered (stream, "void");
-           }
-         else
-           for (i = 0; i < len; i++)
-             {
-               if (i > 0)
-                 {
-                   fputs_filtered (", ", stream);
-                   wrap_here ("    ");
-                 }
-               c_print_type (TYPE_FIELD_TYPE (type, i), "", stream, -1, 0);
-             }
-         fprintf_filtered (stream, ")");
-       }
+       c_type_print_args (type, stream);
       c_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, show,
                                   passed_a_ptr, 0);
       break;
@@ -627,7 +605,7 @@ c_type_print_varspec_suffix (struct type *type, struct ui_file *stream,
          gcc -Wall will report types that may not have been considered.  */
       break;
     default:
-      error ("type not handled in c_type_print_varspec_suffix()");
+      error (_("type not handled in c_type_print_varspec_suffix()"));
       break;
     }
 }
@@ -671,7 +649,7 @@ c_type_print_base (struct type *type, struct ui_file *stream, int show,
   wrap_here ("    ");
   if (type == NULL)
     {
-      fputs_filtered ("<type unknown>", stream);
+      fputs_filtered (_("<type unknown>"), stream);
       return;
     }
 
@@ -696,10 +674,11 @@ c_type_print_base (struct type *type, struct ui_file *stream, int show,
     case TYPE_CODE_TYPEDEF:
     case TYPE_CODE_ARRAY:
     case TYPE_CODE_PTR:
-    case TYPE_CODE_MEMBER:
+    case TYPE_CODE_MEMBERPTR:
     case TYPE_CODE_REF:
     case TYPE_CODE_FUNC:
     case TYPE_CODE_METHOD:
+    case TYPE_CODE_METHODPTR:
       c_type_print_base (TYPE_TARGET_TYPE (type), stream, show, level);
       break;
 
@@ -770,9 +749,9 @@ c_type_print_base (struct type *type, struct ui_file *stream, int show,
          if ((TYPE_NFIELDS (type) == 0) && (TYPE_NFN_FIELDS (type) == 0))
            {
              if (TYPE_STUB (type))
-               fprintfi_filtered (level + 4, stream, "<incomplete type>\n");
+               fprintfi_filtered (level + 4, stream, _("<incomplete type>\n"));
              else
-               fprintfi_filtered (level + 4, stream, "<no data fields>\n");
+               fprintfi_filtered (level + 4, stream, _("<no data fields>\n"));
            }
 
          /* Start off with no specific section type, so we can print
@@ -990,7 +969,7 @@ c_type_print_base (struct type *type, struct ui_file *stream, int show,
                  if (TYPE_TARGET_TYPE (TYPE_FN_FIELD_TYPE (f, j)) == 0)
                    {
                      /* Keep GDB from crashing here.  */
-                     fprintf_filtered (stream, "<undefined type> %s;\n",
+                     fprintf_filtered (stream, _("<undefined type> %s;\n"),
                                        TYPE_FN_FIELD_PHYSNAME (f, j));
                      break;
                    }
@@ -1029,7 +1008,7 @@ c_type_print_base (struct type *type, struct ui_file *stream, int show,
                                                     stream);
                        }
                      else
-                       fprintf_filtered (stream, "<badly mangled name '%s'>",
+                       fprintf_filtered (stream, _("<badly mangled name '%s'>"),
                                          mangled_name);
                    }
                  else
@@ -1064,7 +1043,7 @@ c_type_print_base (struct type *type, struct ui_file *stream, int show,
          fprintfi_filtered (level, stream, "}");
 
          if (TYPE_LOCALTYPE_PTR (type) && show >= 0)
-           fprintfi_filtered (level, stream, " (Local at %s:%d)\n",
+           fprintfi_filtered (level, stream, _(" (Local at %s:%d)\n"),
                               TYPE_LOCALTYPE_FILE (type),
                               TYPE_LOCALTYPE_LINE (type));
        }
@@ -1074,19 +1053,6 @@ c_type_print_base (struct type *type, struct ui_file *stream, int show,
 
     case TYPE_CODE_ENUM:
       c_type_print_modifier (type, stream, 0, 1);
-      /* HP C supports sized enums */
-      if (deprecated_hp_som_som_object_present)
-       switch (TYPE_LENGTH (type))
-         {
-         case 1:
-           fputs_filtered ("char ", stream);
-           break;
-         case 2:
-           fputs_filtered ("short ", stream);
-           break;
-         default:
-           break;
-         }
       fprintf_filtered (stream, "enum ");
       /* Print the tag name if it exists.
          The aCC compiler emits a spurious 
@@ -1136,16 +1102,16 @@ c_type_print_base (struct type *type, struct ui_file *stream, int show,
       break;
 
     case TYPE_CODE_UNDEF:
-      fprintf_filtered (stream, "struct <unknown>");
+      fprintf_filtered (stream, _("struct <unknown>"));
       break;
 
     case TYPE_CODE_ERROR:
-      fprintf_filtered (stream, "<unknown type>");
+      fprintf_filtered (stream, _("<unknown type>"));
       break;
 
     case TYPE_CODE_RANGE:
       /* This should not occur */
-      fprintf_filtered (stream, "<range type>");
+      fprintf_filtered (stream, _("<range type>"));
       break;
 
     case TYPE_CODE_TEMPLATE:
@@ -1171,7 +1137,7 @@ c_type_print_base (struct type *type, struct ui_file *stream, int show,
     go_back:
       if (TYPE_NINSTANTIATIONS (type) > 0)
        {
-         fprintf_filtered (stream, "\ntemplate instantiations:\n");
+         fprintf_filtered (stream, _("\ntemplate instantiations:\n"));
          for (i = 0; i < TYPE_NINSTANTIATIONS (type); i++)
            {
              fprintf_filtered (stream, "  ");
@@ -1201,7 +1167,7 @@ c_type_print_base (struct type *type, struct ui_file *stream, int show,
        {
          /* At least for dump_symtab, it is important that this not be
             an error ().  */
-         fprintf_filtered (stream, "<invalid type code %d>",
+         fprintf_filtered (stream, _("<invalid type code %d>"),
                            TYPE_CODE (type));
        }
       break;
This page took 0.028094 seconds and 4 git commands to generate.