* [Patch, fortran] PR65677 - Incomplete assignment on deferred-length character variable
@ 2018-09-23 12:27 Paul Richard Thomas
2018-09-23 16:47 ` Janne Blomqvist
0 siblings, 1 reply; 3+ messages in thread
From: Paul Richard Thomas @ 2018-09-23 12:27 UTC (permalink / raw)
To: fortran, gcc-patches
[-- Attachment #1: Type: text/plain, Size: 578 bytes --]
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.
[-- Attachment #2: submit.diff --]
[-- Type: text/x-patch, Size: 712 bytes --]
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;
[-- Attachment #3: dependency_52.f90 --]
[-- Type: text/x-fortran, Size: 1188 bytes --]
! { 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
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [Patch, fortran] PR65677 - Incomplete assignment on deferred-length character variable
2018-09-23 12:27 [Patch, fortran] PR65677 - Incomplete assignment on deferred-length character variable Paul Richard Thomas
@ 2018-09-23 16:47 ` Janne Blomqvist
0 siblings, 0 replies; 3+ messages in thread
From: Janne Blomqvist @ 2018-09-23 16:47 UTC (permalink / raw)
To: Paul Richard Thomas; +Cc: Fortran List, GCC Patches
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.
--
Janne Blomqvist
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [Patch, fortran] PR65677 - Incomplete assignment on deferred-length character variable
@ 2018-09-30 18:11 Dominique d'Humières
0 siblings, 0 replies; 3+ messages in thread
From: Dominique d'Humières @ 2018-09-30 18:11 UTC (permalink / raw)
To: Paul Richard Thomas; +Cc: gfortran, gcc-patches
Hi Paul,
First your patch has been committed with wrong entry: 65667 instead of 65677.
Second, I suspect it is responsible of the following ICE:
% gfc pr72755.f90 -fno-range-check
pr72755.f90:1485:0:
1485 | this%buffer = transfer( c(start:iend), this%buffer )
|
internal compiler error: in gfc_dep_resolver, at fortran/dependency.c:2257
and
% gfc pr64125_db.f90
pr64125_db.f90:20:0:
20 | left%chars = transfer( right, left%chars )
|
internal compiler error: in gfc_dep_resolver, at fortran/dependency.c:2257
for
module test
type t_string
private
character(len=:), allocatable :: chars
end type t_string
contains
pure subroutine string_assign_from_array( left, right )
! The target string
type(t_string), intent(out) :: left
! The source string
character, dimension(:), intent(in) :: right
! Copy memory
allocate( character(len=size(right)) :: left%chars )
left%chars = transfer( right, left%chars )
end subroutine string_assign_from_array
end module test
Cheers,
Dominique
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2018-09-30 17:16 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-09-23 12:27 [Patch, fortran] PR65677 - Incomplete assignment on deferred-length character variable Paul Richard Thomas
2018-09-23 16:47 ` Janne Blomqvist
2018-09-30 18:11 Dominique d'Humières
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).