Commit b093d688 by Paul Thomas

re PR fortran/65677 (Incomplete assignment on deferred-length character variable)

2018-10-01  Paul Thomas  <pault@gcc.gnu.org>

	PR fortran/65677
	* trans-expr.c (gfc_trans_assignment_1): Set the 'identical'
	flag in the call to gfc_check_dependency.


2018-10-01  Paul Thomas  <pault@gcc.gnu.org>

	PR fortran/65677
	* gfortran.dg/dependency_52.f90 : Expand the test to check both
	the call to adjustl and direct assignment of the substring.

From-SVN: r264759
parent fd5c626c
2018-10-01 Paul Thomas <pault@gcc.gnu.org>
PR fortran/65677
* trans-expr.c (gfc_trans_assignment_1): Set the 'identical'
flag in the call to gfc_check_dependency.
2018-09-30 Paul Thomas <pault@gcc.gnu.org> 2018-09-30 Paul Thomas <pault@gcc.gnu.org>
PR fortran/87359 PR fortran/87359
...@@ -33,7 +39,7 @@ ...@@ -33,7 +39,7 @@
2018-09-29 Paul Thomas <pault@gcc.gnu.org> 2018-09-29 Paul Thomas <pault@gcc.gnu.org>
PR fortran/65667 PR fortran/65677
* trans-expr.c (gfc_trans_assignment_1): If there is dependency * trans-expr.c (gfc_trans_assignment_1): If there is dependency
fix the rse stringlength. fix the rse stringlength.
......
...@@ -10208,7 +10208,7 @@ gfc_trans_assignment_1 (gfc_expr * expr1, gfc_expr * expr2, bool init_flag, ...@@ -10208,7 +10208,7 @@ gfc_trans_assignment_1 (gfc_expr * expr1, gfc_expr * expr2, bool init_flag,
string_length = gfc_evaluate_now (rse.string_length, &rse.pre); string_length = gfc_evaluate_now (rse.string_length, &rse.pre);
else if (expr2->ts.type == BT_CHARACTER) else if (expr2->ts.type == BT_CHARACTER)
{ {
if (expr1->ts.deferred && gfc_check_dependency (expr1, expr2, false)) if (expr1->ts.deferred && gfc_check_dependency (expr1, expr2, true))
rse.string_length = gfc_evaluate_now (rse.string_length, &rse.pre); rse.string_length = gfc_evaluate_now (rse.string_length, &rse.pre);
string_length = rse.string_length; string_length = rse.string_length;
} }
......
2018-10-01 Paul Thomas <pault@gcc.gnu.org>
PR fortran/65677
* gfortran.dg/dependency_52.f90 : Expand the test to check both
the call to adjustl and direct assignment of the substring.
2018-10-01 Richard Biener <rguenther@suse.de> 2018-10-01 Richard Biener <rguenther@suse.de>
PR tree-optimization/87465 PR tree-optimization/87465
......
! { dg-do run } ! { dg-do run }
! !
! Test the fix for PR65667, in which the dependency was missed and ! Test the fix for PR65677, in which the dependency was missed and
! the string length of 'text' was decremented twice. The rhs string ! the string length of 'text' was decremented twice. The rhs string
! length is now fixed after the function call so that the dependency ! length is now fixed after the function call so that the dependency
! on the length of 'text' is removed for later evaluations. ! on the length of 'text' is removed for later evaluations.
...@@ -10,16 +10,21 @@ ...@@ -10,16 +10,21 @@
module mod1 module mod1
implicit none implicit none
contains contains
subroutine getKeyword(string, keyword, rest) subroutine getKeyword(string, keyword, rest, use_adjustl)
character(:), allocatable, intent(IN) :: string character(:), allocatable, intent(IN) :: string
character(:), allocatable, intent(OUT) :: keyword, rest character(:), allocatable, intent(OUT) :: keyword, rest
integer :: idx integer :: idx
character(:), allocatable :: text character(:), allocatable :: text
logical :: use_adjustl
keyword = '' keyword = ''
rest = '' rest = ''
text = string text = string
if (use_adjustl) then
text = ADJUSTL(text(2:)) ! Note dependency. text = ADJUSTL(text(2:)) ! Note dependency.
else
text = text(2:) ! Check the old workaround.
endif
idx = INDEX(text, ' ') idx = INDEX(text, ' ')
if (idx == 0) then if (idx == 0) then
...@@ -38,8 +43,17 @@ end module mod1 ...@@ -38,8 +43,17 @@ end module mod1
line = '@HERE IT IS' line = '@HERE IT IS'
call getKeyword(line, keyword, rest) call getKeyword(line, keyword, rest, use_adjustl = .true.)
if (keyword .ne. 'HERE') stop 1 if (keyword .ne. 'HERE') stop 1
if (rest .ne. 'IT IS') stop 2 if (rest .ne. 'IT IS') stop 2
deallocate (line, keyword, rest)
line = '@HERE IT IS'
call getKeyword(line, keyword, rest, use_adjustl = .false.)
if (keyword .ne. 'HERE') stop 3
if (rest .ne. 'IT IS') stop 4
deallocate (line, keyword, rest)
end end
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