Implement value_print for Rust
authorTom Tromey <tom@tromey.com>
Sun, 27 Mar 2022 21:29:28 +0000 (15:29 -0600)
committerTom Tromey <tom@tromey.com>
Fri, 15 Apr 2022 16:34:03 +0000 (10:34 -0600)
This adds an implementation of the value_print method to Rust.  As
described in PR rust/22254, this removes a bit of weird-looking output
from some "print"s -- because c_value_print is bypassed.  I don't have
a test for the bug that inspired this patch, because I only know how
to reproduce it when using a relatively old Rust compiler.  However,
the new "cast-printing" code in value_print is required, because
omitting this causes some existing tests to fail.

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=22254

gdb/rust-lang.c
gdb/rust-lang.h

index d4a221abb08d4a9e640eb10cd55804497388d9b6..bf8dba99ecd6bb774bdf1d283fbb17df7a535917 100644 (file)
@@ -624,6 +624,27 @@ rust_language::value_print_inner
     }
 }
 
+/* See language.h.  */
+
+void
+rust_language::value_print
+       (struct value *val, struct ui_file *stream,
+        const struct value_print_options *options) const
+{
+  value_print_options opts = *options;
+  opts.deref_ref = true;
+
+  struct type *type = check_typedef (value_type (val));
+  if (type->is_pointer_or_reference ())
+    {
+      gdb_printf (stream, "(");
+      type_print (value_type (val), "", stream, -1);
+      gdb_printf (stream, ") ");
+    }
+
+  return common_val_print (val, stream, 0, &opts, this);
+}
+
 \f
 
 static void
index 0e89b8822cb345b56565919f560cdcfd85dfb83c..514494a2c82ff1b0d0b20f85e20a41a3b33e5aee 100644 (file)
@@ -125,6 +125,11 @@ public:
 
   /* See language.h.  */
 
+  void value_print (struct value *val, struct ui_file *stream,
+                   const struct value_print_options *options) const override;
+
+  /* See language.h.  */
+
   struct block_symbol lookup_symbol_nonlocal
        (const char *name, const struct block *block,
         const domain_enum domain) const override