/* Support for printing C and C++ types for GDB, the GNU debugger.
- Copyright 1986, 1988, 1989, 1991, 1993-1996, 1998-2000
+ Copyright 1986, 1988, 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1998,
+ 1999, 2000
Free Software Foundation, Inc.
This file is part of GDB.
#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 <errno.h>
-#include <ctype.h>
/* Flag indicating target was compiled by HP compiler */
extern int hp_som_som_object_present;
\f
-/* Print a description of a type in the format of a
- typedef for the current language.
- NEW is the new name for a type TYPE. */
-
-void
-c_typedef_print (type, new, stream)
- struct type *type;
- struct symbol *new;
- struct ui_file *stream;
-{
- CHECK_TYPEDEF (type);
- switch (current_language->la_language)
- {
-#ifdef _LANG_c
- case language_c:
- case language_cplus:
- fprintf_filtered (stream, "typedef ");
- type_print (type, "", stream, 0);
- if (TYPE_NAME ((SYMBOL_TYPE (new))) == 0
- || !STREQ (TYPE_NAME ((SYMBOL_TYPE (new))), SYMBOL_NAME (new)))
- fprintf_filtered (stream, " %s", SYMBOL_SOURCE_NAME (new));
- break;
-#endif
-#ifdef _LANG_m2
- case language_m2:
- fprintf_filtered (stream, "TYPE ");
- if (!TYPE_NAME (SYMBOL_TYPE (new)) ||
- !STREQ (TYPE_NAME (SYMBOL_TYPE (new)), SYMBOL_NAME (new)))
- fprintf_filtered (stream, "%s = ", SYMBOL_SOURCE_NAME (new));
- else
- fprintf_filtered (stream, "<builtin> = ");
- type_print (type, "", stream, 0);
- break;
-#endif
-#ifdef _LANG_chill
- case language_chill:
- fprintf_filtered (stream, "SYNMODE ");
- if (!TYPE_NAME (SYMBOL_TYPE (new)) ||
- !STREQ (TYPE_NAME (SYMBOL_TYPE (new)), SYMBOL_NAME (new)))
- fprintf_filtered (stream, "%s = ", SYMBOL_SOURCE_NAME (new));
- else
- fprintf_filtered (stream, "<builtin> = ");
- type_print (type, "", stream, 0);
- break;
-#endif
- default:
- error ("Language not supported.");
- }
- fprintf_filtered (stream, ";\n");
-}
-
/* LEVEL is the depth to indent lines by. */
void
-c_print_type (type, varstring, stream, show, level)
- struct type *type;
- char *varstring;
- struct ui_file *stream;
- int show;
- int level;
+c_print_type (struct type *type, char *varstring, struct ui_file *stream,
+ int show, int level)
{
register enum type_code code;
int demangled_args;
derivation via protected inheritance, so gdb can print it out */
static void
-cp_type_print_derivation_info (stream, type)
- struct ui_file *stream;
- struct type *type;
+cp_type_print_derivation_info (struct ui_file *stream, struct type *type)
{
char *name;
int i;
/* Print the C++ method arguments ARGS to the file STREAM. */
static void
-cp_type_print_method_args (args, prefix, varstring, staticp, stream)
- struct type **args;
- char *prefix;
- char *varstring;
- int staticp;
- struct ui_file *stream;
+cp_type_print_method_args (struct type **args, char *prefix, char *varstring,
+ int staticp, struct ui_file *stream)
{
int i;
SHOW is always zero on recursive calls. */
void
-c_type_print_varspec_prefix (type, stream, show, passed_a_ptr)
- struct type *type;
- struct ui_file *stream;
- int show;
- int passed_a_ptr;
+c_type_print_varspec_prefix (struct type *type, struct ui_file *stream,
+ int show, int passed_a_ptr)
{
char *name;
if (type == 0)
NEED_SPACE = 1 indicates an initial white space is needed */
static void
-c_type_print_cv_qualifier (type, stream, need_pre_space, need_post_space)
- struct type *type;
- struct ui_file *stream;
- int need_pre_space;
- int need_post_space;
+c_type_print_cv_qualifier (struct type *type, struct ui_file *stream,
+ int need_pre_space, int need_post_space)
{
int flag = 0;
- if (TYPE_CONST (type))
+ /* 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, " ");
static void
-c_type_print_args (type, stream)
- struct type *type;
- struct ui_file *stream;
+c_type_print_args (struct type *type, struct ui_file *stream)
{
int i;
struct type **args;
Args work like c_type_print_varspec_prefix. */
void
-c_type_print_varspec_suffix (type, stream, show, passed_a_ptr, demangled_args)
- struct type *type;
- struct ui_file *stream;
- int show;
- int passed_a_ptr;
- int demangled_args;
+c_type_print_varspec_suffix (struct type *type, struct ui_file *stream,
+ int show, int passed_a_ptr, int demangled_args)
{
if (type == 0)
return;
We increase it for some recursive calls. */
void
-c_type_print_base (type, stream, show, level)
- struct type *type;
- struct ui_file *stream;
- int show;
- int level;
+c_type_print_base (struct type *type, struct ui_file *stream, int show,
+ int level)
{
register int i;
register int len;
{
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] == '~';
+
QUIT;
if (TYPE_FN_FIELD_PROTECTED (f, j))
strncpy (demangled_no_static, demangled_no_class, length);
*(demangled_no_static + length) = '\0';
fputs_filtered (demangled_no_static, stream);
- free (demangled_no_static);
+ xfree (demangled_no_static);
}
else
fputs_filtered (demangled_no_class, stream);
- free (demangled_name);
+ xfree (demangled_name);
}
if (TYPE_FN_FIELD_STUB (f, j))
- free (mangled_name);
+ xfree (mangled_name);
fprintf_filtered (stream, ";\n");
}