aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/expr.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/fortran/expr.c')
-rw-r--r--gcc/fortran/expr.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/gcc/fortran/expr.c b/gcc/fortran/expr.c
index 4b03798..b1f064d 100644
--- a/gcc/fortran/expr.c
+++ b/gcc/fortran/expr.c
@@ -1014,6 +1014,7 @@ find_array_section (gfc_expr *expr, gfc_ref *ref)
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 @@ find_array_section (gfc_expr *expr, gfc_ref *ref)
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 @@ find_array_section (gfc_expr *expr, gfc_ref *ref)
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 @@ find_array_section (gfc_expr *expr, gfc_ref *ref)
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 @@ cleanup:
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]);