Constify add_com_suppress_notification
[deliverable/binutils-gdb.git] / gdb / typeprint.c
index fc687d3fd50a10008931f6dd9883b38cb6f8597f..441cbb8742af9cf2b37b6639bcf9ba86c1420395 100644 (file)
@@ -37,8 +37,6 @@
 #include "extension.h"
 #include "completer.h"
 
-extern void _initialize_typeprint (void);
-
 static void ptype_command (char *, int);
 
 static void whatis_command (char *, int);
@@ -386,6 +384,23 @@ type_to_string (struct type *type)
   return {};
 }
 
+/* See typeprint.h.  */
+
+void
+type_print_unknown_return_type (struct ui_file *stream)
+{
+  fprintf_filtered (stream, _("<unknown return type>"));
+}
+
+/* See typeprint.h.  */
+
+void
+error_unknown_type (const char *sym_print_name)
+{
+  error (_("'%s' has unknown type; cast it to its declared type"),
+        sym_print_name);
+}
+
 /* Print type of EXP, or last thing in value history if EXP == NULL.
    show is passed to type_print.  */
 
@@ -443,12 +458,40 @@ whatis_exp (char *exp, int show)
        }
 
       expression_up expr = parse_expression (exp);
-      val = evaluate_type (expr.get ());
+
+      /* The behavior of "whatis" depends on whether the user
+        expression names a type directly, or a language expression
+        (including variable names).  If the former, then "whatis"
+        strips one level of typedefs, only.  If an expression,
+        "whatis" prints the type of the expression without stripping
+        any typedef level.  "ptype" always strips all levels of
+        typedefs.  */
+      if (show == -1 && expr->elts[0].opcode == OP_TYPE)
+       {
+         /* The user expression names a type directly.  */
+         type = expr->elts[1].type;
+
+         /* If this is a typedef, then find its immediate target.
+            Use check_typedef to resolve stubs, but ignore its result
+            because we do not want to dig past all typedefs.  */
+         check_typedef (type);
+         if (TYPE_CODE (type) == TYPE_CODE_TYPEDEF)
+           type = TYPE_TARGET_TYPE (type);
+       }
+      else
+       {
+         /* The user expression names a type indirectly by naming an
+            object or expression of that type.  Find that
+            indirectly-named type.  */
+         val = evaluate_type (expr.get ());
+         type = value_type (val);
+       }
     }
   else
-    val = access_value_history (0);
-
-  type = value_type (val);
+    {
+      val = access_value_history (0);
+      type = value_type (val);
+    }
 
   get_user_print_options (&opts);
   if (opts.objectprint)
@@ -586,7 +629,7 @@ print_type_scalar (struct type *type, LONGEST val, struct ui_file *stream)
    and whatis_command().  */
 
 void
-maintenance_print_type (char *type_name, int from_tty)
+maintenance_print_type (const char *type_name, int from_tty)
 {
   struct value *val;
   struct type *type;
@@ -619,7 +662,7 @@ struct cmd_list_element *setprinttypelist;
 struct cmd_list_element *showprinttypelist;
 
 static void
-set_print_type (char *arg, int from_tty)
+set_print_type (const char *arg, int from_tty)
 {
   printf_unfiltered (
      "\"set print type\" must be followed by the name of a subcommand.\n");
@@ -627,7 +670,7 @@ set_print_type (char *arg, int from_tty)
 }
 
 static void
-show_print_type (char *args, int from_tty)
+show_print_type (const char *args, int from_tty)
 {
   cmd_show_list (showprinttypelist, from_tty, "");
 }
@@ -729,4 +772,3 @@ val_print_not_associated (struct ui_file *stream)
 {
   fprintf_filtered (stream, _("<not associated>"));
 }
-
This page took 0.024337 seconds and 4 git commands to generate.