On Tue, 17 Jun 2014 15:48:19 +0200, Keven Boell wrote: > Am 16.06.2014 23:02, schrieb Jan Kratochvil: > > On Wed, 04 Jun 2014 07:54:07 +0200, Keven Boell wrote: > >> diff --git a/gdb/valarith.c b/gdb/valarith.c > >> index 8e863e3..bddb9db 100644 > >> --- a/gdb/valarith.c > >> +++ b/gdb/valarith.c > >> @@ -200,7 +200,14 @@ value_subscripted_rvalue (struct value *array, LONGEST index, int lowerbound) > >> > >> if (index < lowerbound || (!TYPE_ARRAY_UPPER_BOUND_IS_UNDEFINED (array_type) > >> && elt_offs >= TYPE_LENGTH (array_type))) > >> - error (_("no such vector element")); > >> + { > >> + if (TYPE_NOT_ASSOCIATED (array_type)) > >> + error (_("no such vector element because not associated")); > >> + else if (TYPE_NOT_ALLOCATED (array_type)) > >> + error (_("no such vector element because not allocated")); > >> + else > >> + error (_("no such vector element")); > >> + } > >> > >> if (VALUE_LVAL (array) == lval_memory && value_lazy (array)) > >> v = allocate_value_lazy (elt_type); > > > > I find here the patch is incomplete. Earlier this function has: > > unsigned int elt_offs = elt_size * longest_to_int (index - lowerbound); > > > > and in some cases - specifically with the 64-bit inferior objects patch, the > > *bitpos* patches from: > > http://pkgs.fedoraproject.org/cgit/gdb.git/tree/ > > one occasionally gets for TYPE_NOT_ALLOCATED inferior variables: > > Value out of range. > > instead of the more correct: > > no such vector element because not allocated > > > > Because for TYPE_NOT_ALLOCATED inferior variable the LOWERBOUND value read > > from the inferior is bogus and 'index - lowerbound' will not fit in 'int'. > > This change just adds some more information for the already existing > "no such vector element" message. To me the change you are describing > sounds more like a generic fix for this function or am I wrong? I am not sure if the fix I suggest belongs to this patch series part but it definitely belongs to this patch series. Beforehand if this function value_subscripted_rvalue was called the parameter 'lowerbound' had to be always valid. But by introducting the TYPE_NOT_ALLOCATED functionality 'lowerbound' can be passed invalid and so GDB should not touch it if the array/type is TYPE_NOT_ALLOCATED. Otherwise this patchset has a regression against my former VLA patchset on unallocated Fortran arrays where instead of expected no such vector element because not allocated it sometimes - depending on what is read from uninitialized inferior memory, therefore not always - prints instead: Value out of range. I had to apply the attached fix. I am not completely sure this is the right fix - IMO when the array is not allocated GDB should not try to read the array bound(s) from inferior memory as there is an undefined value that time. Jan