diff options
author | tkoenig <tkoenig@138bc75d-0d04-0410-961f-82ee72b054a4> | 2018-02-22 18:52:21 +0000 |
---|---|---|
committer | tkoenig <tkoenig@138bc75d-0d04-0410-961f-82ee72b054a4> | 2018-02-22 18:52:21 +0000 |
commit | 8ae37e7060102bd3b03e20d859348aed2054d06f (patch) | |
tree | 421d6fc0ca4290eca81578e119b67eed03fb067f | |
parent | 5fc08e2f2e7c15b1d2d8a1d8ace5f93e24af7e1a (diff) | |
download | gcc-8ae37e7060102bd3b03e20d859348aed2054d06f.tar.gz |
2018-02-22 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/81116
PR fortran/84495
Backport from trunk
* frontend-passes.c (realloc_string_callback): If expression is a
concatenation, also check for dependency.
(constant_string_length): Check for presence of symtree.
2018-02-22 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/81116
PR fortran/84495
* gfortran.dg/realloc_on_assignment_29.f90: New test.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-7-branch@257912 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/fortran/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/fortran/frontend-passes.c | 25 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/realloc_on_assign_29.f90 | 13 |
4 files changed, 40 insertions, 10 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index a4636ebedd1..3039cd31f73 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2018-02-22 Thomas Koenig <tkoenig@gcc.gnu.org> + + PR fortran/81116 + PR fortran/84495 + * gfortran.dg/realloc_on_assignment_29.f90: New test. + 2018-02-19 Jerry DeLisle <jvdelisle@gcc.gnu.org> Backport from trunk diff --git a/gcc/fortran/frontend-passes.c b/gcc/fortran/frontend-passes.c index 6faa2365f1a..8a5829a3358 100644 --- a/gcc/fortran/frontend-passes.c +++ b/gcc/fortran/frontend-passes.c @@ -232,21 +232,25 @@ realloc_string_callback (gfc_code **c, int *walk_subtrees ATTRIBUTE_UNUSED, return 0; expr2 = gfc_discard_nops (co->expr2); - if (expr2->expr_type != EXPR_VARIABLE) - return 0; - found_substr = false; - for (ref = expr2->ref; ref; ref = ref->next) + if (expr2->expr_type == EXPR_VARIABLE) { - if (ref->type == REF_SUBSTRING) + found_substr = false; + for (ref = expr2->ref; ref; ref = ref->next) { - found_substr = true; - break; + if (ref->type == REF_SUBSTRING) + { + found_substr = true; + break; + } } + if (!found_substr) + return 0; } - if (!found_substr) + else if (expr2->expr_type != EXPR_OP + || expr2->value.op.op != INTRINSIC_CONCAT) return 0; - + if (!gfc_check_dependency (expr1, expr2, true)) return 0; @@ -619,7 +623,8 @@ constant_string_length (gfc_expr *e) /* Return length of char symbol, if constant. */ - if (e->symtree->n.sym->ts.u.cl && e->symtree->n.sym->ts.u.cl->length + if (e->symtree && e->symtree->n.sym->ts.u.cl + && e->symtree->n.sym->ts.u.cl->length && e->symtree->n.sym->ts.u.cl->length->expr_type == EXPR_CONSTANT) return gfc_copy_expr (e->symtree->n.sym->ts.u.cl->length); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index dd9e5675f70..45696fb4960 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2018-02-22 Thomas Koenig <tkoenig@gcc.gnu.org> + + PR fortran/81116 + PR fortran/84495 + * gfortran.dg/realloc_on_assignment_29.f90: New test. + 2017-02-22 Sudakshina Das <sudi.das@arm.com> Backport from mainline: diff --git a/gcc/testsuite/gfortran.dg/realloc_on_assign_29.f90 b/gcc/testsuite/gfortran.dg/realloc_on_assign_29.f90 new file mode 100644 index 00000000000..a9160660280 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/realloc_on_assign_29.f90 @@ -0,0 +1,13 @@ +! { dg-do run } +! PR fortran/81116 +! The assignment was broken due to a missing temporary. +! Original test case by Clive Page. + +program test10 + implicit none + character(:), allocatable :: string + ! + string = '1234567890' + string = string(1:5) // string(7:) + if (string /= '123457890') STOP 1 +end program test10 |