Sigh, should have updated the copyright date in the
[deliverable/binutils-gdb.git] / gdb / c-typeprint.c
index c83002956867b385493e7e43c1652d63d4ab6ca3..0c460e9dd5f77b998f2d3a13ac0c8b2d7c3715eb 100644 (file)
@@ -1,6 +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
+   1999, 2000, 2001, 2002
    Free Software Foundation, Inc.
 
    This file is part of GDB.
@@ -402,12 +402,20 @@ is_type_conversion_operator (struct type *type, int i, int j)
   while (strchr (" \t\f\n\r", *name))
     name++;
 
-  if (strncmp (name, "new", 3) == 0)
+  if (!('a' <= *name && *name <= 'z')
+      && !('A' <= *name && *name <= 'Z')
+      && *name != '_')
+    /* If this doesn't look like the start of an identifier, then it
+       isn't a type conversion operator.  */
+    return 0;
+  else if (strncmp (name, "new", 3) == 0)
     name += 3;
   else if (strncmp (name, "delete", 6) == 0)
     name += 6;
   else
-    return 0;
+    /* If it doesn't look like new or delete, it's a type conversion
+       operator.  */
+    return 1;
 
   /* Is that really the end of the name?  */
   if (('a' <= *name && *name <= 'z')
@@ -568,7 +576,9 @@ c_type_print_varspec_suffix (struct type *type, struct ui_file *stream,
        {
          int i, len = TYPE_NFIELDS (type);
          fprintf_filtered (stream, "(");
-         if ((len == 0) && (current_language->la_language == language_cplus))
+         if (len == 0
+              && (TYPE_PROTOTYPED (type)
+                  || current_language->la_language == language_cplus))
            {
              fprintf_filtered (stream, "void");
            }
@@ -634,9 +644,9 @@ void
 c_type_print_base (struct type *type, struct ui_file *stream, int show,
                   int level)
 {
-  register int i;
-  register int len;
-  register int lastval;
+  int i;
+  int len, real_len;
+  int lastval;
   char *mangled_name;
   char *demangled_name;
   char *demangled_no_static;
@@ -751,7 +761,7 @@ c_type_print_base (struct type *type, struct ui_file *stream, int show,
          fprintf_filtered (stream, "{\n");
          if ((TYPE_NFIELDS (type) == 0) && (TYPE_NFN_FIELDS (type) == 0))
            {
-             if (TYPE_FLAGS (type) & TYPE_FLAG_STUB)
+             if (TYPE_STUB (type))
                fprintfi_filtered (level + 4, stream, "<incomplete type>\n");
              else
                fprintfi_filtered (level + 4, stream, "<no data fields>\n");
@@ -899,9 +909,21 @@ c_type_print_base (struct type *type, struct ui_file *stream, int show,
              fprintf_filtered (stream, ";\n");
            }
 
-         /* If there are both fields and methods, put a space between. */
+         /* If there are both fields and methods, put a blank line
+             between them.  Make sure to count only method that we will
+             display; artificial methods will be hidden.  */
          len = TYPE_NFN_FIELDS (type);
-         if (len && section_type != s_none)
+         real_len = 0;
+         for (i = 0; i < len; i++)
+           {
+             struct fn_field *f = TYPE_FN_FIELDLIST1 (type, i);
+             int len2 = TYPE_FN_FIELDLIST_LENGTH (type, i);
+             int j;
+             for (j = 0; j < len2; j++)
+               if (!TYPE_FN_FIELD_ARTIFICIAL (f, j))
+                 real_len++;
+           }
+         if (real_len > 0 && section_type != s_none)
            fprintf_filtered (stream, "\n");
 
          /* C++: print out the methods */
@@ -920,6 +942,9 @@ c_type_print_base (struct type *type, struct ui_file *stream, int show,
                   || is_destructor_name (physname)
                   || method_name[0] == '~';
 
+                 /* Do not print out artificial methods.  */
+                 if (TYPE_FN_FIELD_ARTIFICIAL (f, j))
+                   continue;
 
                  QUIT;
                  if (TYPE_FN_FIELD_PROTECTED (f, j))
This page took 0.02458 seconds and 4 git commands to generate.