[Bug fortran/54788] ICE on pointer-array element assignment

burnus at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Wed Oct 3 09:14:00 GMT 2012


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54788

--- Comment #3 from Tobias Burnus <burnus at gcc dot gnu.org> 2012-10-03 09:14:26 UTC ---
(In reply to comment #0)
>   allocate(vec(2))
>   allocate(vec(0)%arr(4,4))

I assume you have a C background. In Fortran, by default the lower array bound
is one. Thus, with "allocate(vec(2))" you allocated an array of size 2, which
can be accessed via vec(1) and vec(2). Thus, you access invalid memory for
"vec(0)".

However, you can also allocate via
   allocate(vec(0:2))
then you have a size-3 array, where vec(0), vec(1) and vec(2) are valid.
(you could also have negative bounds, e.g. "allocate(vec(-2:0))".)


The other point is, as Janus already mentioned: Fortran only has pointers to
arrays but not an array of pointers. Thus "vec(1)" and "vec(2)" point to the
same array, one to the first element and one to the second element.

In terms of the standard,
  allocate(vec(2))
allocates an anonymous target (a rank-1, size-2 array) and then pointer assigns
that target to the (scalar) pointer "vec". Thus "vec" is a pointer to a size-2
array with the lower bound "1" and upper bound "2".


(In reply to comment #2)
> Thus, if you want to do bounds remapping, you have to specify a range, e.g.
>   vec(1:1) => vec(0:0)

Remark to my example: While it is syntactically correct, accessing "vec(0:0)"
isn't (out of bounds). It were okay for "allocate(vec(0:2))" - but still, it
wouldn't do what you expect:
"vec(1)" would then point to the first element of the array, "vec(2)" would be
in principle the second element (and in practice accessible), but but one may
not use it: In "vec(1:1) =>" one has explicitly told the compiler that one only
wants to point to a size-1 array.



More information about the Gcc-bugs mailing list