diff options
Diffstat (limited to 'gcc/fortran/expr.c')
-rw-r--r-- | gcc/fortran/expr.c | 14 |
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]); |