From: Steven G. Kargl Date: Wed, 25 Apr 2018 00:12:58 +0000 (+0000) Subject: re PR fortran/85520 (Out of memory when declaring a character with len << 0) X-Git-Tag: releases/gcc-6.5.0~357 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=be1f04f75c6a926659b932ef02169844a74bec76;p=thirdparty%2Fgcc.git 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 --- 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