diff options
author | Nicolas Koenig <koenigni@student.ethz.ch> | 2017-05-14 01:38:36 +0200 |
---|---|---|
committer | Nicolas Koenig <koenigni@gcc.gnu.org> | 2017-05-13 23:38:36 +0000 |
commit | 28ae01cd23d05ce79307db054782e576ab01f3b7 (patch) | |
tree | 3ca978cfd162f79396bf4315f9080c971680cedb /gcc/fortran/array.c | |
parent | 364490206eaee4e4da9f66e63169cc0c0ddfe40e (diff) | |
download | gcc-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.c | 9 |
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 |