diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 2a344dd0f4e..c6651f57e35 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2018-01-31 Joel Brobecker + + * gdbtypes.c (lookup_array_range_type): Make sure the array's + index type is objfile-owned if the element type is as well. + 2018-01-31 Joel Brobecker GDB 8.1 released. diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c index 18a0f2f60fa..79bb6596fc2 100644 --- a/gdb/gdbtypes.c +++ b/gdb/gdbtypes.c @@ -1231,10 +1231,15 @@ struct type * lookup_array_range_type (struct type *element_type, LONGEST low_bound, LONGEST high_bound) { - struct gdbarch *gdbarch = get_type_arch (element_type); - struct type *index_type = builtin_type (gdbarch)->builtin_int; - struct type *range_type - = create_static_range_type (NULL, index_type, low_bound, high_bound); + struct type *index_type; + struct type *range_type; + + if (TYPE_OBJFILE_OWNED (element_type)) + index_type = objfile_type (TYPE_OWNER (element_type).objfile)->builtin_int; + else + index_type = builtin_type (get_type_arch (element_type))->builtin_int; + range_type = create_static_range_type (NULL, index_type, + low_bound, high_bound); return create_array_type (NULL, element_type, range_type); } diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 19b3eda9f81..fa0da609622 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2018-01-31 Joel Brobecker + + * testsuite/gdb.ada/dyn_stride.exp: Add "print a1(1)@3" test. + 2018-01-30 Pedro Alves PR gdb/13211 diff --git a/gdb/testsuite/gdb.ada/dyn_stride.exp b/gdb/testsuite/gdb.ada/dyn_stride.exp index 0267ca192bf..dae51061161 100644 --- a/gdb/testsuite/gdb.ada/dyn_stride.exp +++ b/gdb/testsuite/gdb.ada/dyn_stride.exp @@ -39,3 +39,22 @@ gdb_test "print A1(3)" \ gdb_test "print A1(1..3)" \ "\\(\\(i => 0, s => \"\"\\), \\(i => 1, s => \"A\"\\), \\(i => 2, s => \"AB\"\\)\\)" + +# Test the use of the "repeat" operator (@). +# +# Note that, in this case, the repeat operator makes little sense +# and is NOT equivalent to requesting an array slice. In the case +# of "print a1(1)@3", the size of each element in the array is +# variable from element to element. So, when asked to repeat +# one element of the array a number of times, you're not guaranteed +# to get the same answer as in a slice; while the slice will +# take into account the array stride, the repeat operator uses +# the size of the object being repeated as its stride, which +# is often not the same. So, in the test below, the output for +# the second and third element is not entirely predictable, because +# it reads part of their contents from a memory region which has +# an undefined value (the "holes" between the each actual element +# of the array). + +gdb_test "print a1(1)@3" \ + " = \\(\\(i => 0, s => \"\"\\), \\(i => -?$decimal, s => .*\\), \\(i => -?$decimal, s => .*\\)\\)"