aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/array.c
diff options
context:
space:
mode:
authorNicolas Koenig <koenigni@student.ethz.ch>2017-05-14 01:38:36 +0200
committerNicolas Koenig <koenigni@gcc.gnu.org>2017-05-13 23:38:36 +0000
commit28ae01cd23d05ce79307db054782e576ab01f3b7 (patch)
tree3ca978cfd162f79396bf4315f9080c971680cedb /gcc/fortran/array.c
parent364490206eaee4e4da9f66e63169cc0c0ddfe40e (diff)
downloadgcc-28ae01cd23d05ce79307db054782e576ab01f3b7.zip
gcc-28ae01cd23d05ce79307db054782e576ab01f3b7.tar.gz
gcc-28ae01cd23d05ce79307db054782e576ab01f3b7.tar.bz2
re PR fortran/80442 (Rejects DATA statement with array slice)
2017-05-09 Nicolas Koenig <koenigni@student.ethz.ch> PR fortran/80442 * array.c (gfc_ref_dimen_size): Simplify stride expression * data.c (gfc_advance_section): Simplify start, end and stride expressions (gfc_advance_section): Simplify start and end expressions (gfc_get_section_index): Simplify start expression 2017-05-09 Nicolas Koenig <koenigni@student.ethz.ch> PR fortran/80442 * gfortran.dg/impl_do_var_data.f90: New Test From-SVN: r248012
Diffstat (limited to 'gcc/fortran/array.c')
-rw-r--r--gcc/fortran/array.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/gcc/fortran/array.c b/gcc/fortran/array.c
index ec0c266..30656c1 100644
--- a/gcc/fortran/array.c
+++ b/gcc/fortran/array.c
@@ -2201,6 +2201,7 @@ gfc_ref_dimen_size (gfc_array_ref *ar, int dimen, mpz_t *result, mpz_t *end)
mpz_t upper, lower, stride;
mpz_t diff;
bool t;
+ gfc_expr *stride_expr = NULL;
if (dimen < 0 || ar == NULL || dimen > ar->dimen - 1)
gfc_internal_error ("gfc_ref_dimen_size(): Bad dimension");
@@ -2225,12 +2226,16 @@ gfc_ref_dimen_size (gfc_array_ref *ar, int dimen, mpz_t *result, mpz_t *end)
mpz_set_ui (stride, 1);
else
{
- if (ar->stride[dimen]->expr_type != EXPR_CONSTANT)
+ stride_expr = gfc_copy_expr(ar->stride[dimen]);
+ if(!gfc_simplify_expr(stride_expr, 1))
+ gfc_internal_error("Simplification error");
+ if (stride_expr->expr_type != EXPR_CONSTANT)
{
mpz_clear (stride);
return false;
}
- mpz_set (stride, ar->stride[dimen]->value.integer);
+ mpz_set (stride, stride_expr->value.integer);
+ gfc_free_expr(stride_expr);
}
/* Calculate the number of elements via gfc_dep_differce, but only if