aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/resolve.c
diff options
context:
space:
mode:
authorThomas Koenig <tkoenig@gcc.gnu.org>2010-08-09 19:34:49 +0000
committerThomas Koenig <tkoenig@gcc.gnu.org>2010-08-09 19:34:49 +0000
commitee247636108baa13ae1f5322cb048d7c05a418cc (patch)
treee8a74351fdd3fd516d43ad305c53af81d3ee674d /gcc/fortran/resolve.c
parent1ddfdcf2df840ed6754d99630a3e1b7247ef9ead (diff)
downloadgcc-ee247636108baa13ae1f5322cb048d7c05a418cc.zip
gcc-ee247636108baa13ae1f5322cb048d7c05a418cc.tar.gz
gcc-ee247636108baa13ae1f5322cb048d7c05a418cc.tar.bz2
re PR fortran/44235 (array temporary with high upper bound)
2010-08-09 Thomas Koenig <tkoenig@gcc.gnu.org> PR fortran/44235 * array.c (gfc_ref_dimen_size): Add end argument. If end is non-NULL, calculate it. (ref_size): Adjust call to gfc_ref_dimen_size. (gfc_array_dimen_size): Likewise. (gfc_array_res_shape): Likewise. * gfortran.h: Adjust prototype for gfc_ref_dimen_size. * resolve.c (resolve_array_ref): For stride not equal to -1, fill in the lowest possible end. 2010-08-09 Thomas Koenig <tkoenig@gcc.gnu.org> PR fortran/44235 * gfortran.dg/dependency_32.f90: New test. From-SVN: r163041
Diffstat (limited to 'gcc/fortran/resolve.c')
-rw-r--r--gcc/fortran/resolve.c32
1 files changed, 32 insertions, 0 deletions
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index 69a0036..9933b5d 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -4377,6 +4377,38 @@ resolve_array_ref (gfc_array_ref *ar)
&ar->c_where[i], e->rank);
return FAILURE;
}
+
+ /* Fill in the upper bound, which may be lower than the
+ specified one for something like a(2:10:5), which is
+ identical to a(2:7:5). Only relevant for strides not equal
+ to one. */
+ if (ar->dimen_type[i] == DIMEN_RANGE
+ && ar->stride[i] != NULL && ar->stride[i]->expr_type == EXPR_CONSTANT
+ && mpz_cmp_si (ar->stride[i]->value.integer, 1L) != 0)
+ {
+ mpz_t size, end;
+
+ if (gfc_ref_dimen_size (ar, i, &size, &end) == SUCCESS)
+ {
+ if (ar->end[i] == NULL)
+ {
+ ar->end[i] =
+ gfc_get_constant_expr (BT_INTEGER, gfc_index_integer_kind,
+ &ar->where);
+ mpz_set (ar->end[i]->value.integer, end);
+ }
+ else if (ar->end[i]->ts.type == BT_INTEGER
+ && ar->end[i]->expr_type == EXPR_CONSTANT)
+ {
+ mpz_set (ar->end[i]->value.integer, end);
+ }
+ else
+ gcc_unreachable ();
+
+ mpz_clear (size);
+ mpz_clear (end);
+ }
+ }
}
if (ar->type == AR_FULL && ar->as->rank == 0)