Commit b68a9f34 by Thomas Koenig

re PR fortran/81116 (Last character of allocatable-length string reset to blank in an assigment)

2017-08-16  Thomas Koenig  <tkoenig@gcc.gnu.org>

	PR fortran/81116
	* frontend-passes.c (realloc_string_callback): If expression is a
	concatenation, also check for dependency.
	(constant_string_length): Check for presence of symtree.

2017-08-16  Thomas Koenig  <tkoenig@gcc.gnu.org>

	PR fortran/81116
	* gfortran.dg/realloc_on_assignment_29.f90:  New test.

From-SVN: r251125
parent adb5b54b
2017-08-16 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/81116
* frontend-passes.c (realloc_string_callback): If expression is a
concatenation, also check for dependency.
(constant_string_length): Check for presence of symtree.
2017-08-13 Thomas Koenig <tkoenig@gcc.gnu.org>
* gfortran.texi: Document format of unformatted sequential files.
......
......@@ -238,9 +238,9 @@ 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;
if (expr2->expr_type == EXPR_VARIABLE)
{
found_substr = false;
for (ref = expr2->ref; ref; ref = ref->next)
{
......@@ -252,6 +252,10 @@ realloc_string_callback (gfc_code **c, int *walk_subtrees ATTRIBUTE_UNUSED,
}
if (!found_substr)
return 0;
}
else if (expr2->expr_type != EXPR_OP
|| expr2->value.op.op != INTRINSIC_CONCAT)
return 0;
if (!gfc_check_dependency (expr1, expr2, true))
return 0;
......@@ -625,7 +629,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);
......
2017-08-16 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/81116
* gfortran.dg/realloc_on_assignment_29.f90: New test.
2017-08-16 Uros Bizjak <ubizjak@gmail.com>
PR target/46091
......
! { 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') call abort
end program test10
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment