aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/simplify.c
diff options
context:
space:
mode:
authorFrancois-Xavier Coudert <fxcoudert@gcc.gnu.org>2009-05-16 16:53:02 +0000
committerFrançois-Xavier Coudert <fxcoudert@gcc.gnu.org>2009-05-16 16:53:02 +0000
commitb0c068160f502c9d37ec02c8a514546937544eb8 (patch)
treec2d721e1845abbc3569797c630078a90a7ba5746 /gcc/fortran/simplify.c
parent1ab8a8c260784fef348ec8cdae76a859a6b0081c (diff)
downloadgcc-b0c068160f502c9d37ec02c8a514546937544eb8.zip
gcc-b0c068160f502c9d37ec02c8a514546937544eb8.tar.gz
gcc-b0c068160f502c9d37ec02c8a514546937544eb8.tar.bz2
re PR fortran/31243 (Detect strings longer than 2**32 characters)
PR fortran/31243 * resolve.c (resolve_substring): Don't allow too large substring indexes. (gfc_resolve_substring_charlen): Fix typo. (gfc_resolve_character_operator): Fix typo. (resolve_charlen): Catch unreasonably large string lengths. * simplify.c (gfc_simplify_len): Don't error out on LEN range checks. * gcc/testsuite/gfortran.dg/string_1.f90: New test. * gcc/testsuite/gfortran.dg/string_2.f90: New test. * gcc/testsuite/gfortran.dg/string_3.f90: New test. From-SVN: r147619
Diffstat (limited to 'gcc/fortran/simplify.c')
-rw-r--r--gcc/fortran/simplify.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/gcc/fortran/simplify.c b/gcc/fortran/simplify.c
index 7be4671..68ebb56 100644
--- a/gcc/fortran/simplify.c
+++ b/gcc/fortran/simplify.c
@@ -2433,7 +2433,13 @@ gfc_simplify_len (gfc_expr *e, gfc_expr *kind)
{
result = gfc_constant_result (BT_INTEGER, k, &e->where);
mpz_set_si (result->value.integer, e->value.character.length);
- return range_check (result, "LEN");
+ if (gfc_range_check (result) == ARITH_OK)
+ return result;
+ else
+ {
+ gfc_free_expr (result);
+ return NULL;
+ }
}
if (e->ts.cl != NULL && e->ts.cl->length != NULL
@@ -2442,7 +2448,13 @@ gfc_simplify_len (gfc_expr *e, gfc_expr *kind)
{
result = gfc_constant_result (BT_INTEGER, k, &e->where);
mpz_set (result->value.integer, e->ts.cl->length->value.integer);
- return range_check (result, "LEN");
+ if (gfc_range_check (result) == ARITH_OK)
+ return result;
+ else
+ {
+ gfc_free_expr (result);
+ return NULL;
+ }
}
return NULL;