PR c++/15401:
authorTom Tromey <tromey@redhat.com>
Wed, 22 May 2013 20:51:49 +0000 (20:51 +0000)
committerTom Tromey <tromey@redhat.com>
Wed, 22 May 2013 20:51:49 +0000 (20:51 +0000)
* c-valprint.c (c_value_print): Use value_addr for
references.  Convert back to reference type with value_ref.
gdb/testsuite
* gdb.cp/class2.cc (main): New local 'aref'.
* gdb.cp/class2.exp: Check printing of 'aref'.

gdb/ChangeLog
gdb/c-valprint.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.cp/class2.cc
gdb/testsuite/gdb.cp/class2.exp

index bc787a7..3b2551b 100644 (file)
@@ -1,3 +1,9 @@
+2013-05-22  Tom Tromey  <tromey@redhat.com>
+
+       PR c++/15401:
+       * c-valprint.c (c_value_print): Use value_addr for
+       references.  Convert back to reference type with value_ref.
+
 2013-05-22  Eli Zaretskii  <eliz@gnu.org>
 
        * windows-nat.c (handle_unload_dll): Don't call solib_add for the
index 646aed7..ce2c29d 100644 (file)
@@ -497,18 +497,11 @@ c_value_print (struct value *val, struct ui_file *stream,
       else if (options->objectprint
               && (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_CLASS))
        {
+         int is_ref = TYPE_CODE (type) == TYPE_CODE_REF;
+
+         if (is_ref)
+           val = value_addr (val);
 
-         if (TYPE_CODE(type) == TYPE_CODE_REF)
-           {
-             /* Copy value, change to pointer, so we don't get an
-                error about a non-pointer type in
-                value_rtti_target_type.  */
-             struct value *temparg;
-             temparg=value_copy(val);
-             deprecated_set_value_type
-               (temparg, lookup_pointer_type (TYPE_TARGET_TYPE (type)));
-             val = temparg;
-           }
          /* Pointer to class, check real type of object.  */
          fprintf_filtered (stream, "(");
 
@@ -522,7 +515,14 @@ c_value_print (struct value *val, struct ui_file *stream,
                  type = real_type;
 
                  /* Need to adjust pointer value.  */
-                 val = value_from_pointer (type, value_as_address (val) - top);
+                 val = value_from_pointer (real_type,
+                                           value_as_address (val) - top);
+
+                 if (is_ref)
+                   {
+                     val = value_ref (value_ind (val));
+                     type = value_type (val);
+                   }
 
                  /* Note: When we look up RTTI entries, we don't get
                     any information on const or volatile
index 300eb75..7429c35 100644 (file)
@@ -1,3 +1,8 @@
+2013-05-22  Tom Tromey  <tromey@redhat.com>
+
+       * gdb.cp/class2.cc (main): New local 'aref'.
+       * gdb.cp/class2.exp: Check printing of 'aref'.
+
 2013-05-22  Doug Evans  <dje@google.com>
 
        * gdb.threads/wp-replication.c (main): Insert some code at the start
index 0c9d9df..97c44de 100644 (file)
@@ -67,6 +67,7 @@ int main (void)
   B beta, *bbp;
   C gamma;
   empty e;
+  A &aref (alpha);
 
   alpha.a1 = 100;
   beta.a1 = 200; beta.b1 = 201; beta.b2 = 202;
index 824f56e..00b6322 100644 (file)
@@ -110,3 +110,7 @@ gdb_test_no_output "set print object on"
 gdb_test "p acp" "= \\(C \\*\\) ${hex}"
 gdb_test "p acp->c1" "\\(A \\*\\) 0x0"
 gdb_test "p acp->c2" "\\(A \\*\\) ${hex}f"
+
+# Regression test for PR c++/15401.
+# Check that the type printed is a reference.
+gdb_test "p aref" " = \\(A \\&\\) .*"