This is the mail archive of the
fortran@gcc.gnu.org
mailing list for the GNU Fortran project.
PR 19925 and expansion of array constructors
- From: Erik Edelmann <eedelman at acclab dot helsinki dot fi>
- To: fortran at gcc dot gnu dot org
- Date: Thu, 30 Jun 2005 21:37:53 +0300
- Subject: PR 19925 and expansion of array constructors
I've been looking at PR 19925. The bug reported in the PR is
that large implied do loops in initialisation expressions doesn't
work; the code
program stuff
integer :: i_do
integer :: i(101) = (/ (i_do, i_do=1,101) /)
write (*,*) i
end program stuff
gives an ICE. However, if the size of the array i is reduced to
100 it does work. The reason for this is that the function
gfc_expand_constructor in array.c only expands constructors up to
a size of GFC_MAX_AC_EXPAND, which is defined to be 100. Then,
in the function gfc_conv_array_initializer (in trans-array.c), we
have the following code:
if (c->iterator)
{
/* Problems occur when we get something like
integer :: a(lots) = (/(i, i=1,lots)/) */
/* TODO: Unexpanded array initializers. */
internal_error
("Possible frontend bug: array constructor not expanded");
}
The TODO comment indicates that the expansion should be made
here. The comment that introduces gfc_conv_array_initializer,
however, says
/* Create an array constructor from an initialization expression.
We assume the frontend already did any expansions and conversions. */
which indicates that the constructors should have been expanded
_before_ we get here.
My question is: where is the correct place to expand the
constructor? And why not expand all constructors, small as well as
large, in gfc_expand_constructor? Since they'll have to be
eaxpanded anyway at some point, why not do it from the beginning?
Erik