aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Koenig <tkoenig@gcc.gnu.org>2018-02-19 18:21:45 +0000
committerThomas Koenig <tkoenig@gcc.gnu.org>2018-02-19 18:21:45 +0000
commitd48fc34a45248f83f3d00b1ba7d8ec46854702c8 (patch)
tree8911af3884db63e3c5cc087dcd54215f4f0be8d1
parent87e8aa3bd9787cf64314e41ee5b5261b389ad060 (diff)
re PR fortran/35339 (Improve translation of implied do loop in transfer)
2018-02-19 Thomas Koenig <tkoenig@gcc.gnu.org> PR fortran/35339 * frontend-passes.c (traverse_io_block): Remove workaround for PR 80945. 2018-02-19 Thomas Koenig <tkoenig@gcc.gnu.org> PR fortran/35339 * gfortran.dg/implied_do_io_4.f90: New test. From-SVN: r257814
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/frontend-passes.c7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/implied_do_io_4.f9022
4 files changed, 33 insertions, 7 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index e75361b6360..32646ebf8f7 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,9 @@
+2018-02-19 Thomas Koenig <tkoenig@gcc.gnu.org>
+
+ PR fortran/35339
+ * frontend-passes.c (traverse_io_block): Remove workaround for
+ PR 80945.
+
2018-02-19 Andre Vehreschild <vehre@gcc.gnu.org>
* gfortran.texi: Document additional src/dst_type. Fix some typos.
diff --git a/gcc/fortran/frontend-passes.c b/gcc/fortran/frontend-passes.c
index d07d142faa4..1ffd27d686a 100644
--- a/gcc/fortran/frontend-passes.c
+++ b/gcc/fortran/frontend-passes.c
@@ -1162,14 +1162,7 @@ traverse_io_block (gfc_code *code, bool *has_reached, gfc_code *prev)
gcc_assert (curr->op == EXEC_TRANSFER);
- /* FIXME: Workaround for PR 80945 - array slices with deferred character
- lenghts do not work. Remove this section when the PR is fixed. */
e = curr->expr1;
- if (e->expr_type == EXPR_VARIABLE && e->ts.type == BT_CHARACTER
- && e->ts.deferred)
- return false;
- /* End of section to be removed. */
-
ref = e->ref;
if (!ref || ref->type != REF_ARRAY || ref->u.ar.codimen != 0 || ref->next)
return false;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index ef615a4eeca..7f989013c90 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2018-02-19 Thomas Koenig <tkoenig@gcc.gnu.org>
+
+ PR fortran/35339
+ * gfortran.dg/implied_do_io_4.f90: New test.
+
2018-02-19 Andre Vehreschild <vehre@gcc.gnu.org>
* gfortran.dg/coarray_alloc_comp_6.f08: New test.
diff --git a/gcc/testsuite/gfortran.dg/implied_do_io_4.f90 b/gcc/testsuite/gfortran.dg/implied_do_io_4.f90
new file mode 100644
index 00000000000..4b484d7d500
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/implied_do_io_4.f90
@@ -0,0 +1,22 @@
+! { dg-do run }
+! { dg-additional-options "-ffrontend-optimize -fdump-tree-original" }
+! PR fortran/35339 - make sure that I/O of an implied DO loop
+! of allocatable character arrays a) works and b) is converted
+! to a transfer_array
+program main
+ implicit none
+ integer:: i
+ integer, parameter:: N = 10
+ character(len=:), dimension(:),allocatable:: ca
+ allocate(character(len=N):: ca(3))
+ open(unit=10,status="scratch")
+ ca(1) = "foo"
+ ca(2) = "bar"
+ ca(3) = "xyzzy"
+ write (10, '(3A10)') (ca(i),i=1,3)
+ rewind (10)
+ ca(:) = ''
+ read (10, '(3A10)') (ca(i),i=1,3)
+ if (ca(1) /= 'foo' .or. ca(2) /= 'bar' .or. ca(3) /= 'xyzzy') call abort
+end program
+! { dg-final { scan-tree-dump-times "_gfortran_transfer_array" 2 "original" } }