diff options
author | fxcoudert <fxcoudert@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-09-18 21:25:40 +0000 |
---|---|---|
committer | fxcoudert <fxcoudert@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-09-18 21:25:40 +0000 |
commit | d1bc0659b7e57c1422888f0d3e48dc9fcae66015 (patch) | |
tree | 840b670afbca3676c80e2e73b02d1cc9ae3a0c25 /gcc/fortran/trans-array.c | |
parent | 73b7e503d84d854c1e44149da1915d0d49a60b98 (diff) | |
download | gcc-d1bc0659b7e57c1422888f0d3e48dc9fcae66015.tar.gz |
PR fortran/31119
* trans-array.c (gfc_conv_ss_startstride): Only perform bounds
checking for optional args when they are present.
* gfortran.dg/bounds_check_9.f90: New test.
* gfortran.dg/bounds_check_fail_2.f90: New test.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@128587 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/fortran/trans-array.c')
-rw-r--r-- | gcc/fortran/trans-array.c | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c index 1e02b81167f..64a62dbd018 100644 --- a/gcc/fortran/trans-array.c +++ b/gcc/fortran/trans-array.c @@ -2993,8 +2993,22 @@ gfc_conv_ss_startstride (gfc_loopinfo * loop) others against this. */ if (size[n]) { - tree tmp3 - = fold_build2 (NE_EXPR, boolean_type_node, tmp, size[n]); + tree tmp3; + + tmp3 = fold_build2 (NE_EXPR, boolean_type_node, tmp, size[n]); + + /* For optional arguments, only check bounds if the + argument is present. */ + if (ss->expr->symtree->n.sym->attr.optional + || ss->expr->symtree->n.sym->attr.not_always_present) + { + tree cond; + + cond = gfc_conv_expr_present (ss->expr->symtree->n.sym); + tmp3 = fold_build2 (TRUTH_AND_EXPR, boolean_type_node, + cond, tmp3); + } + asprintf (&msg, "%s, size mismatch for dimension %d " "of array '%s' (%%ld/%%ld)", gfc_msg_bounds, info->dim[n]+1, ss->expr->symtree->name); |