aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran
diff options
context:
space:
mode:
authorFrancois-Xavier Coudert <fxcoudert@gcc.gnu.org>2008-05-14 21:20:10 +0000
committerFrançois-Xavier Coudert <fxcoudert@gcc.gnu.org>2008-05-14 21:20:10 +0000
commit4c7382bba925267cd4c71d29c0255c2964b4cb67 (patch)
tree1c3a56e6dca368522831f733c93f7761f0f54c3f /gcc/fortran
parentf10827b13be2d7f3a031c93ba6fcc35f81f762fd (diff)
downloadgcc-4c7382bba925267cd4c71d29c0255c2964b4cb67.zip
gcc-4c7382bba925267cd4c71d29c0255c2964b4cb67.tar.gz
gcc-4c7382bba925267cd4c71d29c0255c2964b4cb67.tar.bz2
re PR fortran/35682 (assignment to run-time zero-sized complex section stores a value)
PR fortran/35682 * trans-array.c (gfc_conv_ss_startstride): Any negative size is the same as zero size. (gfc_conv_loop_setup): Fix size calculation. * gfortran.dg/bound_4.f90: New test. * gfortran.dg/bounds_check_14.f90: New test. From-SVN: r135306
Diffstat (limited to 'gcc/fortran')
-rw-r--r--gcc/fortran/ChangeLog7
-rw-r--r--gcc/fortran/trans-array.c6
2 files changed, 12 insertions, 1 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index d478a25..d2470a1 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,5 +1,12 @@
2008-05-14 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
+ PR fortran/35682
+ * trans-array.c (gfc_conv_ss_startstride): Any negative size is
+ the same as zero size.
+ (gfc_conv_loop_setup): Fix size calculation.
+
+2008-05-14 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
+
PR fortran/35685
* trans-intrinsic.c (gfc_conv_intrinsic_bound): Correctly
handle zero-size sections.
diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c
index 5fc5688..3c099dd 100644
--- a/gcc/fortran/trans-array.c
+++ b/gcc/fortran/trans-array.c
@@ -3083,6 +3083,8 @@ gfc_conv_ss_startstride (gfc_loopinfo * loop)
info->start[n]);
tmp = fold_build2 (FLOOR_DIV_EXPR, gfc_array_index_type, tmp,
info->stride[n]);
+ tmp = fold_build2 (MAX_EXPR, gfc_array_index_type, tmp,
+ build_int_cst (gfc_array_index_type, 0));
/* We remember the size of the first section, and check all the
others against this. */
if (size[n])
@@ -3435,8 +3437,10 @@ gfc_conv_loop_setup (gfc_loopinfo * loop)
for (i = 0; i<=last; i++){...}; */
tmp = fold_build2 (MINUS_EXPR, gfc_array_index_type,
loop->to[n], loop->from[n]);
- tmp = fold_build2 (TRUNC_DIV_EXPR, gfc_array_index_type,
+ tmp = fold_build2 (FLOOR_DIV_EXPR, gfc_array_index_type,
tmp, info->stride[n]);
+ tmp = fold_build2 (MAX_EXPR, gfc_array_index_type, tmp,
+ build_int_cst (gfc_array_index_type, -1));
loop->to[n] = gfc_evaluate_now (tmp, &loop->pre);
/* Make the loop variable start at 0. */
loop->from[n] = gfc_index_zero_node;