From c922c0f4cb4929ab43cebf9cd44bba145ad71d1c Mon Sep 17 00:00:00 2001 From: jb Date: Thu, 1 Feb 2018 07:41:03 +0000 Subject: [PATCH] PR 83705 Repeat with large values This patch fixes the regression by increasing the limit where we fall back to runtime to 2**28 elements, which is the same limit where previous releases failed. The are still bugs in the runtime evaluation, so in many cases longer characters will still fail, so print a warning message. Regtested on x86_64-pc-linux-gnu. gcc/fortran/ChangeLog: 2018-02-01 Janne Blomqvist PR fortran/83705 * simplify.c (gfc_simplify_repeat): Increase limit for deferring to runtime, print a warning message. gcc/testsuite/ChangeLog: 2018-02-01 Janne Blomqvist PR fortran/83705 * gfortran.dg/repeat_7.f90: Catch warning message. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@257281 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/fortran/ChangeLog | 6 ++++++ gcc/fortran/simplify.c | 12 ++++++++---- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gfortran.dg/repeat_7.f90 | 2 +- 4 files changed, 20 insertions(+), 5 deletions(-) diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 649ddd8033a..6f6a21a413c 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2018-02-01 Janne Blomqvist + + PR fortran/83705 + * simplify.c (gfc_simplify_repeat): Increase limit for deferring + to runtime, print a warning message. + 2018-01-31 Jakub Jelinek PR fortran/84116 diff --git a/gcc/fortran/simplify.c b/gcc/fortran/simplify.c index 2458956055b..324f85881c5 100644 --- a/gcc/fortran/simplify.c +++ b/gcc/fortran/simplify.c @@ -6121,12 +6121,16 @@ gfc_simplify_repeat (gfc_expr *e, gfc_expr *n) len = e->value.character.length; gfc_charlen_t nlen = ncop * len; - /* Here's a semi-arbitrary limit. If the string is longer than 32 MB - (8 * 2**20 elements * 4 bytes (wide chars) per element) defer to + /* Here's a semi-arbitrary limit. If the string is longer than 1 GB + (2**28 elements * 4 bytes (wide chars) per element) defer to runtime instead of consuming (unbounded) memory and CPU at compile time. */ - if (nlen > 8388608) - return NULL; + if (nlen > 268435456) + { + gfc_warning_now (0, "Evaluation of string longer than 2**28 at %L" + " deferred to runtime, expect bugs", &e->where); + return NULL; + } result = gfc_get_character_expr (e->ts.kind, &e->where, NULL, nlen); for (size_t i = 0; i < (size_t) ncop; i++) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c6741d8c842..778ba75498d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-02-01 Janne Blomqvist + + PR fortran/83705 + * gfortran.dg/repeat_7.f90: Catch warning message. + 2018-01-31 Rainer Orth * lib/target-supports.exp (check_effective_target_comdat_group): diff --git a/gcc/testsuite/gfortran.dg/repeat_7.f90 b/gcc/testsuite/gfortran.dg/repeat_7.f90 index 82f8dbf4dea..80a25066c43 100644 --- a/gcc/testsuite/gfortran.dg/repeat_7.f90 +++ b/gcc/testsuite/gfortran.dg/repeat_7.f90 @@ -4,5 +4,5 @@ ! compile time. program p character, parameter :: z = 'z' - print *, repeat(z, huge(1_4)) + print *, repeat(z, huge(1_4)) ! { dg-warning "Evaluation of string" } end program p -- 2.11.4.GIT