aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Thomas <pault@gcc.gnu.org>2018-09-29 17:17:09 +0000
committerPaul Thomas <pault@gcc.gnu.org>2018-09-29 17:17:09 +0000
commit29a94bf97da148775cedb260ca8581be9cc2bacd (patch)
tree3db1412bb47145048bd7de1b5f99b5fe113c35a1
parent7d583f4259a56c9054c28e883c375f9c57f8755d (diff)
downloadgcc-29a94bf97da148775cedb260ca8581be9cc2bacd.zip
gcc-29a94bf97da148775cedb260ca8581be9cc2bacd.tar.gz
gcc-29a94bf97da148775cedb260ca8581be9cc2bacd.tar.bz2
re PR fortran/65677 (Incomplete assignment on deferred-length character variable)
2018-09-29 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-29 Paul Thomas <pault@gcc.gnu.org> PR fortran/65667 * gfortran.dg/dependency_52.f90 : New test. From-SVN: r264715
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/trans-expr.c6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/dependency_52.f9045
4 files changed, 61 insertions, 1 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 86d0a3e..ffada92 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,9 @@
+2018-09-29 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-25 Martin Liska <mliska@suse.cz>
PR fortran/87394
diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c
index 04210a4..9824848 100644
--- a/gcc/fortran/trans-expr.c
+++ b/gcc/fortran/trans-expr.c
@@ -10207,7 +10207,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;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 2ef07c5..530e7de 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2018-09-29 Paul Thomas <pault@gcc.gnu.org>
+
+ PR fortran/65667
+ * gfortran.dg/dependency_52.f90 : New test.
+
2018-09-29 Jakub Jelinek <jakub@redhat.com>
PR target/87467
diff --git a/gcc/testsuite/gfortran.dg/dependency_52.f90 b/gcc/testsuite/gfortran.dg/dependency_52.f90
new file mode 100644
index 0000000..20c97ca
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/dependency_52.f90
@@ -0,0 +1,45 @@
+! { 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