c_value_print: Revert 'val' to a reference for TYPE_CODE_STRUCT
authorMartin Galvan <martin.galvan@tallertechnologies.com>
Wed, 27 Apr 2016 15:01:14 +0000 (12:01 -0300)
committerMartin Galvan <martin.galvan@tallertechnologies.com>
Wed, 27 Apr 2016 15:05:43 +0000 (12:05 -0300)
Currently c_value_print will turn struct reference values into pointers before
doing a set of RTTI checks.  This was introduced as a fix to PR c++/15401.
If there's RTTI the pointer will be adjusted and converted back to a reference.
However, if there's no RTTI the value will still be treated as a pointer during
the remainder of the function.
This patch moves the conversion down so that it's always performed when needed.

Notice this currently has not user-visible effects, so can be seen as a small
code cleanup.  However, it'll be necessary for the bug-fix for handling
synthetic C++ references.  It causes no testsuite regressions.

gdb/ChangeLog:
2016-04-26  Martin Galvan  <martin.galvan@tallertechnologies.com>

* c-valprint.c (c_value_print): Always convert val back to reference
type if we converted it to a pointer type.

gdb/ChangeLog
gdb/c-valprint.c

index df10de45abda43d36e9377b0ce4df988befe74ee..165c2a34f357753b5c6abd77fe44c321c5e7e5c6 100644 (file)
@@ -1,3 +1,8 @@
+2016-04-27  Martin Galvan  <martin.galvan@tallertechnologies.com>
+
+       * c-valprint.c (c_value_print): Always convert val back to reference
+       type if we converted it to a pointer type.
+
 2016-04-27  Andreas Arnez  <arnez@linux.vnet.ibm.com>
 
        * configure.ac: Enhance configure check for babeltrace to reject
index 62552ec7fd9090fb03c5f33f39fd8ba61e12f780..e1da3d50e36e4b1a130adc00b6fdab88c85728df 100644 (file)
@@ -611,7 +611,7 @@ c_value_print (struct value *val, struct ui_file *stream,
          fprintf_filtered (stream, "(");
 
          if (value_entirely_available (val))
-           {
+           {
              real_type = value_rtti_indirect_type (val, &full, &top,
                                                    &using_enc);
              if (real_type)
@@ -623,18 +623,19 @@ c_value_print (struct value *val, struct ui_file *stream,
                  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
                     attributes.  */
                }
            }
-          type_print (type, "", stream, -1);
+
+         if (is_ref)
+           {
+             val = value_ref (value_ind (val));
+             type = value_type (val);
+           }
+
+         type_print (type, "", stream, -1);
          fprintf_filtered (stream, ") ");
          val_type = type;
        }