Index: gcc/fortran/expr.c =================================================================== --- gcc/fortran/expr.c (révision 116013) +++ gcc/fortran/expr.c (copie de travail) @@ -1014,6 +1014,7 @@ int rank; int d; long unsigned one = 1; + mpz_t start[GFC_MAX_DIMENSIONS]; mpz_t end[GFC_MAX_DIMENSIONS]; mpz_t stride[GFC_MAX_DIMENSIONS]; mpz_t delta[GFC_MAX_DIMENSIONS]; @@ -1052,6 +1053,7 @@ for (d = 0; d < rank; d++) { mpz_init (delta[d]); + mpz_init (start[d]); mpz_init (end[d]); mpz_init (ctr[d]); mpz_init (stride[d]); @@ -1085,15 +1087,16 @@ mpz_set_ui (stride[d], one); /* Obtain the start value for the index. */ - if (begin->value.integer) - mpz_set (ctr[d], begin->value.integer); + if (begin) + mpz_set (start[d], begin->value.integer); else { if (mpz_cmp_si (stride[d], 0) < 0) - mpz_set (ctr[d], upper->value.integer); + mpz_set (start[d], upper->value.integer); else - mpz_set (ctr[d], lower->value.integer); + mpz_set (start[d], lower->value.integer); } + mpz_set (ctr[d], start[d]); /* Obtain the end value for the index. */ if (finish) @@ -1171,7 +1174,7 @@ if (mpz_cmp_ui (stride[d], 0) > 0 ? mpz_cmp (ctr[d], tmp_mpz) > 0 : mpz_cmp (ctr[d], tmp_mpz) < 0) - mpz_set (ctr[d], ref->u.ar.start[d]->value.integer); + mpz_set (ctr[d], start[d]); else mpz_set_ui (stop, 0); } @@ -1205,6 +1208,7 @@ for (d = 0; d < rank; d++) { mpz_clear (delta[d]); + mpz_clear (start[d]); mpz_clear (end[d]); mpz_clear (ctr[d]); mpz_clear (stride[d]); Index: gcc/testsuite/gfortran.dg/array_initializer_2.f90 =================================================================== --- gcc/testsuite/gfortran.dg/array_initializer_2.f90 (révision 0) +++ gcc/testsuite/gfortran.dg/array_initializer_2.f90 (révision 0) @@ -0,0 +1,17 @@ +! { dg-do run } +! Tests the fix for PR28496 in which initializer array constructors with +! a missing initial array index would cause an ICE. +! +! Contributed by Paul Thomas +! Based on original test case from Samir Nordin +! + integer, dimension(3), parameter :: a=(/1,2,3/) + integer, dimension(3), parameter :: b=(/a(:)/) + integer, dimension(3,3), parameter :: c=reshape ((/(i, i = 1,9)/),(/3,3/)) + integer, dimension(2,3), parameter :: d=reshape ((/c(:2:-1,:)/),(/2,3/)) + integer, dimension(3,3), parameter :: e=reshape ((/a(:),a(:)+3,a(:)+6/),(/3,3/)) + integer, dimension(2,3), parameter :: f=reshape ((/c(2:1:-1,:)/),(/2,3/)) + if (any (b .ne. (/1,2,3/))) call abort () + if (any (reshape(d,(/6/)) .ne. (/3, 2, 6, 5, 9, 8/))) call abort () + if (any (reshape(f,(/6/)) .ne. (/2, 1, 5, 4, 8, 7/))) call abort () +end