This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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


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.
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;
 
! { dg-do run }
!
! Test the fix for PR65667, in which the dependency was missed and
! the string length of 'text' was decremented twice. The rhs string
! length is now fixed after the function call so that the dependency
! on the length of 'text' is removed for later evaluations.
!
!Contributed by John  <jwmwalrus@gmail.com>
!
module mod1
    implicit none
contains
    subroutine getKeyword(string, keyword, rest)
        character(:), allocatable, intent(IN) :: string
        character(:), allocatable, intent(OUT) :: keyword, rest
        integer :: idx
        character(:), allocatable :: text

        keyword = ''
        rest = ''
        text = string
        text = ADJUSTL(text(2:))    ! Note dependency.
        idx = INDEX(text, ' ')

        if (idx == 0) then
            keyword = TRIM(text)
        else
            keyword = text(:idx-1)
            rest = TRIM(ADJUSTL(text(idx+1:)))
        endif
    end subroutine
end module mod1

    use mod1
    implicit none

    character(:), allocatable :: line, keyword, rest

    line = '@HERE    IT IS'

    call getKeyword(line, keyword, rest)

    if (keyword .ne. 'HERE') stop 1
    if (rest .ne. 'IT IS') stop 2
end

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]