summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortkoenig <tkoenig@138bc75d-0d04-0410-961f-82ee72b054a4>2018-02-22 18:52:21 +0000
committertkoenig <tkoenig@138bc75d-0d04-0410-961f-82ee72b054a4>2018-02-22 18:52:21 +0000
commit8ae37e7060102bd3b03e20d859348aed2054d06f (patch)
tree421d6fc0ca4290eca81578e119b67eed03fb067f
parent5fc08e2f2e7c15b1d2d8a1d8ace5f93e24af7e1a (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/fortran/frontend-passes.c25
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gfortran.dg/realloc_on_assign_29.f9013
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