diff options
author | Thomas Koenig <tkoenig@gcc.gnu.org> | 2018-06-07 18:13:33 +0000 |
---|---|---|
committer | Thomas Koenig <tkoenig@gcc.gnu.org> | 2018-06-07 18:13:33 +0000 |
commit | f55d5836e4ff7a5749c3d0a15a9e14af0c23968c (patch) | |
tree | ec3d93e6f823fcc65e55f3590457843c40f64fad | |
parent | 3d2f3037d3d1a666fb6d61e7edf7850ae75c00ff (diff) |
2018-06-07 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/85641
Backport from trunk.
* frontend-passes.c (is_fe_temp): Add prototype.
(realloc_string_callback): Early return for frontend-generated
temporary.
2018-06-07 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/85641
Backport from trunk.
* gfortran.dg/realloc_on_assign_30.f90: New test.
git-svn-id: https://gcc.gnu.org/svn/gcc/branches/gcc-7-branch@261289 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/fortran/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/fortran/frontend-passes.c | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/realloc_on_assign_30.f90 | 13 |
4 files changed, 32 insertions, 0 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 4e4aac4c4a5..7bafde9510b 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,11 @@ +2018-06-07 Thomas Koenig <tkoenig@gcc.gnu.org> + + PR fortran/85641 + Backport from trunk. + * frontend-passes.c (is_fe_temp): Add prototype. + (realloc_string_callback): Early return for frontend-generated + temporary. + 2018-06-04 Steven G. Kargl <kargl@gcc.gnu.org> PR fortran/85981 diff --git a/gcc/fortran/frontend-passes.c b/gcc/fortran/frontend-passes.c index d7b4f23fe89..ef1d8f97434 100644 --- a/gcc/fortran/frontend-passes.c +++ b/gcc/fortran/frontend-passes.c @@ -48,6 +48,8 @@ static gfc_code * create_do_loop (gfc_expr *, gfc_expr *, gfc_expr *, locus *, gfc_namespace *, char *vname=NULL); +static bool is_fe_temp (gfc_expr *e); + #ifdef CHECKING_P static void check_locus (gfc_namespace *); #endif @@ -231,6 +233,9 @@ realloc_string_callback (gfc_code **c, int *walk_subtrees ATTRIBUTE_UNUSED, || !expr1->ts.deferred) return 0; + if (is_fe_temp (expr1)) + return 0; + expr2 = gfc_discard_nops (co->expr2); if (expr2->expr_type == EXPR_VARIABLE) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index df89b1f06c9..0e63798b22d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2018-06-07 Thomas Koenig <tkoenig@gcc.gnu.org> + + PR fortran/85641 + Backport from trunk. + * gfortran.dg/realloc_on_assign_30.f90: New test. + 2018-06-07 Richard Biener <rguenther@suse.de> Backport from mainline diff --git a/gcc/testsuite/gfortran.dg/realloc_on_assign_30.f90 b/gcc/testsuite/gfortran.dg/realloc_on_assign_30.f90 new file mode 100644 index 00000000000..4e7eb4ba220 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/realloc_on_assign_30.f90 @@ -0,0 +1,13 @@ +! { dg-do compile } +! PR 85641 - this used to ICE due do infinite recursion. +! Test case by Antony Lewis. +program tester +character(LEN=:), allocatable :: fields +integer j +character(LEN=4), parameter :: CMB_CL_Fields = 'TEBP' + +fields = '' +j=1 +fields = fields // CMB_CL_Fields(j:j) + +end program tester |