X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fc-typeprint.c;h=e02a5e30b72cd53a1aa424eb53733828c07ce641;hb=53d25da64b00c1cf7f10d04785d66fa003f8bfc9;hp=bdc5a689ee1dc8ffed41c421399d839102dad529;hpb=2adab5d0b27b20bd56853e9b0c9c6a8763699ae2;p=deliverable%2Fbinutils-gdb.git
diff --git a/gdb/c-typeprint.c b/gdb/c-typeprint.c
index bdc5a689ee..e02a5e30b7 100644
--- a/gdb/c-typeprint.c
+++ b/gdb/c-typeprint.c
@@ -1,13 +1,13 @@
/* 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
+ Copyright (C) 1986, 1988, 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1998,
+ 1999, 2000, 2001, 2002, 2003, 2006, 2007, 2008
Free Software Foundation, Inc.
This file is part of GDB.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
+ the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
@@ -16,12 +16,10 @@
GNU General Public License for more details.
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. */
+ along with this program. If not, see . */
#include "defs.h"
-#include "obstack.h"
+#include "gdb_obstack.h"
#include "bfd.h" /* Binary File Description */
#include "symtab.h"
#include "gdbtypes.h"
@@ -29,20 +27,16 @@
#include "value.h"
#include "gdbcore.h"
#include "target.h"
-#include "command.h"
-#include "gdbcmd.h"
#include "language.h"
#include "demangle.h"
#include "c-lang.h"
#include "typeprint.h"
+#include "cp-abi.h"
#include "gdb_string.h"
#include
-/* Flag indicating target was compiled by HP compiler */
-extern int hp_som_som_object_present;
-
-static void cp_type_print_method_args (struct type ** args, char *prefix,
+static void cp_type_print_method_args (struct type *mtype, char *prefix,
char *varstring, int staticp,
struct ui_file *stream);
@@ -50,11 +44,12 @@ static void c_type_print_args (struct type *, struct ui_file *);
static void cp_type_print_derivation_info (struct ui_file *, struct type *);
-void c_type_print_varspec_prefix (struct type *, struct ui_file *, int,
- int);
+static void c_type_print_varspec_prefix (struct type *, struct ui_file *, int,
+ int, int);
-static void c_type_print_cv_qualifier (struct type *, struct ui_file *,
- int, int);
+/* Print "const", "volatile", or address space modifiers. */
+static void c_type_print_modifier (struct type *, struct ui_file *,
+ int, int);
@@ -65,8 +60,9 @@ void
c_print_type (struct type *type, char *varstring, struct ui_file *stream,
int show, int level)
{
- register enum type_code code;
+ enum type_code code;
int demangled_args;
+ int need_post_space;
if (show > 0)
CHECK_TYPEDEF (type);
@@ -82,10 +78,12 @@ 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);
- c_type_print_varspec_prefix (type, stream, show, 0);
+ need_post_space = (varstring != NULL && strcmp (varstring, "") != 0);
+ c_type_print_varspec_prefix (type, stream, show, 0, need_post_space);
if (varstring != NULL)
{
@@ -147,40 +145,40 @@ cp_type_print_derivation_info (struct ui_file *stream, struct type *type)
fputs_filtered (" ", stream);
}
}
+
/* Print the C++ method arguments ARGS to the file STREAM. */
static void
-cp_type_print_method_args (struct type **args, char *prefix, char *varstring,
+cp_type_print_method_args (struct type *mtype, char *prefix, char *varstring,
int staticp, struct ui_file *stream)
{
+ struct field *args = TYPE_FIELDS (mtype);
+ int nargs = TYPE_NFIELDS (mtype);
+ int varargs = TYPE_VARARGS (mtype);
int i;
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)
+
+ /* Skip the class variable. */
+ i = staticp ? 0 : 1;
+ if (nargs > i)
{
- i = !staticp; /* skip the class variable */
- while (1)
+ while (i < nargs)
{
- type_print (args[i++], "", stream, 0);
- if (!args[i])
- {
- fprintf_filtered (stream, " ...");
- break;
- }
- else if (args[i]->code != TYPE_CODE_VOID)
- {
- fprintf_filtered (stream, ", ");
- }
- else
- break;
+ type_print (args[i++].type, "", stream, 0);
+
+ if (i == nargs && varargs)
+ fprintf_filtered (stream, ", ...");
+ else if (i < nargs)
+ fprintf_filtered (stream, ", ");
}
}
+ else if (varargs)
+ fprintf_filtered (stream, "...");
else if (current_language->la_language == language_cplus)
- {
- fprintf_filtered (stream, "void");
- }
+ fprintf_filtered (stream, "void");
fprintf_filtered (stream, ")");
}
@@ -192,11 +190,15 @@ cp_type_print_method_args (struct type **args, char *prefix, char *varstring,
On outermost call, pass 0 for PASSED_A_PTR.
On outermost call, SHOW > 0 means should ignore
any typename for TYPE and show its details.
- SHOW is always zero on recursive calls. */
+ SHOW is always zero on recursive calls.
+
+ NEED_POST_SPACE is non-zero when a space will be be needed
+ between a trailing qualifier and a field, variable, or function
+ name. */
void
c_type_print_varspec_prefix (struct type *type, struct ui_file *stream,
- int show, int passed_a_ptr)
+ int show, int passed_a_ptr, int need_post_space)
{
char *name;
if (type == 0)
@@ -210,54 +212,55 @@ c_type_print_varspec_prefix (struct type *type, struct ui_file *stream,
switch (TYPE_CODE (type))
{
case TYPE_CODE_PTR:
- c_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, 0, 1);
+ c_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, show, 1, 1);
fprintf_filtered (stream, "*");
- c_type_print_cv_qualifier (type, stream, 1, 0);
+ c_type_print_modifier (type, stream, 1, need_post_space);
break;
- case TYPE_CODE_MEMBER:
- if (passed_a_ptr)
- fprintf_filtered (stream, "(");
- c_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, 0, 0);
- fprintf_filtered (stream, " ");
+ case TYPE_CODE_MEMBERPTR:
+ c_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, show, 0, 0);
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, "(");
- c_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, 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, "::");
- }
+ case TYPE_CODE_METHODPTR:
+ 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, "::*");
break;
case TYPE_CODE_REF:
- c_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, 0, 1);
+ c_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, show, 1, 0);
fprintf_filtered (stream, "&");
- c_type_print_cv_qualifier (type, stream, 1, 0);
+ 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, 0, 0);
+ c_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, show, 0, 0);
if (passed_a_ptr)
fprintf_filtered (stream, "(");
break;
case TYPE_CODE_ARRAY:
- c_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, 0, 0);
+ c_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, show, 0, 0);
if (passed_a_ptr)
fprintf_filtered (stream, "(");
break;
+ case TYPE_CODE_TYPEDEF:
+ c_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, show, 0, 0);
+ break;
+
case TYPE_CODE_UNDEF:
case TYPE_CODE_STRUCT:
case TYPE_CODE_UNION:
@@ -273,13 +276,14 @@ c_type_print_varspec_prefix (struct type *type, struct ui_file *stream,
case TYPE_CODE_STRING:
case TYPE_CODE_BITSTRING:
case TYPE_CODE_COMPLEX:
- case TYPE_CODE_TYPEDEF:
case TYPE_CODE_TEMPLATE:
+ case TYPE_CODE_NAMESPACE:
+ case TYPE_CODE_DECFLOAT:
/* These types need no prefix. They are listed here so that
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;
}
}
@@ -290,76 +294,89 @@ c_type_print_varspec_prefix (struct type *type, struct ui_file *stream,
NEED_SPACE = 1 indicates an initial white space is needed */
static void
-c_type_print_cv_qualifier (struct type *type, struct ui_file *stream,
- int need_pre_space, int need_post_space)
+c_type_print_modifier (struct type *type, struct ui_file *stream,
+ int need_pre_space, int need_post_space)
{
- int flag = 0;
-
- if (TYPE_CONST (type))
+ int did_print_modifier = 0;
+ const char *address_space_id;
+
+ /* We don't print `const' qualifiers for references --- since all
+ operators affect the thing referenced, not the reference itself,
+ every reference is `const'. */
+ if (TYPE_CONST (type)
+ && TYPE_CODE (type) != TYPE_CODE_REF)
{
if (need_pre_space)
fprintf_filtered (stream, " ");
fprintf_filtered (stream, "const");
- flag = 1;
+ did_print_modifier = 1;
}
if (TYPE_VOLATILE (type))
{
- if (flag || need_pre_space)
+ if (did_print_modifier || need_pre_space)
fprintf_filtered (stream, " ");
fprintf_filtered (stream, "volatile");
- flag = 1;
+ did_print_modifier = 1;
+ }
+
+ address_space_id = address_space_int_to_name (TYPE_INSTANCE_FLAGS (type));
+ if (address_space_id)
+ {
+ if (did_print_modifier || need_pre_space)
+ fprintf_filtered (stream, " ");
+ fprintf_filtered (stream, "@%s", address_space_id);
+ did_print_modifier = 1;
}
- if (flag && need_post_space)
+ if (did_print_modifier && need_post_space)
fprintf_filtered (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;
- struct type **args;
+ int i, len;
+ struct field *args;
+ int printed_any = 0;
fprintf_filtered (stream, "(");
- args = TYPE_ARG_TYPES (type);
- if (args != NULL)
+ args = TYPE_FIELDS (type);
+ len = TYPE_NFIELDS (type);
+
+ for (i = 0; i < TYPE_NFIELDS (type); i++)
{
- if (args[1] == NULL)
- {
- fprintf_filtered (stream, "...");
- }
- else if ((args[1]->code == TYPE_CODE_VOID) &&
- (current_language->la_language == language_cplus))
+ if (printed_any)
{
- fprintf_filtered (stream, "void");
- }
- else
- {
- for (i = 1;
- args[i] != NULL && args[i]->code != TYPE_CODE_VOID;
- i++)
- {
- c_print_type (args[i], "", stream, -1, 0);
- if (args[i + 1] == NULL)
- {
- fprintf_filtered (stream, "...");
- }
- else if (args[i + 1]->code != TYPE_CODE_VOID)
- {
- fprintf_filtered (stream, ",");
- wrap_here (" ");
- }
- }
+ fprintf_filtered (stream, ", ");
+ wrap_here (" ");
}
+
+ 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, ")");
}
@@ -388,12 +405,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')
@@ -516,61 +541,46 @@ 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)
/ TYPE_LENGTH (TYPE_TARGET_TYPE (type))));
fprintf_filtered (stream, "]");
- c_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0, 0, 0);
+ c_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, show,
+ 0, 0);
break;
- case TYPE_CODE_MEMBER:
- if (passed_a_ptr)
- fprintf_filtered (stream, ")");
- c_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0, 0, 0);
+ 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, ")");
- c_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0, 0, 0);
- if (passed_a_ptr)
- {
- c_type_print_args (type, stream);
- }
+ case TYPE_CODE_METHODPTR:
+ fprintf_filtered (stream, ")");
+ c_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, show,
+ 0, 0);
break;
case TYPE_CODE_PTR:
case TYPE_CODE_REF:
- c_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0, 1, 0);
+ c_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, show,
+ 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) && (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_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0,
+ c_type_print_args (type, stream);
+ c_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, show,
+ passed_a_ptr, 0);
+ break;
+
+ case TYPE_CODE_TYPEDEF:
+ c_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, show,
passed_a_ptr, 0);
break;
@@ -589,13 +599,14 @@ c_type_print_varspec_suffix (struct type *type, struct ui_file *stream,
case TYPE_CODE_STRING:
case TYPE_CODE_BITSTRING:
case TYPE_CODE_COMPLEX:
- case TYPE_CODE_TYPEDEF:
case TYPE_CODE_TEMPLATE:
+ case TYPE_CODE_NAMESPACE:
+ case TYPE_CODE_DECFLOAT:
/* These types do not need a suffix. They are listed so that
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;
}
}
@@ -620,9 +631,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;
@@ -639,7 +650,7 @@ c_type_print_base (struct type *type, struct ui_file *stream, int show,
wrap_here (" ");
if (type == NULL)
{
- fputs_filtered ("", stream);
+ fputs_filtered (_(""), stream);
return;
}
@@ -652,7 +663,7 @@ c_type_print_base (struct type *type, struct ui_file *stream, int show,
if (show <= 0
&& TYPE_NAME (type) != NULL)
{
- c_type_print_cv_qualifier (type, stream, 0, 1);
+ c_type_print_modifier (type, stream, 0, 1);
fputs_filtered (TYPE_NAME (type), stream);
return;
}
@@ -664,15 +675,16 @@ 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;
case TYPE_CODE_STRUCT:
- c_type_print_cv_qualifier (type, stream, 0, 1);
+ c_type_print_modifier (type, stream, 0, 1);
/* Note TYPE_CODE_STRUCT and TYPE_CODE_CLASS have the same value,
* so we use another means for distinguishing them.
*/
@@ -705,7 +717,7 @@ c_type_print_base (struct type *type, struct ui_file *stream, int show,
goto struct_union;
case TYPE_CODE_UNION:
- c_type_print_cv_qualifier (type, stream, 0, 1);
+ c_type_print_modifier (type, stream, 0, 1);
fprintf_filtered (stream, "union ");
struct_union:
@@ -737,10 +749,10 @@ 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)
- fprintfi_filtered (level + 4, stream, "\n");
+ if (TYPE_STUB (type))
+ fprintfi_filtered (level + 4, stream, _("\n"));
else
- fprintfi_filtered (level + 4, stream, "\n");
+ fprintfi_filtered (level + 4, stream, _("\n"));
}
/* Start off with no specific section type, so we can print
@@ -823,11 +835,7 @@ c_type_print_base (struct type *type, struct ui_file *stream, int show,
{
QUIT;
/* Don't print out virtual function table. */
- /* HP ANSI C++ case */
- if (TYPE_HAS_VTABLE (type) && (STREQN (TYPE_FIELD_NAME (type, i), "__vfp", 5)))
- continue;
- /* Other compilers */
- if (STREQN (TYPE_FIELD_NAME (type, i), "_vptr", 5)
+ if (strncmp (TYPE_FIELD_NAME (type, i), "_vptr", 5) == 0
&& is_cplus_marker ((TYPE_FIELD_NAME (type, i))[5]))
continue;
@@ -885,9 +893,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 */
@@ -897,16 +917,18 @@ c_type_print_base (struct type *type, struct ui_file *stream, int show,
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);
+ int is_constructor = name && strcmp (method_name, name) == 0;
for (j = 0; j < len2; j++)
{
char *physname = TYPE_FN_FIELD_PHYSNAME (f, j);
int is_full_physname_constructor =
- ((physname[0] == '_' && physname[1] == '_'
- && strchr ("0123456789Qt", physname[2]))
- || STREQN (physname, "__ct__", 6)
- || DESTRUCTOR_PREFIX_P (physname)
- || STREQN (physname, "__dt__", 6));
+ is_constructor_name (physname)
+ || 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))
@@ -943,7 +965,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, " %s;\n",
+ fprintf_filtered (stream, _(" %s;\n"),
TYPE_FN_FIELD_PHYSNAME (f, j));
break;
}
@@ -972,12 +994,17 @@ c_type_print_base (struct type *type, struct ui_file *stream, int show,
Let's try to reconstruct the function signature from
the symbol information */
if (!TYPE_FN_FIELD_STUB (f, j))
- cp_type_print_method_args (TYPE_FN_FIELD_ARGS (f, j), "",
- method_name,
- TYPE_FN_FIELD_STATIC_P (f, j),
- stream);
+ {
+ int staticp = TYPE_FN_FIELD_STATIC_P (f, j);
+ struct type *mtype = TYPE_FN_FIELD_TYPE (f, j);
+ cp_type_print_method_args (mtype,
+ "",
+ method_name,
+ staticp,
+ stream);
+ }
else
- fprintf_filtered (stream, "",
+ fprintf_filtered (stream, _(""),
mangled_name);
}
else
@@ -1012,7 +1039,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));
}
@@ -1021,20 +1048,7 @@ c_type_print_base (struct type *type, struct ui_file *stream, int show,
break;
case TYPE_CODE_ENUM:
- c_type_print_cv_qualifier (type, stream, 0, 1);
- /* HP C supports sized enums */
- if (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;
- }
+ c_type_print_modifier (type, stream, 0, 1);
fprintf_filtered (stream, "enum ");
/* Print the tag name if it exists.
The aCC compiler emits a spurious
@@ -1084,16 +1098,16 @@ c_type_print_base (struct type *type, struct ui_file *stream, int show,
break;
case TYPE_CODE_UNDEF:
- fprintf_filtered (stream, "struct ");
+ fprintf_filtered (stream, _("struct "));
break;
case TYPE_CODE_ERROR:
- fprintf_filtered (stream, "");
+ fprintf_filtered (stream, _(""));
break;
case TYPE_CODE_RANGE:
/* This should not occur */
- fprintf_filtered (stream, "");
+ fprintf_filtered (stream, _(""));
break;
case TYPE_CODE_TEMPLATE:
@@ -1102,7 +1116,7 @@ c_type_print_base (struct type *type, struct ui_file *stream, int show,
template class "
and then merges with the struct/union/class code to
print the rest of the definition. */
- c_type_print_cv_qualifier (type, stream, 0, 1);
+ c_type_print_modifier (type, stream, 0, 1);
fprintf_filtered (stream, "template <");
for (i = 0; i < TYPE_NTEMPLATE_ARGS (type); i++)
{
@@ -1119,7 +1133,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, " ");
@@ -1130,6 +1144,11 @@ c_type_print_base (struct type *type, struct ui_file *stream, int show,
}
break;
+ case TYPE_CODE_NAMESPACE:
+ fputs_filtered ("namespace ", stream);
+ fputs_filtered (TYPE_TAG_NAME (type), stream);
+ break;
+
default:
/* Handle types not explicitly handled by the other cases,
such as fundamental types. For these, just print whatever
@@ -1137,14 +1156,14 @@ c_type_print_base (struct type *type, struct ui_file *stream, int show,
is no type name, then complain. */
if (TYPE_NAME (type) != NULL)
{
- c_type_print_cv_qualifier (type, stream, 0, 1);
+ c_type_print_modifier (type, stream, 0, 1);
fputs_filtered (TYPE_NAME (type), stream);
}
else
{
/* At least for dump_symtab, it is important that this not be
an error (). */
- fprintf_filtered (stream, "",
+ fprintf_filtered (stream, _(""),
TYPE_CODE (type));
}
break;