diff mbox series

[fortran] PR65677 - Incomplete assignment on deferred-length character variable

Message ID CAGkQGiKj1XB7=iy0MuTgNKOgKjfmbd2usWGQTd5UqVVJsjO65g@mail.gmail.com
State New
Headers show
Series [fortran] PR65677 - Incomplete assignment on deferred-length character variable | expand

Commit Message

Paul Richard Thomas Sept. 23, 2018, 11:57 a.m. UTC
This is yet another deferred character length problem that this time
is caused by a dependency in assignment between lhs and rhs
string_lengths. The comment in the testcase explains all.

Bootstraps and regtests on FC21/x86_64 - OK for trunk and 8-branch?

I cannot commit until next week.

Paul

2018-09-23  Paul Thomas  <pault@gcc.gnu.org>

    PR fortran/65667
    * trans-expr.c (gfc_trans_assignment_1): If there is dependency
    fix the rse stringlength.

2018-09-23  Paul Thomas  <pault@gcc.gnu.org>

    PR fortran/65667
    * gfortran.dg/dependency_52.f90 : New test.

Comments

Janne Blomqvist Sept. 23, 2018, 4:09 p.m. UTC | #1
On Sun, Sep 23, 2018 at 2:57 PM Paul Richard Thomas <
paul.richard.thomas@gmail.com> wrote:

> This is yet another deferred character length problem that this time
> is caused by a dependency in assignment between lhs and rhs
> string_lengths. The comment in the testcase explains all.
>
> Bootstraps and regtests on FC21/x86_64 - OK for trunk and 8-branch?
>

Ok, thanks.
diff mbox series

Patch

diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c
index 1453828..6a05412 100644
--- a/gcc/fortran/trans-expr.c
+++ b/gcc/fortran/trans-expr.c
@@ -10187,7 +10187,11 @@  gfc_trans_assignment_1 (gfc_expr * expr1, gfc_expr * expr2, bool init_flag,
 	   || TREE_CODE (rse.string_length) == INDIRECT_REF))
     string_length = gfc_evaluate_now (rse.string_length, &rse.pre);
   else if (expr2->ts.type == BT_CHARACTER)
-    string_length = rse.string_length;
+    {
+      if (expr1->ts.deferred && gfc_check_dependency (expr1, expr2, false))
+	rse.string_length = gfc_evaluate_now (rse.string_length, &rse.pre);
+      string_length = rse.string_length;
+    }
   else
     string_length = NULL_TREE;