diff options
author | Francois-Xavier Coudert <coudert@clipper.ens.fr> | 2006-05-29 21:21:27 +0200 |
---|---|---|
committer | François-Xavier Coudert <fxcoudert@gcc.gnu.org> | 2006-05-29 19:21:27 +0000 |
commit | a64a81baf6ef02cd3d474d5eb20a1d28a45f7290 (patch) | |
tree | 72679f07b58b86bfa69a3e753279e179052931f9 /gcc/fortran | |
parent | 944caafcb8dffa37c940620c23e75e381c574248 (diff) | |
download | gcc-a64a81baf6ef02cd3d474d5eb20a1d28a45f7290.zip gcc-a64a81baf6ef02cd3d474d5eb20a1d28a45f7290.tar.gz gcc-a64a81baf6ef02cd3d474d5eb20a1d28a45f7290.tar.bz2 |
re PR fortran/19777 (-fbounds-check catches non-existent bounds violation)
PR fortran/19777
* trans-array.c (gfc_conv_array_ref): Perform out-of-bounds
checking for assumed-size arrrays for all but the last dimension.
* gfortran.dg/bounds_check_2.f: Add new check for multidimensional
arrays.
From-SVN: r114210
Diffstat (limited to 'gcc/fortran')
-rw-r--r-- | gcc/fortran/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/fortran/trans-array.c | 11 |
2 files changed, 12 insertions, 5 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 6d3e17a..e559805 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,5 +1,11 @@ 2006-05-29 Francois-Xavier Coudert <coudert@clipper.ens.fr> + PR fortran/19777 + * trans-array.c (gfc_conv_array_ref): Perform out-of-bounds + checking for assumed-size arrrays for all but the last dimension. + +2006-05-29 Francois-Xavier Coudert <coudert@clipper.ens.fr> + * invoke.texi: Change -fpackderived into -fpack-derived. 2006-05-29 Kazu Hirata <kazu@codesourcery.com> diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c index 737beef..7dfba2a 100644 --- a/gcc/fortran/trans-array.c +++ b/gcc/fortran/trans-array.c @@ -1783,7 +1783,7 @@ gfc_trans_array_bound_check (gfc_se * se, tree descriptor, tree index, int n) cond = fold_build2 (GT_EXPR, boolean_type_node, index, tmp); fault = fold_build2 (TRUTH_OR_EXPR, boolean_type_node, fault, cond); - gfc_trans_runtime_check (fault, gfc_strconst_fault, &se->pre); + gfc_trans_runtime_check (fault, gfc_msg_fault, &se->pre); return index; } @@ -1948,7 +1948,8 @@ gfc_conv_array_ref (gfc_se * se, gfc_array_ref * ar) gfc_conv_expr_type (&indexse, ar->start[n], gfc_array_index_type); gfc_add_block_to_block (&se->pre, &indexse.pre); - if (flag_bounds_check && ar->as->type != AS_ASSUMED_SIZE) + if (flag_bounds_check && + (ar->as->type != AS_ASSUMED_SIZE || n < ar->dimen - 1)) { /* Check array bounds. */ tree cond; @@ -1978,7 +1979,7 @@ gfc_conv_array_ref (gfc_se * se, gfc_array_ref * ar) } if (flag_bounds_check) - gfc_trans_runtime_check (fault, gfc_strconst_fault, &se->pre); + gfc_trans_runtime_check (fault, gfc_msg_fault, &se->pre); tmp = gfc_conv_array_offset (se->expr); if (!integer_zerop (tmp)) @@ -2519,7 +2520,7 @@ gfc_conv_ss_startstride (gfc_loopinfo * loop) size[n] = gfc_evaluate_now (tmp, &block); } } - gfc_trans_runtime_check (fault, gfc_strconst_bounds, &block); + gfc_trans_runtime_check (fault, gfc_msg_bounds, &block); tmp = gfc_finish_block (&block); gfc_add_expr_to_block (&loop->pre, tmp); @@ -3714,7 +3715,7 @@ gfc_trans_dummy_array_bias (gfc_symbol * sym, tree tmpdesc, tree body) stride2 = build2 (MINUS_EXPR, gfc_array_index_type, dubound, dlbound); tmp = fold_build2 (NE_EXPR, gfc_array_index_type, tmp, stride2); - gfc_trans_runtime_check (tmp, gfc_strconst_bounds, &block); + gfc_trans_runtime_check (tmp, gfc_msg_bounds, &block); } } else |