There seems to be something weird going on in gfc_conv_array_initializer. In
the EXPR_ARRAY case, the code builds both an "index" and a "range". Then,
optionally, it adds both of them to the constructor list being built. This is
strange: I would expect either of them to be added, but not both.
A testcase which triggers this behaviour is execute/data.f90. I caught this by
adding this additional verification hunk in varasm.c (but my tree is not clean
so I am not sure this is enough):
*************** output_constructor (tree exp, unsigned H
*** 4089,4094 ****
--- 4109,4115 ----
if each element has the proper size. */
if ((field != 0 || index != 0) && pos != total_bytes)
{
+ gcc_assert (pos >= total_bytes);
assemble_zeros (pos - total_bytes);
total_bytes = pos;
}
*************** output_constructor (tree exp, unsigned H
*** 4164,4169 ****
--- 4185,4191 ----
/* If still not at proper byte, advance to there. */
if (next_offset / BITS_PER_UNIT != total_bytes)
{
+ gcc_assert (next_offset / BITS_PER_UNIT >= total_bytes);
assemble_zeros (next_offset / BITS_PER_UNIT - total_bytes);
total_bytes = next_offset / BITS_PER_UNIT;
}
Also, gfc_conv_array_initializer, in the EXPR_CONSTANT/EXPR_STRUCTURE case,
contains some code which builts a repeated initializer by hand. It looks like
it would be easier but much more memory friendly to just use a RANGE_EXPR.
Steven asked me to assign this to him. This is part of my work to make
CONSTRUCTOR use VECs (actually, it's the only issue left AFAICT).
--
Summary: gfc_conv_array_initializer weirdness
Product: gcc
Version: unknown
Status: UNCONFIRMED
Severity: enhancement
Priority: P2
Component: fortran
AssignedTo: stevenb at suse dot de
ReportedBy: giovannibajo at libero dot it
CC: gcc-bugs at gcc dot gnu dot org
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=22210