vla: print "variable length" for unresolved dynamic bounds
authorSanimir Agovic <sanimir.agovic@intel.com>
Thu, 14 Nov 2013 09:55:52 +0000 (09:55 +0000)
committerJoel Brobecker <brobecker@adacore.com>
Mon, 14 Apr 2014 16:16:30 +0000 (09:16 -0700)
1| void foo (size_t n) {
2|   int vla[n];
3| }

Given the following expression

  (gdb) ptype &vla

Gdb evaluates the expression with EVAL_AVOID_SIDE_EFFECTS and thus
does not resolve the bounds information and misinterprets the high
bound as a constant. The current output is:

  type = int (*)[1289346]

this patch deals with this case and prints:

  type = int (*)[variable length]

instead.

gdb/ChangeLog:

* c-typeprint.c (c_type_print_varspec_suffix): Added
check for not yet resolved high bound. If unresolved, print
"variable length" string to the console instead of random
length.

gdb/ChangeLog
gdb/c-typeprint.c

index 955db91..0630f1c 100644 (file)
@@ -1,5 +1,12 @@
 2014-04-14  Sanimir Agovic  <sanimir.agovic@intel.com>
 
+       * c-typeprint.c (c_type_print_varspec_suffix): Added
+       check for not yet resolved high bound. If unresolved, print
+       "variable length" string to the console instead of random
+       length.
+
+2014-04-14  Sanimir Agovic  <sanimir.agovic@intel.com>
+
        * ada-lang.c (ada_value_primitive_packed_val): Re-fetch type from
        value.
        (ada_template_to_fixed_record_type_1): Likewise.
index 4edc9ec..d910058 100644 (file)
@@ -689,7 +689,11 @@ c_type_print_varspec_suffix (struct type *type,
 
        fprintf_filtered (stream, (is_vector ?
                                   " __attribute__ ((vector_size(" : "["));
-       if (get_array_bounds (type, &low_bound, &high_bound))
+       /* Bounds are not yet resolved, print a bounds placeholder instead.  */
+       if (TYPE_HIGH_BOUND_KIND (TYPE_INDEX_TYPE (type)) == PROP_LOCEXPR
+           || TYPE_HIGH_BOUND_KIND (TYPE_INDEX_TYPE (type)) == PROP_LOCLIST)
+         fprintf_filtered (stream, "variable length");
+       else if (get_array_bounds (type, &low_bound, &high_bound))
          fprintf_filtered (stream, "%s", 
                            plongest (high_bound - low_bound + 1));
        fprintf_filtered (stream, (is_vector ? ")))" : "]"));