diff options
author | Tobias Schlüter <tobi@gcc.gnu.org> | 2007-10-13 23:43:49 +0200 |
---|---|---|
committer | Tobias Schlüter <tobi@gcc.gnu.org> | 2007-10-13 23:43:49 +0200 |
commit | 08ddab21215fba57be1ebdb495b9374953a6b679 (patch) | |
tree | 6b594a4e30b35f8484ca497241d85bc81bf45595 /gcc/fortran/trans-array.c | |
parent | ca94e524220617cadc4b32290474c50a0964fd46 (diff) | |
download | gcc-08ddab21215fba57be1ebdb495b9374953a6b679.zip gcc-08ddab21215fba57be1ebdb495b9374953a6b679.tar.gz gcc-08ddab21215fba57be1ebdb495b9374953a6b679.tar.bz2 |
re PR fortran/33254 (Diagnose different string lengths in array constructors at run time)
2007-10-13 Tobias Schlueter <tobi@gcc.gnu.org>
Paul Thomas <pault@gcc.gnu.org>
PR fortran/33254
PR fortran/33727
fortran/
* trans-array.c (get_array_ctor_var_strlen): Check upper bound for
constness instead of lower bound.
(get_array_ctor_strlen): Add bounds-checking code.
testsuite/
* bounds_check_10.f90: New.
Co-Authored-By: Paul Thomas <pault@gcc.gnu.org>
From-SVN: r129286
Diffstat (limited to 'gcc/fortran/trans-array.c')
-rw-r--r-- | gcc/fortran/trans-array.c | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c index 2edc95b..4fb1fda 100644 --- a/gcc/fortran/trans-array.c +++ b/gcc/fortran/trans-array.c @@ -1340,7 +1340,7 @@ get_array_ctor_var_strlen (gfc_expr * expr, tree * len) case REF_SUBSTRING: if (ref->u.ss.start->expr_type != EXPR_CONSTANT - || ref->u.ss.start->expr_type != EXPR_CONSTANT) + || ref->u.ss.end->expr_type != EXPR_CONSTANT) break; mpz_init_set_ui (char_len, 1); mpz_add (char_len, char_len, ref->u.ss.end->value.integer); @@ -1413,6 +1413,7 @@ bool get_array_ctor_strlen (stmtblock_t *block, gfc_constructor * c, tree * len) { bool is_const; + tree first_len = NULL_TREE; is_const = TRUE; @@ -1447,6 +1448,23 @@ get_array_ctor_strlen (stmtblock_t *block, gfc_constructor * c, tree * len) get_array_ctor_all_strlen (block, c->expr, len); break; } + if (flag_bounds_check) + { + if (!first_len) + first_len = *len; + else + { + /* Verify that all constructor elements are of the same + length. */ + tree cond = fold_build2 (NE_EXPR, boolean_type_node, + first_len, *len); + gfc_trans_runtime_check + (cond, block, &c->expr->where, + "Different CHARACTER lengths (%ld/%ld) in array constructor", + fold_convert (long_integer_type_node, first_len), + fold_convert (long_integer_type_node, *len)); + } + } } return is_const; |