re PR fortran/81296 (derived type I/o problem)
authorJerry DeLisle <jvdelisle@gcc.gnu.org>
Tue, 22 Aug 2017 01:02:15 +0000 (01:02 +0000)
committerJerry DeLisle <jvdelisle@gcc.gnu.org>
Tue, 22 Aug 2017 01:02:15 +0000 (01:02 +0000)
2017-08-21  Jerry DeLisle  <jvdelisle@gcc.gnu.org>

PR fortran/81296
* trans-io.c (get_dtio_proc): Add check for format label and set
formatted flag accordingly. Reorganize the code a little.

* gfortran.dg/dtio_12.f90: Update test.

From-SVN: r251254

gcc/fortran/ChangeLog
gcc/fortran/trans-io.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/dtio_12.f90

index 4a572cfb4ae9251b286d7bc9d9d51c225c8c75a8..1b2b4c9375374f408c63b86d5585c69c5f07559c 100644 (file)
@@ -1,3 +1,9 @@
+2017-08-21  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
+
+       PR fortran/81296
+       * trans-io.c (get_dtio_proc): Add check for format label and set
+       formatted flag accordingly. Reorganize the code a little.
+
 2017-08-16  Thomas Koenig  <tkoenig@gcc.gnu.org>
 
        PR fortran/81116
index c3c56f296238ed6ed4724d32e5bdc6f34eb80822..aa974eb3805661ead84096e17cff25479a0b4a8f 100644 (file)
@@ -2214,18 +2214,24 @@ get_dtio_proc (gfc_typespec * ts, gfc_code * code, gfc_symbol **dtio_sub)
   bool formatted = false;
   gfc_dt *dt = code->ext.dt;
 
-  if (dt && dt->format_expr)
+  if (dt)
     {
-      char *fmt;
-      fmt = gfc_widechar_to_char (dt->format_expr->value.character.string,
-                                 -1);
-      if (strtok (fmt, "DT") != NULL)
+      char *fmt = NULL;
+
+      if (dt->format_label == &format_asterisk)
+       {
+         /* List directed io must call the formatted DTIO procedure.  */
+         formatted = true;
+       }
+      else if (dt->format_expr)
+       fmt = gfc_widechar_to_char (dt->format_expr->value.character.string,
+                                     -1);
+      else if (dt->format_label)
+       fmt = gfc_widechar_to_char (dt->format_label->format->value.character.string,
+                                     -1);
+      if (fmt && strtok (fmt, "DT") != NULL)
        formatted = true;
-    }
-  else if (dt && dt->format_label == &format_asterisk)
-    {
-      /* List directed io must call the formatted DTIO procedure.  */
-      formatted = true;
+
     }
 
   if (ts->type == BT_CLASS)
index b3466cdf7af4f8e5fd81f460e6a313e521ba54d8..ed19baca4046edf2ff10afb31bda80240d6dbda9 100644 (file)
@@ -1,3 +1,8 @@
+2017-08-21  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
+
+       PR fortran/81296
+       * gfortran.dg/dtio_12.f90: Update test.
+
 2017-08-21  Nathan Sidwell  <nathan@acm.org>
 
        * g++.dg/template/pr81899.C: Fix c++03.
index 213f7ebbb1eee5ed33ec75c8c4a65ec26aebb6e7..cf1bfe38e2f6690c11a3f9978e69851dd405b0e8 100644 (file)
@@ -67,6 +67,12 @@ end module
   if (trim (msg) .ne. "42") call abort
   rewind (10)
   write (10,"(DT)") child (77)                         ! The original testcase
+  rewind (10)
+  read (10, *) msg
+  if (trim (msg) .ne. "77") call abort
+  rewind (10)
+  write (10,40) child (77)                         ! Modified using format label
+40 format(DT)
   rewind (10)
   read (10, *) msg
   if (trim (msg) .ne. "77") call abort