Revert "Do not consider reference types as dynamic"
authorPierre-Marie de Rodat <derodat@adacore.com>
Mon, 20 Apr 2015 14:06:50 +0000 (16:06 +0200)
committerPierre-Marie de Rodat <derodat@adacore.com>
Mon, 20 Apr 2015 14:25:12 +0000 (16:25 +0200)
This reverts commit 961f41602529c9cd4f88af6c02fb61fb55100e27.

Note that the revert is partial: it keeps the new testcases
gdb.ada/funcall_ref.exp.

gdb/ChangeLog
gdb/gdbtypes.c

index ea70a6b592ab49526f9f37df941265a4233e14fe..d8aafa6bbb911b3d1570527937027b04ebac1460 100644 (file)
@@ -1,3 +1,12 @@
+2015-04-20  Pierre-Marie de Rodat  <derodat@adacore.com>
+
+       Revert:
+       2015-04-03  Pierre-Marie de Rodat  <derodat@adacore.com>
+       * gdbtypes.c (is_dynamic_type_internal): Remove special handling of
+       TYPE_CODE_REF types so that they are not considered as dynamic
+       depending on the referenced type.
+       (resolve_dynamic_type_internal): Likewise.
+
 2015-04-20  Pierre-Marie de Rodat  <derodat@adacore.com>
 
        Revert:
index 6fb2e9a5f35ec512c263263ab26898412b7750a2..217ec7007e7e69ef1082d0b144fe271fccdabf00 100644 (file)
@@ -1752,6 +1752,10 @@ is_dynamic_type_internal (struct type *type, int top_level)
 {
   type = check_typedef (type);
 
+  /* We only want to recognize references at the outermost level.  */
+  if (top_level && TYPE_CODE (type) == TYPE_CODE_REF)
+    type = check_typedef (TYPE_TARGET_TYPE (type));
+
   /* Types that have a dynamic TYPE_DATA_LOCATION are considered
      dynamic, even if the type itself is statically defined.
      From a user's point of view, this may appear counter-intuitive;
@@ -2041,6 +2045,21 @@ resolve_dynamic_type_internal (struct type *type,
 
       switch (TYPE_CODE (type))
        {
+       case TYPE_CODE_REF:
+         {
+           struct property_addr_info pinfo;
+
+           pinfo.type = check_typedef (TYPE_TARGET_TYPE (type));
+           pinfo.addr = read_memory_typed_address (addr_stack->addr, type);
+           pinfo.next = addr_stack;
+
+           resolved_type = copy_type (type);
+           TYPE_TARGET_TYPE (resolved_type)
+             = resolve_dynamic_type_internal (TYPE_TARGET_TYPE (type),
+                                              &pinfo, top_level);
+           break;
+         }
+
        case TYPE_CODE_ARRAY:
          resolved_type = resolve_dynamic_array (type, addr_stack);
          break;