X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fc-typeprint.c;h=926ae2fc5ef329f656d4d4600e1b88a7210b8d34;hb=53a71c068156f7c35e07ddd5c0cce97bf98c025c;hp=07962ce6cf21c333f469b8f60a1fdc64a4f9da9f;hpb=3d263c1d0a2f82fcf209a00e029b32ac8cf8f838;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/c-typeprint.c b/gdb/c-typeprint.c index 07962ce6cf..926ae2fc5e 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, 2001, 2002, 2003 + Copyright (C) 1986, 1988, 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1998, + 1999, 2000, 2001, 2002, 2003, 2006, 2007, 2008, 2009, 2010 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,9 +16,7 @@ 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 "gdb_obstack.h" @@ -34,6 +32,7 @@ #include "c-lang.h" #include "typeprint.h" #include "cp-abi.h" +#include "jv-lang.h" #include "gdb_string.h" #include @@ -42,8 +41,6 @@ static void cp_type_print_method_args (struct type *mtype, char *prefix, char *varstring, int staticp, struct ui_file *stream); -static void c_type_print_args (struct type *, struct ui_file *); - static void cp_type_print_derivation_info (struct ui_file *, struct type *); static void c_type_print_varspec_prefix (struct type *, struct ui_file *, int, @@ -59,7 +56,7 @@ static void c_type_print_modifier (struct type *, struct ui_file *, /* LEVEL is the depth to indent lines by. */ void -c_print_type (struct type *type, char *varstring, struct ui_file *stream, +c_print_type (struct type *type, const char *varstring, struct ui_file *stream, int show, int level) { enum type_code code; @@ -72,16 +69,15 @@ c_print_type (struct type *type, char *varstring, struct ui_file *stream, c_type_print_base (type, stream, show, level); code = TYPE_CODE (type); if ((varstring != NULL && *varstring != '\0') - || /* Need a space if going to print stars or brackets; but not if we will print just a type name. */ - ((show > 0 || TYPE_NAME (type) == 0) - && - (code == TYPE_CODE_PTR || code == TYPE_CODE_FUNC - || code == TYPE_CODE_METHOD - || code == TYPE_CODE_ARRAY - || code == TYPE_CODE_MEMBER - || code == TYPE_CODE_REF))) + || ((show > 0 || TYPE_NAME (type) == 0) + && (code == TYPE_CODE_PTR || code == TYPE_CODE_FUNC + || code == TYPE_CODE_METHOD + || code == TYPE_CODE_ARRAY + || code == TYPE_CODE_MEMBERPTR + || code == TYPE_CODE_METHODPTR + || code == TYPE_CODE_REF))) fputs_filtered (" ", stream); need_post_space = (varstring != NULL && strcmp (varstring, "") != 0); c_type_print_varspec_prefix (type, stream, show, 0, need_post_space); @@ -98,6 +94,25 @@ c_print_type (struct type *type, char *varstring, struct ui_file *stream, } } +/* Print a typedef using C syntax. TYPE is the underlying type. + NEW_SYMBOL is the symbol naming the type. STREAM is the stream on + which to print. */ + +void +c_print_typedef (struct type *type, struct symbol *new_symbol, + struct ui_file *stream) +{ + CHECK_TYPEDEF (type); + fprintf_filtered (stream, "typedef "); + type_print (type, "", stream, 0); + if (TYPE_NAME ((SYMBOL_TYPE (new_symbol))) == 0 + || strcmp (TYPE_NAME ((SYMBOL_TYPE (new_symbol))), + SYMBOL_LINKAGE_NAME (new_symbol)) != 0 + || TYPE_CODE (SYMBOL_TYPE (new_symbol)) == TYPE_CODE_TYPEDEF) + fprintf_filtered (stream, " %s", SYMBOL_PRINT_NAME (new_symbol)); + fprintf_filtered (stream, ";\n"); +} + /* If TYPE is a derived type, then print out derivation information. Print only the actual base classes of this type, not the base classes of the base classes. I.E. for the derivation hierarchy: @@ -182,6 +197,23 @@ cp_type_print_method_args (struct type *mtype, char *prefix, char *varstring, fprintf_filtered (stream, "void"); fprintf_filtered (stream, ")"); + + /* For non-static methods, read qualifiers from the type of + THIS. */ + if (!staticp) + { + struct type *domain; + + gdb_assert (nargs > 0); + gdb_assert (TYPE_CODE (args[0].type) == TYPE_CODE_PTR); + domain = TYPE_TARGET_TYPE (args[0].type); + + if (TYPE_CONST (domain)) + fprintf_filtered (stream, " const"); + + if (TYPE_VOLATILE (domain)) + fprintf_filtered (stream, " volatile"); + } } @@ -202,6 +234,7 @@ c_type_print_varspec_prefix (struct type *type, struct ui_file *stream, int show, int passed_a_ptr, int need_post_space) { char *name; + if (type == 0) return; @@ -218,29 +251,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 +278,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) @@ -280,8 +310,8 @@ 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_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; @@ -323,7 +353,8 @@ c_type_print_modifier (struct type *type, struct ui_file *stream, did_print_modifier = 1; } - address_space_id = address_space_int_to_name (TYPE_INSTANCE_FLAGS (type)); + address_space_id = address_space_int_to_name (get_type_arch (type), + TYPE_INSTANCE_FLAGS (type)); if (address_space_id) { if (did_print_modifier || need_pre_space) @@ -337,42 +368,59 @@ 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 if SHOW_ARTIFICIAL is + non-zero. LANGUAGE is the language in which TYPE was defined. This is + a necessary evil since this code is used by the C, C++, and Java + backends. */ - -static void -c_type_print_args (struct type *type, struct ui_file *stream) +void +c_type_print_args (struct type *type, struct ui_file *stream, + int show_artificial, enum language language) { - int i; + int i, len; struct field *args; + int printed_any = 0; fprintf_filtered (stream, "("); args = TYPE_FIELDS (type); - if (args != NULL) - { - int i; + len = TYPE_NFIELDS (type); - /* FIXME drow/2002-05-31: Always skips the first argument, - should we be checking for static members? */ + for (i = 0; i < TYPE_NFIELDS (type); i++) + { + if (TYPE_FIELD_ARTIFICIAL (type, i) && !show_artificial) + continue; - for (i = 1; 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"); + + if (language == language_java) + java_print_type (TYPE_FIELD_TYPE (type, i), "", stream, -1, 0); + else + 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) && language != language_java) + || language == language_cplus)) + fprintf_filtered (stream, "void"); fprintf_filtered (stream, ")"); } @@ -537,8 +585,8 @@ 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 - && TYPE_ARRAY_UPPER_BOUND_TYPE (type) != BOUND_CANNOT_BE_DETERMINED) + if (TYPE_LENGTH (TYPE_TARGET_TYPE (type)) > 0 + && !TYPE_ARRAY_UPPER_BOUND_IS_UNDEFINED (type)) fprintf_filtered (stream, "%d", (TYPE_LENGTH (type) / TYPE_LENGTH (TYPE_TARGET_TYPE (type)))); @@ -548,22 +596,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 +613,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, 1, current_language->la_language); c_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, show, passed_a_ptr, 0); break; @@ -621,8 +643,8 @@ 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_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; @@ -696,44 +718,20 @@ 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_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. - */ - if (HAVE_CPLUS_STRUCT (type)) - { - switch (TYPE_DECLARED_TYPE (type)) - { - case DECLARED_TYPE_CLASS: - fprintf_filtered (stream, "class "); - break; - case DECLARED_TYPE_UNION: - fprintf_filtered (stream, "union "); - break; - case DECLARED_TYPE_STRUCT: - fprintf_filtered (stream, "struct "); - break; - default: - /* If there is a CPLUS_STRUCT, assume class if not - * otherwise specified in the declared_type field. - */ - fprintf_filtered (stream, "class "); - break; - } /* switch */ - } + if (TYPE_DECLARED_CLASS (type)) + fprintf_filtered (stream, "class "); else - { - /* If not CPLUS_STRUCT, then assume it's a C struct */ - fprintf_filtered (stream, "struct "); - } + fprintf_filtered (stream, "struct "); goto struct_union; case TYPE_CODE_UNION: @@ -748,8 +746,8 @@ c_type_print_base (struct type *type, struct ui_file *stream, int show, * tag for unnamed struct/union/enum's, which we don't * want to print. */ - if (TYPE_TAG_NAME (type) != NULL && - strncmp (TYPE_TAG_NAME (type), "{unnamed", 8)) + if (TYPE_TAG_NAME (type) != NULL + && strncmp (TYPE_TAG_NAME (type), "{unnamed", 8)) { fputs_filtered (TYPE_TAG_NAME (type), stream); if (show > 0) @@ -764,10 +762,14 @@ c_type_print_base (struct type *type, struct ui_file *stream, int show, } else if (show > 0 || TYPE_TAG_NAME (type) == NULL) { + struct type *basetype; + int vptr_fieldno; + cp_type_print_derivation_info (stream, type); fprintf_filtered (stream, "{\n"); - if ((TYPE_NFIELDS (type) == 0) && (TYPE_NFN_FIELDS (type) == 0)) + if (TYPE_NFIELDS (type) == 0 && TYPE_NFN_FIELDS (type) == 0 + && TYPE_TYPEDEF_FIELD_COUNT (type) == 0) { if (TYPE_STUB (type)) fprintfi_filtered (level + 4, stream, _("\n")); @@ -786,8 +788,7 @@ c_type_print_base (struct type *type, struct ui_file *stream, int show, masquerading as a class, if all members are public, there's no need for a "public:" label. */ - if ((TYPE_DECLARED_TYPE (type) == DECLARED_TYPE_CLASS) || - (TYPE_DECLARED_TYPE (type) == DECLARED_TYPE_TEMPLATE)) + if (TYPE_DECLARED_CLASS (type)) { QUIT; len = TYPE_NFIELDS (type); @@ -815,8 +816,7 @@ c_type_print_base (struct type *type, struct ui_file *stream, int show, } } } - else if ((TYPE_DECLARED_TYPE (type) == DECLARED_TYPE_STRUCT) || - (TYPE_DECLARED_TYPE (type) == DECLARED_TYPE_UNION)) + else { QUIT; len = TYPE_NFIELDS (type); @@ -835,8 +835,8 @@ c_type_print_base (struct type *type, struct ui_file *stream, int show, QUIT; len = TYPE_FN_FIELDLIST_LENGTH (type, j); for (i = 0; i < len; i++) - if (TYPE_FN_FIELD_PRIVATE (TYPE_FN_FIELDLIST1 (type, j), i) || - TYPE_FN_FIELD_PROTECTED (TYPE_FN_FIELDLIST1 (type, j), i)) + if (TYPE_FN_FIELD_PRIVATE (TYPE_FN_FIELDLIST1 (type, j), i) + || TYPE_FN_FIELD_PROTECTED (TYPE_FN_FIELDLIST1 (type, j), i)) { need_access_label = 1; break; @@ -851,23 +851,19 @@ c_type_print_base (struct type *type, struct ui_file *stream, int show, do not print the field that it occupies. */ len = TYPE_NFIELDS (type); + vptr_fieldno = get_vptr_fieldno (type, &basetype); for (i = TYPE_N_BASECLASSES (type); i < len; i++) { QUIT; - /* Don't print out virtual function table. */ - /* HP ANSI C++ case */ - if (TYPE_HAS_VTABLE (type) - && (strncmp (TYPE_FIELD_NAME (type, i), "__vfp", 5) == 0)) - continue; - /* Other compilers */ - if (strncmp (TYPE_FIELD_NAME (type, i), "_vptr", 5) == 0 - && is_cplus_marker ((TYPE_FIELD_NAME (type, i))[5])) - continue; - /* If this is a C++ class we can print the various C++ section - labels. */ + /* If we have a virtual table pointer, omit it. Even if + virtual table pointers are not specifically marked in + the debug info, they should be artificial. */ + if ((i == vptr_fieldno && type == basetype) + || TYPE_FIELD_ARTIFICIAL (type, i)) + continue; - if (HAVE_CPLUS_STRUCT (type) && need_access_label) + if (need_access_label) { if (TYPE_FIELD_PROTECTED (type, i)) { @@ -897,14 +893,12 @@ c_type_print_base (struct type *type, struct ui_file *stream, int show, } print_spaces_filtered (level + 4, stream); - if (TYPE_FIELD_STATIC (type, i)) - { - fprintf_filtered (stream, "static "); - } + if (field_is_static (&TYPE_FIELD (type, i))) + fprintf_filtered (stream, "static "); c_print_type (TYPE_FIELD_TYPE (type, i), TYPE_FIELD_NAME (type, i), stream, show - 1, level + 4); - if (!TYPE_FIELD_STATIC (type, i) + if (!field_is_static (&TYPE_FIELD (type, i)) && TYPE_FIELD_PACKED (type, i)) { /* It is a bitfield. This code does not attempt @@ -928,6 +922,7 @@ c_type_print_base (struct type *type, struct ui_file *stream, int show, 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++; @@ -943,13 +938,14 @@ c_type_print_base (struct type *type, struct ui_file *stream, int show, char *method_name = TYPE_FN_FIELDLIST_NAME (type, i); char *name = type_name_no_tag (type); 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 = - is_constructor_name (physname) - || is_destructor_name (physname) - || method_name[0] == '~'; + is_constructor_name (physname) + || is_destructor_name (physname) + || method_name[0] == '~'; /* Do not print out artificial methods. */ if (TYPE_FN_FIELD_ARTIFICIAL (f, j)) @@ -994,9 +990,9 @@ c_type_print_base (struct type *type, struct ui_file *stream, int show, TYPE_FN_FIELD_PHYSNAME (f, j)); break; } - else if (!is_constructor && /* constructors don't have declared types */ - !is_full_physname_constructor && /* " " */ - !is_type_conversion_operator (type, i, j)) + else if (!is_constructor /* constructors don't have declared types */ + && !is_full_physname_constructor /* " " */ + && !is_type_conversion_operator (type, i, j)) { type_print (TYPE_TARGET_TYPE (TYPE_FN_FIELD_TYPE (f, j)), "", stream, -1); @@ -1022,6 +1018,7 @@ c_type_print_base (struct type *type, struct ui_file *stream, int show, { 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, @@ -1043,6 +1040,7 @@ c_type_print_base (struct type *type, struct ui_file *stream, int show, if (p != NULL) { int length = p - demangled_no_class; + demangled_no_static = (char *) xmalloc (length + 1); strncpy (demangled_no_static, demangled_no_class, length); *(demangled_no_static + length) = '\0'; @@ -1061,6 +1059,29 @@ c_type_print_base (struct type *type, struct ui_file *stream, int show, } } + /* Print typedefs defined in this class. */ + + if (TYPE_TYPEDEF_FIELD_COUNT (type) != 0) + { + if (TYPE_NFIELDS (type) != 0 || TYPE_NFN_FIELDS (type) != 0) + fprintf_filtered (stream, "\n"); + + for (i = 0; i < TYPE_TYPEDEF_FIELD_COUNT (type); i++) + { + struct type *target = TYPE_TYPEDEF_FIELD_TYPE (type, i); + + /* Dereference the typedef declaration itself. */ + gdb_assert (TYPE_CODE (target) == TYPE_CODE_TYPEDEF); + target = TYPE_TARGET_TYPE (target); + + print_spaces_filtered (level + 4, stream); + fprintf_filtered (stream, "typedef "); + c_print_type (target, TYPE_TYPEDEF_FIELD_NAME (type, i), + stream, show - 1, level + 4); + fprintf_filtered (stream, ";\n"); + } + } + fprintfi_filtered (level, stream, "}"); if (TYPE_LOCALTYPE_PTR (type) && show >= 0) @@ -1068,33 +1089,18 @@ c_type_print_base (struct type *type, struct ui_file *stream, int show, TYPE_LOCALTYPE_FILE (type), TYPE_LOCALTYPE_LINE (type)); } - if (TYPE_CODE (type) == TYPE_CODE_TEMPLATE) - goto go_back; break; 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 "{unnamed struct}"/"{unnamed union}"/"{unnamed enum}" tag for unnamed struct/union/enum's, which we don't want to print. */ - if (TYPE_TAG_NAME (type) != NULL && - strncmp (TYPE_TAG_NAME (type), "{unnamed", 8)) + if (TYPE_TAG_NAME (type) != NULL + && strncmp (TYPE_TAG_NAME (type), "{unnamed", 8)) { fputs_filtered (TYPE_TAG_NAME (type), stream); if (show > 0) @@ -1140,7 +1146,7 @@ c_type_print_base (struct type *type, struct ui_file *stream, int show, break; case TYPE_CODE_ERROR: - fprintf_filtered (stream, _("")); + fprintf_filtered (stream, "%s", TYPE_ERROR_NAME (type)); break; case TYPE_CODE_RANGE: @@ -1148,40 +1154,6 @@ c_type_print_base (struct type *type, struct ui_file *stream, int show, fprintf_filtered (stream, _("")); break; - case TYPE_CODE_TEMPLATE: - /* Called on "ptype t" where "t" is a template. - Prints the template header (with args), e.g.: - template class " - and then merges with the struct/union/class code to - print the rest of the definition. */ - c_type_print_modifier (type, stream, 0, 1); - fprintf_filtered (stream, "template <"); - for (i = 0; i < TYPE_NTEMPLATE_ARGS (type); i++) - { - struct template_arg templ_arg; - templ_arg = TYPE_TEMPLATE_ARG (type, i); - fprintf_filtered (stream, "class %s", templ_arg.name); - if (i < TYPE_NTEMPLATE_ARGS (type) - 1) - fprintf_filtered (stream, ", "); - } - fprintf_filtered (stream, "> class "); - /* Yuck, factor this out to a subroutine so we can call - it and return to the point marked with the "goback:" label... - RT */ - goto struct_union; - go_back: - if (TYPE_NINSTANTIATIONS (type) > 0) - { - fprintf_filtered (stream, _("\ntemplate instantiations:\n")); - for (i = 0; i < TYPE_NINSTANTIATIONS (type); i++) - { - fprintf_filtered (stream, " "); - c_type_print_base (TYPE_INSTANTIATION (type, i), stream, 0, level); - if (i < TYPE_NINSTANTIATIONS (type) - 1) - fprintf_filtered (stream, "\n"); - } - } - break; - case TYPE_CODE_NAMESPACE: fputs_filtered ("namespace ", stream); fputs_filtered (TYPE_TAG_NAME (type), stream);