From be1f04f75c6a926659b932ef02169844a74bec76 Mon Sep 17 00:00:00 2001 From: "Steven G. Kargl" Date: Wed, 25 Apr 2018 00:12:58 +0000 Subject: [PATCH] re PR fortran/85520 (Out of memory when declaring a character with len << 0) 2018-04-24 Steven G. Kargl PR fortran/85520 * decl.c (gfc_match_char_spec): Check for negative length and set to 0. 2018-04-24 Steven G. Kargl PR fortran/85520 * gfortran.dg/pr85520.f90: New test. From-SVN: r259625 --- gcc/fortran/ChangeLog | 5 +++++ gcc/fortran/decl.c | 6 +++++- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gfortran.dg/pr85520.f90 | 7 +++++++ 4 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gfortran.dg/pr85520.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index d0554695aea0..e7c919c9f2fc 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,8 @@ +2018-04-24 Steven G. Kargl + + PR fortran/85520 + * decl.c (gfc_match_char_spec): Check for negative length and set to 0. + 2018-03-28 Thomas Koenig PR fortran/85084 diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c index 4000a0c76b6d..917b89f0a482 100644 --- a/gcc/fortran/decl.c +++ b/gcc/fortran/decl.c @@ -3023,7 +3023,11 @@ done: e = gfc_copy_expr (len); gfc_reduce_init_expr (e); if (e->expr_type == EXPR_CONSTANT) - gfc_replace_expr (len, e); + { + gfc_replace_expr (len, e); + if (mpz_cmp_si (len->value.integer, 0) < 0) + mpz_set_ui (len->value.integer, 0); + } else gfc_free_expr (e); cl->length = len; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2f36f83abf93..84ea927b2318 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-04-24 Steven G. Kargl + + PR fortran/85520 + * gfortran.dg/pr85520.f90: New test. + 2018-04-23 Aaron Sawdey Backport from mainline diff --git a/gcc/testsuite/gfortran.dg/pr85520.f90 b/gcc/testsuite/gfortran.dg/pr85520.f90 new file mode 100644 index 000000000000..3e66a9020f8d --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr85520.f90 @@ -0,0 +1,7 @@ +! { dg-do run } +! PR fortran/85520 +! Original code from Gerhard Steinmetz +program p + character(-huge(1)) :: c = ' ' + if (len(c) /= 0) stop 1 +end -- 2.47.2